Suite

Erreur de syntaxe du script de re-projection par lots

Erreur de syntaxe du script de re-projection par lots


import arcpy sourceWorkspace = "C:Users	x8p90DesktopLesson2" targetProjection = "C:Users	x8p90Desktoppython excercise dataLesson1contourlines.shp" listDataSet = arcpy.ListDatasets(sourceWorkspace) essayez : pour x dans listDataSet : outputDataset = sourceWorkspace + "projected_" + x arcpy.Project_management(x, outputDataset, targetProjection) print "Reprojection réussie" sauf : print arcpy.GetMessages() print "failed "

J'ai commencé à apprendre Python pour ArcGIS la semaine dernière et j'ai un script simple pour reprojeter tous les jeux de données dans un dossier. Le script dit "erreur de syntaxe - syntaxe invalide" mais je ne trouve rien. Quelqu'un peut-il s'il vous plaît jeter un oeil? Cela semble quelque chose de très basique mais je suis assez nouveau donc je ne le vois pas pour le moment. L'exécution également dans ArcGIS imprime "échoué" tout de suite. Et les fichiers sont en place dans les bons dossiers. J'ai déjà vérifié.

Éditer:

Ok, au moins l'erreur de syntaxe a disparu en réécrivant simplement le code en supprimant ces 3 points au début de chaque ligne. Mais j'obtiens toujours "Échec" en sortie.


listDataSet et listDataset sont deux objets différents (les majuscules sont importantes en Python). Il recherche tous les 'x' dans 'listDataset', mais 'listDataset' n'existe pas ('listDataSet' existe, cependant. Essayez ça).


Utilisez décrire l'objet et obtenez une référence spatiale (SR) à partir de celui-ci. Spécifiez-le comme projection cible dans l'outil, par ex.

d=arcpy.Describe(LayerWithTargetProjection) SR=d.spatialReference arcpy.Project_management(input_features, output_feature_class, SR)

Bon alors j'ai enfin compris. C'était une erreur stupide de ma part. Les fichiers que j'avais dans les dossiers spécifiés étaient en fait des classes d'entités et non des jeux de données. De toute façon, il n'est pas possible de créer un jeu de données dans un dossier. Cela ne peut être fait qu'à l'intérieur d'une géodatabase. Donc, pour quelqu'un qui connaît ArcGIS, il aurait pu remarquer que j'avais juste un dossier dans le code mais j'appelaisListDataSets()fonction qui est fausse. En utilisantListFeatureClasses()résolu le problème et les fichiers ont été correctement reprojetés. Merci pour toutes les entrées.


Tout d'abord, lisez la réponse sur Pourquoi aucune chaîne n'est-elle sortie avec « echo %var% » après avoir utilisé « set var = text » sur la ligne de commande ? Il explique comment affecter une valeur de chaîne correcte à une variable d'environnement. Mauvais est défini variable = valeur qui attribue ESPACE valeur à une variable d'environnement avec le nom variable SPACE et pour cette raison il n'y a pas de variable d'environnement avec le nom variable après cette ligne de commande.

Complètement faux est dans la plupart des cas également défini %variable%=value en raison de cette ligne de commande attribue valeur à une variable d'environnement avec un nom défini par valeur de la variable d'environnement variable.

Deuxièmement, toutes les références de variables d'environnement effectuées avec la syntaxe %variable% dans un bloc de commande commençant par ( et se terminant par correspondance ) sont étendues par la valeur actuelle de la variable d'environnement avant que la commande utilisant le bloc de commande ne soit exécutée. Cela signifie que tous les %variable% sont remplacés par la valeur actuelle de la variable d'environnement référencée qui n'est rien si la variable portant le nom variable n'est pas encore défini du tout.

Regardons ce qui est réellement exécuté par cmd.exe pour un bloc de commande comme :

Les lignes de commande réellement exécutées sont :

Le résultat est une sortie d'exécution du fichier batch par cmd.exe avec le message d'erreur :

Cela peut être vu en exécutant le fichier batch sans @echo off ou avec @echo ON à partir d'une fenêtre d'invite de commande au lieu de double-cliquer sur le fichier batch. Voir aussi débogage d'un fichier batch.

Un programmeur de fichiers batch doit toujours tenir compte de la manière dont les lignes de commande sont réellement exécutées après traiter les lignes dans le script batch et non comment elles sont écrites dans le fichier batch, notamment sur l'utilisation de %variable% qui modifie dynamiquement le code lors de l'exécution du script.

