Skip To Content

Beispiel: In einer Textdatei aufgelistete Ordner und Datenbanken registrieren

Dieses Beispielskript verwendet eine Textdatei mit einer Liste der Ordner und Datenbanken, die Sie bei einer ArcGIS Server-Site registrieren möchten. Sie können Datenbanken und Ordner über ArcGIS Pro oder über das ArcGIS Enterprise-Portal bei verbundenen ArcGIS Server-Sites und über ArcGIS Pro oder ArcGIS Server Manager bei eigenständigen ArcGIS Server-Sites registrieren. Allerdings ist die Verwendung dieses Skripts möglicherweise schneller, wenn Sie viele Datenquellenspeicherorte registrieren müssen.

Tipp:

Unter Datenquellen für ArcGIS Server werden die Gründe für die Registrierung von Datenspeicherorten bei einer ArcGIS Server-Site erläutert.

Legen Sie folgende Struktur für die Eingabetextdatei fest:

#dsName|dsType|serverPath|clientPath|hostname

dsName=<data store name>|dsType={FOLDER | DATABASE}|serverPath=<path to folder or database connection file used by the ArcGIS Server site>|clientPath=<path to folder or database connection file used by the publishing client>

  • dsName: Ein Name für das Data-Store-Element. Dies kann ein beliebiger Name sein.
  • dsType: Der Typ des zu registrierenden Data-Store-Elements. In diesem Beispiel können Sie ORDNER oder DATENBANK verwenden.
  • serverPath: Der Pfad zu den Daten, wie er auf dem Servercomputer angezeigt wird.
  • clientPath: Der Pfad zu den Daten, wie er auf den Computern der Publisher angezeigt wird. Erfolgen keine Angaben, wird der Serverpfad verwendet. Wenn Sie das Schlüsselwort managed angeben, wird dieses Data-Store-Element als verwaltete Datenbank der ArcGIS Server-Site registriert.
  • hostname: Der Name des Publisher-Computers. Dieser wird nur benötigt, wenn der clientPath ein ordnerbasierter Pfad ist. Wenn diese Eigenschaft weggelassen wird, wird der Name des Computers verwendet, auf dem das Skript ausgeführt wird.

In diesem Beispiel werden zwei Ordnerpfade und zwei Datenbankverbindungsdateien in der Textdatei aufgeführt. Der zweite Ordnerpfad (testData) weist einen anderen Speicherort für die ArcGIS Server-Site und den lokalen ArcGIS-Client auf.

#dsName|dsType|serverPath|clientPath|hostname

dsName=sharedData|dsType=FOLDER|serverPath=\\sharedserver\data|clientPath=\\sharedserver\data
dsName=testData|dsType=FOLDER|serverPath=\\test_server\data|clientPath=c:\mydata|hostname=qalab_publisher
dsName=entGeodatabase|dsType=DATABASE|serverPath=C:\data\db_connections\Connection to enterprisegdb1.sde|clientPath=C:\data\db_Connections\Connection to enterprisegdb1.sde
dsName=spatialDatabase|dsType=DATABASE|serverPath=C:\data\db_Connections\Connection to projectdb.sde|clientPath=C:\data\db_Connections\Connection to projectdb.sde

Im folgenden Beispielskript werden Sie zur Eingabe von Verbindungsinformationen für die ArcGIS Server-Site aufgefordert, um eine ArcGIS Server-Verbindungsdatei zu erstellen. Außerdem werden Sie zur Angabe des Speicherorts der Textdatei mit der Liste der Datenquellen aufgefordert, und die Datenquellen in der Datei werden bei der ArcGIS Server-Site registriert.

import sys
import os
import getpass
import arcpy
import codecs


def main(argv=None):
    
    # Ask for admin user name and password
    
    username = input("Enter user name: ")
    password = getpass.getpass("Enter password: ")
    
    # Ask for server name & port
    serverName = input("Enter server name: ")
    serverPort = 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 as e:
        print(e)
    
    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 = 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 as e:
            print("Adding of the datastore: " + datastoresDict[datastoreToAdd]['connection_name'] + " failed.")
            print(e)

if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))