web-dev-qa-db-fra.com

Fractionner des commandes longues sur plusieurs lignes via un fichier de commandes Windows

Comment puis-je fractionner de longues commandes sur plusieurs lignes dans un fichier batch?

664
Dan

Vous pouvez rompre les longues lignes avec le curseur ^ tant que vous vous souvenez que le curseur et la nouvelle ligne qui le suit sont complètement supprimés. Donc, s'il doit y avoir un espace où vous cassez la ligne, incluez un espace. ( Plus d'informations à ce sujet ci-dessous. )

Exemple:

copy file1.txt file2.txt

serait écrit comme:

copy file1.txt^
 file2.txt
827
Wayne

La règle pour le caret est la suivante:

Un curseur à la fin de la ligne, ajoute la ligne suivante, le premier caractère de la ligne ajoutée sera échappé.

Vous pouvez utiliser le signe d'insertion plusieurs fois, mais la ligne complète ne doit pas dépasser la longueur de ligne maximale d'environ 8192 caractères (Windows XP, Windows Vista et Windows 7).

echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*

echo Test2
echo one & echo two
--- Output ---
Test2
one
two

echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two

echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two

Pour supprimer l'échappement du caractère suivant, vous pouvez utiliser une redirection.

La redirection doit être juste avant le caret. Mais il existe une curiosité avec redirection avant le caret.

Si vous placez un jeton au niveau du curseur, le jeton est supprimé.

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

Et il est également possible de intégrer des sauts de ligne dans la chaîne:

setlocal EnableDelayedExpansion
set text=This creates ^

a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed

La ligne vide est importante pour le succès. Cela ne fonctionne qu'avec une expansion retardée, sinon le reste de la ligne est ignoré après le saut de ligne.

Cela fonctionne car le curseur inséré à la fin de la ligne ignore le saut de ligne suivant et échappe au caractère suivant, même si le caractère suivant est également un saut de ligne (les retours à la ligne sont toujours ignorés dans cette phase).

247
jeb

(Ceci est fondamentalement une réécriture de la réponse de Wayne mais avec la confusion autour du curseur éclaircie. Je l'ai donc posté en CW. Je ne crains pas le montage réponses, mais les réécrire complètement semble inapproprié.)

Vous pouvez rompre les longues lignes avec le curseur (^), mais rappelez-vous que le curseur et la nouvelle ligne qui le suit sont entièrement supprimés de la commande. placez-le là où vous auriez besoin d'un espace (par exemple, entre les paramètres), assurez-vous d'inclure également cet espace (soit avant le ^, soit au début de la ligne suivante - ce dernier choix peut aider à le rendre plus clair. c'est une continuation).

Exemples: (tous testés sous Windows XP et Windows 7)

xcopy file1.txt file2.txt

peut être écrit comme:

xcopy^
 file1.txt^
 file2.txt

ou

xcopy ^
file1.txt ^
file2.txt

ou même

xc^
opy ^
file1.txt ^
file2.txt

(Ce dernier fonctionne car il n'y a pas d'espaces entre la xc et le ^, et aucun espace au début de la ligne suivante. Ainsi, lorsque vous supprimez le ^ et la nouvelle ligne, obtenez ...xcopy.)

Pour des raisons de lisibilité et de sécurité, il est probablement préférable de séparer uniquement les paramètres (veillez à inclure l'espace).

Assurez-vous que le ^ est et non la dernière chose dans un fichier batch, car il y a semble être un problème majeur avec ça .

64
T.J. Crowder

Plusieurs commandes peuvent être mises entre parenthèses et réparties sur de nombreuses lignes. donc quelque chose comme echo hi && echo hello peut être mis comme ceci:

( echo hi
  echo hello )

Aussi les variables peuvent aider:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

Aussi, j'ai remarqué avec les caractères (^) que les conditionnels if ne souhaitaient les suivre que si un espace était présent:

if exist ^
15
Todd Partridge

Il semble toutefois que le fractionnement au milieu des valeurs d'une boucle for ne nécessite pas de signe d'insertion (et en fait, essayer d'en utiliser une sera considéré comme une erreur de syntaxe). Par exemple,

for %n in (hello
bye) do echo %n

Notez qu'aucun espace n'est même nécessaire après bonjour ou avant au revoir.

9
Mohammed Safwat