Un code de travail pour l'exemple de code en question est :

Ce fichier de commandes configure d'abord un environnement local avec les extensions de commande activées comme requis ici et l'extension de variable d'environnement retardée désactivée car non requise par le code ci-dessous. Les paramètres EnableExtensions DisableDelayedExpansion lors de l'utilisation de la commande setlocal peuvent être omis car les extensions de commande sont activées par défaut et l'expansion retardée est désactivée par défaut au démarrage d'un nouveau processus de commande, comme lors d'un double-clic sur un fichier batch. Mais il est toujours conseillé de définir explicitement l'environnement nécessaire pour un fichier batch. Lisez cette réponse pour plus de détails sur les commandes SETLOCAL et ENDLOCAL.

La ligne suivante affecte la première ligne du fichier a.txt à la variable d'environnement hostname1 si ce fichier existe dans le répertoire actuel qui peut bien sûr être différent du répertoire du fichier batch en fonction de la façon dont le fichier batch a été démarré pour exécution par cmd.exe .

La commande POUR avec l'option /F est généralement utilisé pour lire un fichier texte ligne par ligne et affecter les chaînes lues à partir du fichier aux variables d'environnement. Mais set /P variable=<file.txt peut également être utilisé pour affecter simplement la première ligne de file.xt à la variable d'environnement variable .

La quatrième ligne de commande vérifie si la variable hostname1 est définie maintenant ce qui n'est pas le cas si le fichier a.txt n'existe pas dans le répertoire courant ou que ce fichier commence par une ligne vide. La variable d'environnement hostname1 est définie avec la valeur 0 si elle n'est pas définie après la troisième ligne.

Ensuite, la valeur actuelle de la variable hostname1 est sortie pour une vérification visuelle.

Puis trois SI les conditions sont utilisées pour exécuter des comparaisons de chaînes sensibles à la casse. Les chaînes à comparer sont entourées de guillemets doubles, ce qui rend le fichier batch plus sûr contre la sortie de l'exécution en raison d'une erreur de syntaxe dépendant de la chaîne lue à partir du fichier a.txt . Mais cette solution n'est toujours pas sécurisée à 100%, voir la réponse sur Comment empêcher l'interpréteur de commandes Windows de quitter l'exécution du fichier batch sur une entrée utilisateur incorrecte ? pour plus de détails sur la façon d'obtenir un code de fichier de commandes sans échec lors de l'utilisation de set /P avec une valeur de chaîne saisie par un utilisateur ou lu à partir d'un fichier que chaque utilisateur peut modifier avant d'exécuter le fichier de commandes.

Les valeurs de chaîne attribuées à hostname02 et hostname03 sont fixées dans le code et, par conséquent, ces valeurs de chaîne peuvent être directement écrites également dans le fichier a.txt sans avoir besoin de référencer les variables d'environnement hostname02 et hostname03 définies à l'intérieur des blocs de commande, ce qui nécessiterait une extension retardée des variables d'environnement. .

L'opérateur de redirection >> et le nom du fichier sont écrits au début d'une ligne pour vraiment écrire dans le fichier a.txt juste 1 ou 2 sans espace de fin tant qu'il n'y a pas d'espaces de fin sur les deux lignes de commande echo dans le fichier batch. Lors de l'utilisation de echo 1 >>a.txt, l'espace entre 1 et >> serait également écrit dans le fichier a.txt . Et echo 1>>a.txt n'écrirait pas du tout 1 dans le fichier a.txt . Pour plus de détails, lisez l'article Microsoft sur l'utilisation des opérateurs de redirection de commande. Le processeur de commandes Windows reformate >>a.txt echo 1 en echo 1 1>>a.txt avant l'exécution de cette ligne de commande. Ainsi, >>a.txt au début de la ligne après les espaces de retrait pour une meilleure lisibilité est déplacé par l'interpréteur de commandes Windows lors de l'analyse à la fin de la ligne de commande en insérant un 1 (espace et un) à gauche pour l'opérateur de redirection >> .

Un VBScript est exécuté soit avec cscript.exe – version console de l'hôte de script Windows – soit avec wscript.exe – version GUI de l'hôte de script Windows. La commande APPEL n'est pas la bonne commande pour exécuter un VBScript. Ainsi, le fichier batch utilise wscript.exe pour exécuter le VBScript en affichant juste une simple boîte de message.

Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez-y les commandes suivantes et lisez très attentivement toutes les pages d'aide affichées pour chaque commande.


Définir la commande

