Fractionner les commandes longues en plusieurs lignes via le fichier de commandes Windows

735

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

Ondra Žižka
la source

Réponses:

919

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 rompez la ligne, incluez un espace. ( Plus d'informations ci-dessous. )

Exemple:

copy file1.txt file2.txt

serait écrit comme suit:

copy file1.txt^
 file2.txt
Wayne
la source
95
Vous pouvez commencer la ligne suivante sans espace si vous ajoutez un espace juste avant ^et après votre texte de commande.
Joseph Daigle
4
@SebaIllingworth - Non, vous pouvez toujours ajouter [ESPACE] + [^] et deux lignes vides pour créer un total de 2 sauts de ligne lorsqu'il est echoédité.
James K
12
Pour plus de sécurité,
finissez
4
@GavinMiller: "caret ^ après copie et file1.txt sur une nouvelle ligne ne fonctionnera pas" Ce n'est pas vrai. Vous pouvez diviser la ligne n'importe où, y compris au milieu d'un mot, comme co^␍py ^␍file1 ^␍file2. Je vous suggère de supprimer votre commentaire pour éviter toute confusion, d'autant plus que cette quête est si populaire
Borodin
3
Un problème ici est que le ^ doit être le dernier caractère de la ligne - c'est-à-dire pas d'espaces après. J'avais des problèmes avec ça et il s'est avéré que j'avais un tas d'espaces après le curseur - pas facilement visible dans l'éditeur que j'utilisais.
GregHNZ
267

La règle pour le curseur est:

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

Vous pouvez utiliser le curseur plusieurs fois, mais la ligne complète ne doit pas dépasser la longueur de ligne maximale de ~ 8 192 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 signe d'insertion. Mais il existe une curiosité avec redirection devant le curseur.

Si vous placez un jeton sur le 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 d' incorporer 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 signe d'insertion à 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 chariot sont toujours ignorés dans cette phase).

jeb
la source
Le bloc de code final avec l'exemple de saut de ligne n'affiche pas la ligne vierge, même si elle est là. (Au moins, il n'apparaît pas dans IE7) Essayez plutôt de reformater en utilisant un blockquote.
dbenham
5
La question est, devrions-nous prendre en charge un mauvais outil qui n'a pas suivi les règles (quelqu'un l'appelle un navigateur, mais ce n'est pas le cas) ou devez-vous passer à un navigateur?
jeb
1
j'avais des guillemets doubles entourant mes valeurs, comme dans l'ensemble var = "text here ^" mais cela ne fonctionne pas. Retirez le guillemet double et c'est très bien.
rjt
1
@jeb, a rédigé un exemple de script cmd défaillant, mais a ensuite trouvé cette question: stackoverflow.com/questions/4643376/…
rjt
Cela ne fonctionne pas si la ligne suivante commence par un guillemet: copy ^[newline]"file1.txt" ^[newline]"file2.txt"ne fonctionne pas! Je devais ajouter un espace: copy ^[newline] "file1.txt" ^[newline] "file2.txt".
Alexander Gelbukh
70

(Il s'agit essentiellement d'une réécriture de la réponse de Wayne, mais avec la confusion autour du curseur dissipée. Je l'ai donc posté en CW. Je n'ai pas peur de modifier les réponses, mais les réécrire complètement semble inapproprié.)

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

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

xcopy file1.txt file2.txt

peut s'écrire:

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 le xcet le ^, et pas d'espaces au début de la ligne suivante. Ainsi, lorsque vous supprimez le ^et la nouvelle ligne, vous obtenez ...xcopy )

Pour la lisibilité et la raison, il est probablement préférable de ne briser qu'entre les paramètres (assurez-vous d'inclure l'espace).

Assurez-vous que ce ^n'est pas la dernière chose dans un fichier de commandes, car il semble y avoir un problème majeur avec cela .

T.J. Crowder
la source
18

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

( echo hi
  echo hello )

Les variables peuvent également aider:

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

J'ai également remarqué avec carets ( ^) que les ifconditionnelles ne les aimaient à suivre que si un espace était présent:

if exist ^
Perdrix Todd
la source
1
La ligne cmd1.bat && cmd2.batest différente de la forme parens: exécuter cmd2.batssi cmd1.batexécuté avec succès (-sans paramètre %errorcode%). Cette dernière forme s'exécute sans condition. Un peu inattendu (du moins pour moi) est que, évidemment, vous ne pouvez pas utiliser la combinaison des deux + ie ajouter &&avant le saut de ligne.
Paul Michalik
( echo <line break here> hello )entraîne une ligne vide.
Karl Morrison
meilleure réponse et la plus propre! les carets sont moches et problématiques en regex
neoscribe
9

Il semble cependant 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 un 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.

Mohammed Safwat
la source
Bien sûr, cela fait partie de la forsyntaxe: les séparateurs d'éléments dans le "for-set" sont l'espace, la virgule, le point-virgule, le signe égal, le caractère TAB et les nouvelles lignes.
Aacini
Mais que se passe-t-il si la dopartie contient des if-elseinstructions multiples / imbriquées ?
Vicky Dev
Ensuite, vous pouvez simplement utiliser des parenthèses pour entourer les instructions comme pour% n dans (bonjour bye) do (echo% n echo% n)
Mohammed Safwat