此脚本示例使用要注册到 ArcGIS Server 站点的文件夹和数据库的文本文件列表。尽管您可以使用 Manager 或 ArcMap 注册数据库和文件夹,但如果您有多个要注册的位置,使用此脚本将会加快注册速度。
输入文件应具有如下所示的结构:
#dsName|dsType|serverPath|clientPath|hostname
dsName=sharedData|dsType=FOLDER|serverPath=C:\data|clientPath=C:\data
dsName=qalab|dsType=FOLDER|serverPath=\\qalab_server\data|clientPath=c:\mydata|hostname=qalab_publisher
dsName=pebbles|dsType=DATABASE|serverPath=C:\data\SDE_Connections\Connection to pebbles864.sde|clientPath=C:\dataSDE_Connections\Connection to pebbles864.sde
dsName=bedrock|dsType=DATABASE|serverPath=C:\data\SDE_Connections\Connection to bedrock.sde|clientPath=C:\dataSDE_Connections\Connection to armenia.sde
dsName=oaktree|dsType=DATABASE|serverPath=C:\data\SDE_Connections\Connection to oaktree.sde|clientPath=managed
- dsName - 数据存储项目的名称。可以是您提供的任何名称。
- dsType - 要注册的数据存储项目的类型。在此示例中,可以使用 FOLDER 或 DATABASE。
- serverPath - 服务器计算机查看数据的路径。
- clientPath - 发布者计算机查看数据的路径。如果未提供该路径,则将使用服务器路径。如果您提供关键字 managed,则表示要将此数据存储项目注册为 ArcGIS Server 站点管理的数据库。
- hostname - 发布者计算机的名称。仅在 clientPath 为基于文件夹的路径时需要此名称。如果忽略该属性,则将使用正在运行脚本的计算机的名称。
在使用此脚本前,最好阅读关于将数据注册到 ArcGIS Server。
import sys,os
import getpass
import arcpy
import codecs
def main(argv=None):
# Ask for admin user name and password
username = raw_input("Enter user name: ")
password = getpass.getpass("Enter password: ")
# Ask for server name & port
serverName = raw_input("Enter server name: ")
serverPort = raw_input("Enter server port: ")
# Create a connection file to the server and save it in the same location as that of the script
serverURL="http://"+serverName+":"+str(serverPort)+"/arcgis/admin"
try:
arcpy.mapping.CreateGISServerConnectionFile("PUBLISH_GIS_SERVICES",os.curdir,serverName+".ags",serverURL,"ARCGIS_SERVER",username=username,password=password)
except Exception, e:
print e.message
agsConnection = os.path.join(os.curdir, serverName+".ags")
if not os.path.isfile(agsConnection):
print("Unable to connect to ArcGIS Server. Exiting.")
sys.exit(1)
# Input File that contains the data store information
dataStoresFile = raw_input("Path to pipe-delimited text file containing datastore information: ")
num = 0
datastores = {}
for datastoreRow in readlinesFromInputFile(dataStoresFile):
datastoreEntry = {}
for index in range(len(datastoreRow)):
datastoreProp = datastoreRow[index].split("=")
if datastoreProp[0] == "dsName":
datastoreEntry["connection_name"] = datastoreProp[1]
if datastoreProp[0] == "dsType":
datastoreEntry["datastore_type"] = datastoreProp[1]
if datastoreProp[0] == "serverPath":
datastoreEntry["server_path"] = datastoreProp[1]
if datastoreProp[0] == "clientPath":
datastoreEntry["client_path"] = datastoreProp[1]
if datastoreProp[0] == "hostname":
datastoreEntry["hostname"] = datastoreProp[1]
# Add the datastore information to a dictionary
datastores["datastore" + str(num)] = datastoreEntry
num +=1
# Call helper functions to register datastores
addDataStores(datastores,agsConnection)
# A function that reads lines from the input file
def readlinesFromInputFile(filename, delim='|'):
file = codecs.open(filename,'r','utf-8-sig')
for line in file.readlines():
# Remove the trailing whitespaces and the newline characters
line = line.rstrip()
if line.startswith('#') or len(line) == 0:
pass # Skip the lines that contain # at the beginning or any empty lines
else:
# Split the current line into list
yield line.split(delim)
file.close()
def addDataStores(datastoresDict,agsConnection):
for datastoreToAdd in datastoresDict:
# Build the dictionary with the role name and description
datastoresDict[datastoreToAdd]["connection_file"] = agsConnection
print "Adding the datastore: " + datastoresDict[datastoreToAdd]['connection_name']
try:
arcpy.AddDataStoreItem(**datastoresDict[datastoreToAdd])
print "Successfully added the datastore: " + datastoresDict[datastoreToAdd]['connection_name']
except Exception, e:
print "Adding of the datastore: " + datastoresDict[datastoreToAdd]['connection_name'] + " failed."
print e.message
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))