L'autre manière dont les variables peuvent être initialisées est via la commande « set ». Voici la syntaxe de la commande set.

Syntaxe

Nom de variable est le nom de la variable que vous souhaitez définir.

valeur est la valeur qui doit être définie par rapport à la variable.

/UNE - Ce commutateur est utilisé si la valeur doit être de nature numérique.

L'exemple suivant montre une manière simple d'utiliser la commande set.

Exemple

Dans l'extrait de code ci-dessus, une variable appelée message est définie et définie avec la valeur "Hello World".

Pour afficher la valeur de la variable, notez que la variable doit être entourée du signe %.

Production

La commande ci-dessus produit la sortie suivante.


3 réponses 3

Je n'ai pas de fichier de 5 Go à tester, donc je ne sais pas si cette solution proposée fonctionnera pour vous. Vos données ne se prêtent peut-être pas à cette solution proposée, mais j'ai pensé l'offrir quand même.

J'ai créé une table appelée SqlCommands

À des fins de test, j'ai utilisé l'assistant de script SSMS pour scripter l'une de mes petites tables (données) en tant qu'« inserts » dans un fichier de test.

J'ai ensuite utilisé un script Powershell pour lire ce fichier de test (qui sont essentiellement des commandes d'insertion SQL dans la table SqlCommands ci-dessus. La table a une colonne d'identité et le script Powershell fait uniquement référence à la colonne 'TextData'. La colonne d'identité ID me permettra de sélectionnez dans ce tableau dans le bon ordre. Voici le script Powershell :

