Question Longues commandes réparties sur plusieurs lignes dans un fichier de traitement par lots de Windows Vista (.bat)


Comment puis-je faire de longues commandes sur plusieurs lignes dans un fichier de commandes Windows (Vista)?


560
2017-09-16 03:04


origine


Réponses:


Vous pouvez rompre les longues lignes avec le curseur ^ tant que vous vous souvenez que le curseur et le retour à la ligne qui le suit sont complètement supprimés. Donc, s'il y a un espace où vous devez franchir la ligne, incluez un espace. (Plus sur cela ci-dessous.)

Exemple:

copy file1.txt file2.txt

serait écrit comme:

copy file1.txt^
 file2.txt

704
2017-09-16 03:06



La règle pour le signe est:

Un caret à 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 ~ 8192 caractères (XP / Vista / Win7).

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 avant le signe. Si vous placez un jeton au 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 flux de ligne incorporés 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 extension retardée, sinon le reste de la ligne est ignoré après le saut de ligne.

Cela fonctionne parce que le caret à 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).


221
2017-12-15 22:48



(Ceci est essentiellement une réécriture de La réponse de Wayne mais avec la confusion autour du caret éclairci. Donc je l'ai posté comme un CW. Je ne suis pas timide à propos de l'édition des réponses, mais complètement les réécrire semble inapproprié.)

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

Exemples: (tous testés sur 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

(Cette dernière fonctionne parce qu'il n'y a pas d'espace entre xc et le ^et pas d'espaces au début de la ligne suivante. Donc, quand vous supprimez le ^ et la nouvelle ligne, vous obtenez ...xcopy.)

Pour la lisibilité et la santé mentale, il est probablement préférable de ne casser que les paramètres (assurez-vous d'inclure l'espace).

Assurez-vous que le ^ est ne pas la dernière chose dans un fichier batch, comme il semble être un problème majeur avec cette.


53
2018-02-12 19:55



Plusieurs commandes peuvent être mises entre parenthèses et réparties sur plusieurs lignes; donc quelque chose comme echo hi && echo hello peut ê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 aussi remarqué avec des carets (^) que le if les conditionnels les aimaient à suivre seulement si un espace était présent:

if exist ^

10
2017-08-24 11:07



Il semble cependant que la division au milieu des valeurs d'une boucle for n'a pas besoin d'un caret (et 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 nécessaire après le bonjour ou avant le départ.


7