Les commandes longues se divisent en plusieurs lignes dans Windows Vista batch (.chauve-souris) fichier

Comment faire pour que les commandes longues passent plusieurs lignes dans un fichier batch Windows (Vista)?

574
demandé sur a_horse_with_no_name 2008-09-16 07:04:34

5 réponses

vous pouvez briser les longues lignes avec le caret ^ aussi longtemps que vous vous souvenez que le caret et la nouvelle ligne qui le suit sont complètement enlevés. Donc, s'il doit y avoir un espace où vous brisez la ligne, incluez un espace. ( plus sur ce ci-dessous. )

exemple:

copy file1.txt file2.txt

s'écrirait comme:

copy file1.txt^
 file2.txt
723
répondu Wayne 2017-11-06 16:24:20

la règle pour le caret est:

Un signe à la fin de ligne, ajoute la ligne suivante, le premier caractère de la annexé ligne sera échappé.

vous pouvez utiliser le caret plusieurs fois, mais la ligne complète ne doit pas dépasser la longueur maximale de ~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'évasion du prochain caractère, vous pouvez utiliser une redirection.

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

si vous placez un jeton au caret, le jeton est enlevé.

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 ligne embed alimente 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 l'expansion retardée, sinon le reste de la ligne est ignoré après le saut de ligne.

cela fonctionne, parce que le signe d'insertion à la fin de la ligne ignore l'alimentation de la ligne suivante et échappe au caractère suivant, même si le caractère suivant est aussi une alimentation de la ligne (Les retours de chariot sont toujours ignorés dans cette phase).

224
répondu jeb 2018-08-24 19:56:57

(ceci est essentiellement une réécriture de réponse de Wayne mais avec la confusion autour du caret éclairci. Donc je l'ai posté comme un CW. Je n'hésite pas à éditer les réponses, mais les réécrit complètement semble inapproprié.)

vous pouvez briser les longues lignes avec le caret ( ^ ), il suffit de se rappeler que le caret et la nouvelle ligne qui le suit sont entièrement enlevés de la commande, donc si vous le mettez où un espace serait nécessaire (comme entre les paramètres), assurez - vous d'inclure l'espace aussi (soit avant le ^ , ou au début de la ligne suivante-ce dernier choix peut aider à le rendre plus clair c'est une suite).

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

xcopy file1.txt file2.txt

peut s'écrire 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 car il n'y a pas d'espaces entre le xc et le ^ , et pas d'espace au début de la ligne suivante. Donc quand vous retirez le ^ et la nouvelle ligne, vous obtenez... xcopy .)

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

assurez-vous que le ^ est et non la dernière chose dans un fichier de lot, car il semble être un problème majeur avec ce .

54
répondu T.J. Crowder 2017-05-23 11:54:50

plusieurs commandes peuvent être placées entre parenthèses et réparties sur de nombreuses lignes; ainsi 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 (
...

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

if exist ^
12
répondu Todd Partridge 2016-02-12 19:55:11

il semble cependant que se séparer au milieu des valeurs d'une boucle for n'a pas besoin d'un caret(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 un bonjour ou avant Un Au revoir.

7
répondu Mohammed Safwat 2014-08-24 11:07:50