Maintenant, j'ai mon fichier SQL dans une table. J'ai écrit un curseur à sélectionner dans le tableau triant par ID pour m'assurer que j'exécute les commandes dans le bon ordre. Le script du curseur lit chaque ligne de la table SqlCommands et vérifie s'il s'agit d'une instruction 'GO' (les instructions 'GO' ont été automatiquement ajoutées par l'assistant de script lorsque j'ai scripté les données de la table). Si la ligne n'est PAS un 'GO', la ligne actuelle est concaténée à @cmd et la ligne suivante est lue. Si la ligne actuelle est un 'GO', j'exécute le @cmd accumulé et vide @cmd pour la prochaine série d'instructions. L'EXEC est enveloppé dans un TRY/CATCH. En cas d'erreur, je peux afficher le numéro de ligne (colonne ID d'identité) afin que je puisse exécuter des sélections sur la table SqlCommands "autour" de ce numéro de ligne pour trouver des problèmes.


1 réponse 1

Au lieu de passer un tuyau pour grep et couper , utilisez simplement awk .

  • -F " = " fait le séparateur : = (espace = espace)
  • /AppleClamshellState/ Rechercher : AppleClamshellState
  • Impressions Oui ou alors Non selon ce qui est renvoyé pour : AppleClamshellState
  • Par exemple "AppleClamshellState" = pas d'impressions non

Cependant, il y aura un premier espace devant Oui ou alors Non as cut ne gère qu'un seul caractère pour le délimiteur.


7 réponses 7

pourrait être utilisé, bien qu'avec plus, vous pourrez éventuellement capter une sortie de console. Et c'est la raison pour laquelle cela fonctionne - la commande canalisée attend l'entrée jusqu'à ce que le .exe soit terminé

L'appel de l'exe directement à partir du fichier de commandes ou l'utilisation de start/wait fonctionnera, mais il y a une mise en garde.

Si l'exe que vous appelez crée ensuite un autre processus, tel que l'appel d'un autre exe, puis quitte le fichier batch, le traitement continuera après la fin de l'exe appelé, car il n'a aucune connaissance des autres processus démarrés par celui-ci.

Dans votre cas, il s'agit d'un réel problème car les programmes d'installation extraient normalement les fichiers d'une forme de conteneur compressé, qui peut être intégré dans l'exe lui-même, puis lancent l'un des fichiers extraits et quittent. Certains programmes d'installation fournissent des paramètres de ligne de commande qui indiquent à l'exe d'origine de ne pas se fermer tant que l'installation complète n'est pas terminée, c'est donc quelque chose que vous voudrez peut-être étudier. En dehors de cela, il n'y a pas vraiment de moyen de contourner ce problème avec les fichiers batch seuls et il faudrait une solution de programmation pour résoudre.


En règle générale, pour créer un fichier batch, le bloc-notes est utilisé. C'est l'outil le plus simple pour la création de fichiers batch. Vient ensuite l'environnement d'exécution des scripts batch. Sur les systèmes Windows, cela se fait via l'invite de commande ou cmd.exe. Tous les fichiers batch sont exécutés dans cet environnement.

Voici les différentes manières de lancer cmd.exe & moins

Méthode 1 &moins Allez dans C:WindowsSystem32 et double-cliquez sur le fichier cmd.

Méthode 2 &moins Via la commande run - L'instantané suivant montre pour trouver l'invite de commande (cmd.exe) sur le serveur Windows 2012.

Une fois le cmd.exe lancé, l'écran suivant s'affichera. Ce sera votre environnement pour exécuter vos scripts batch.


Différent du script de déploiement PowerShell, la prise en charge CLI/bash n'expose pas de variable commune pour stocker les sorties de script, à la place, il existe une variable d'environnement appelée AZ_SCRIPTS_OUTPUT_PATH qui stocke l'emplacement où réside le fichier de sorties de script. Si un script de déploiement est exécuté à partir d'un modèle Resource Manager, cette variable d'environnement est définie automatiquement pour vous par le shell Bash. La valeur de AZ_SCRIPTS_OUTPUT_PATH est /mnt/azscripts/azscriptoutput/scriptoutputs.json.

Les sorties du script de déploiement doivent être enregistrées dans l'emplacement AZ_SCRIPTS_OUTPUT_PATH et les sorties doivent être un objet chaîne JSON valide. Le contenu du fichier doit être enregistré en tant que paire clé-valeur. Par exemple, un tableau de chaînes est stocké sous la forme < "MyResult": [ "foo", "bar"] >. Stocker uniquement les résultats du tableau, par exemple [ "foo", "bar" ] , n'est pas valide.

jq est utilisé dans l'exemple précédent. Il est livré avec les images du conteneur. Voir Configurer l'environnement de développement.


Si vous exécutez le script avec sh hello.sh , le shell d'interprétation ne sera pas celui mentionné dans la ligne shebang, mais /bin/sh sera utilisé. Dans le cas de Debian et Ubuntu par défaut, ce sera dash .

Donc, pour exécuter correctement votre script avec un bash , utilisez l'un des éléments suivants.

Alternativement, vous pouvez également définir bash comme /bin/sh .

L'erreur de syntaxe est due à (). Supprimez () du fichier comme ceci :

ou vous pouvez simplement exécuter la commande suivante pour modifier le fichier pour vous :

Vous devriez maintenant pouvoir exécuter le fichier avec le résultat souhaité.

Alternativement:

Vous pouvez ajouter les lignes 2, 3 et 4 à votre

Rappelles toi, ne pas utilisez sudo pour modifier votre

Après avoir ajouté les lignes au fichier, exécutez la commande suivante pour redémarrer bash ou "sourcer" votre fichier .bashrc :

Vous devriez maintenant pouvoir exécuter la commande hello et "Hello world" devrait s'afficher dans le terminal.

Vous pouvez modifier le fichier pour dire ceci à la place :

et nommez le fichier hello et enregistrez le fichier dans /usr/local/bin .

Après avoir fait tout cela, rendez le fichier exécutable en exécutant la commande suivante :

Vous devriez maintenant pouvoir exécuter la commande hello et "Hello world" devrait s'afficher dans le terminal.


Fichiers batch Windows pour le plaisir et le profit

L'une des capacités les plus importantes de tout langage de programmation est la possibilité de choisir parmi différentes instructions en fonction des conditions rencontrées par le programme lors de son exécution. A cet effet, le langage du fichier batch a le si commander.

Les bases Si Commander

Dans sa forme la plus basique, si compare deux chaînes et exécute une commande si les chaînes sont équivalentes :

Ceci est utilisé en combinaison avec une variable de ligne de commande ou une substitution de variable d'environnement, comme dans cet exemple :

Si et seulement si le premier argument du fichier batch est le mot EFFACER, cette commande supprimera le fichier unfichier.dat.

Les guillemets dans cette commande ne sont pas absolument nécessaires. S'ils sont omis et que la commande est écrite sous la forme

la commande fonctionnera toujours tant qu'un argument de ligne de commande est donné lors de l'exécution du fichier batch. Cependant, si le fichier batch est démarré sans argument, alors %1 serait remplacé par rien, et la commande deviendrait ceci :

C'est une commande invalide. CMD s'attend à voir quelque chose avant le == partie de la commande et aboiera si ce n'est pas le cas. Par conséquent, il est courant d'entourer les éléments à tester d'un certain caractère & n'importe quel caractère. Même $ fonctionnera, comme indiqué ici :

Si les éléments testés sont identiques, ils le seront toujours lorsqu'ils seront entourés des caractères supplémentaires. S'ils sont différents ou vides, vous aurez toujours une commande valide.

Le si La commande vous permet également d'inverser le sens du test avec la ne pas option:

Vérification des fichiers et des dossiers

Le exister L'option vous permet de déterminer si un fichier particulier existe dans le répertoire courant :

Bien sûr, vous pouvez spécifier un chemin complet pour le nom de fichier si cela est approprié, et vous pouvez utiliser des variables d'environnement et % arguments pour construire le nom. Si le nom de fichier contient des espaces, vous devrez l'entourer de guillemets.

Le ne pas le modificateur peut être utilisé avec exister ainsi que.

Le exister test vérifie uniquement les fichiers, pas les dossiers. Cependant, le fichier spécial nul semble exister dans chaque dossier. Vous pouvez effectuer le test

pour voir si le dossier c: omdossier existe.

Vérifier le succès d'un programme

Lorsqu'une ligne de commande ou même un programme Windows se termine, il laisse derrière lui un numéro appelé son état de sortie ou alors état d'erreur valeur. Il s'agit d'un nombre que le programme utilise pour indiquer s'il pense avoir fait son travail avec succès. Un état de sortie de zéro signifie qu'il n'y a pas de problème. Des nombres plus grands indiquent un problème. Il n'y a pas de signification prédéterminée pour des valeurs spécifiques. La documentation de certains programmes peut répertorier des valeurs d'erreur spécifiques et donner leurs interprétations, ce qui signifie que vos fichiers batch peuvent utiliser ces valeurs pour prendre les mesures appropriées. Comment? À travers le niveau d'erreur variante de la si commander.

Après avoir exécuté une commande dans un fichier batch, un si énoncé de la forme

exécutera la commande si la valeur de l'état de sortie du programme précédent est le nombre répertorié ou plus haute. Par exemple, le utilisation nette la commande renvoie 0 s'il est capable de mapper une lettre de lecteur à un dossier partagé, il renverra un nombre différent de zéro s'il ne le peut pas. Un fichier batch peut en profiter comme suit :

Le utilisation nette est abordée au chapitre 14, "Programmes en ligne de commande". Son but est de mapper une lettre de lecteur à un dossier partagé sur le réseau.

Vous pouvez aussi utiliser ne pas avec cette version du si commander. Dans ce cas, la commande est exécutée si l'état d'erreur est moins que le numéro indiqué. Le test d'erreur dans l'exemple précédent peut être réécrit de cette façon :

Dans cette version, le flux du fichier batch est un peu plus facile à suivre. Cependant, même cela peut être amélioré, comme vous le verrez par la suite.

Exécution de plusieurs commandes après Si

Souvent, vous voudrez exécuter plusieurs commandes si une condition est vraie. Autrefois, avant l'arrivée du shell CMD étendu, vous deviez utiliser un aller à commande pour transférer le contrôle à une autre partie du fichier batch, comme dans la s'il existe exemple donné dans la section précédente. Avec la version étendue de si, Ce n'est plus necessaire.

Le étendu si La commande vous permet de mettre plus d'une instruction après un si commande, en les regroupant entre parenthèses. Par exemple, vous pouvez placer plusieurs commandes sur une seule ligne, comme illustré ici :

Ou vous pouvez les mettre sur plusieurs lignes :

Je recommande la deuxième version, car elle est plus facile à lire. Regardez à quel point l'exemple de copie de fichier réseau devient plus clair lorsque des parenthèses sont utilisées au lieu de aller à:

Vous pouvez également exécuter un ensemble de commandes si le si test est vrai et un autre si le test est faux en utilisant le autre option, comme dans cet exemple :

Vous pouvez utiliser autre entre parenthèses, mais vous devez prendre soin de placer le autre commande sur la même ligne que si, ou sur la même ligne que la parenthèse fermante après si. Vous devriez écrire une ligne sur plusieurs si. autre commande utilisant le même format que cet exemple :

Tests étendus

Le étendu si La commande vous permet d'effectuer une plus grande variété de tests lors de la comparaison de chaînes, et elle peut également comparer des arguments et des variables sous forme de nombres. Les comparaisons étendues sont répertoriées dans le tableau 12.3.

Tableau 12.3. Opérateurs de comparaison autorisés par le si Commander

si chaîne1 ÉQU chaîne2