Skip To Content

Exemple : inscrire des dossiers et des bases de données répertoriés dans un fichier texte

Cet exemple de script utilise une liste au format de fichier texte des dossiers et bases de données que vous souhaitez inscrire auprès d’un site ArcGIS Server. Bien que vous puissiez inscrire des bases de données et des dossiers auprès de sites ArcGIS Server fédérés via ArcGIS Pro ou le portail ArcGIS Enterprise et inscrire des bases de données et des dossiers auprès de sites ArcGIS Server autonomes via ArcGIS Pro ou ArcGIS Server Manager, utilisez ce script pour procéder plus rapidement si vous devez inscrire de nombreux emplacements de sources de données.

Conseil :

Reportez-vous à la rubrique Sources de données pour ArcGIS Server pour plus d’informations sur les raisons pour lesquelles inscrire des emplacements de données auprès d’un site ArcGIS Server.

Structurez le fichier de texte en entrée comme suit :

#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 : nom de l’élément du data store. Il peut s’agir d’un nom quelconque.
  • dsType : type de l’élément du data store que vous inscrivez. Dans cet exemple, vous pouvez utiliser FOLDER ou DATABASE.
  • serverPath : chemin d’accès aux données perçu par la machine serveur.
  • clientPath : chemin d’accès aux données perçu par les machines de l’éditeur. S'il n'est pas indiqué, le chemin d'accès au serveur sera utilisé. Si vous indiquez le mot-clé managed, cela signifie que vous inscrivez cet élément du data store en tant que base de données gérée du site ArcGIS Server.
  • hostname : nom de la machine de l’éditeur. Il est nécessaire uniquement si la valeur clientPath indique un chemin d’accès basé sur un dossier. Si cette propriété est omise, le nom de la machine qui exécute le script sera utilisé.

Dans cet exemple, deux chemins d’accès à des dossiers et deux fichiers de connexion à des bases de données sont répertoriés dans le fichier texte. Le chemin d’accès au second dossier (testData) est différent pour le site ArcGIS Server et pour le client ArcGIS local.

#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

L’exemple de script suivant vous demande de fournir les informations de connexion pour le site ArcGIS Server afin de créer un fichier de connexion ArcGIS Server. Vous devez également spécifier l’emplacement du fichier texte contenant la liste des sources de données et inscrire les sources de données dans le fichier auprès du site ArcGIS Server.

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:]))