it-swarm-eu.dev

Rozdělte dlouhé příkazy na více řádků pomocí dávkového souboru Windows

Jak mohu rozdělit dlouhé příkazy na více řádků v dávkovém souboru?

637
Dan

Dlouhé řádky můžete rozdělit pomocí znaku ^, pokud si pamatujete, že znak a nový řádek za ním jsou zcela odstraněny. Takže, pokud by měl být mezera, kde prolomíte čáru, vložte mezeru. ( Více k tomu níže. )

Příklad:

copy file1.txt file2.txt

bude psáno jako:

copy file1.txt^
 file2.txt
801
Wayne

Pravidlo pro stříšku je:

Na konci řádku se připojí stříška, připojí další řádek, první znak připojené čáry bude vynechán.

Můžete použít stříšku vícekrát, ale celý řádek nesmí překročit maximální délku řádku ~ 8192 znaků (Windows XP, Windows Vista a 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

K potlačení úniku dalšího znaku můžete použít přesměrování.

Přesměrování musí být těsně před stříškami. Ale existuje jedna zvědavost s přesměrováním před zástupcem.

Pokud umístíte token na stříšku, token bude odstraněn.

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


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

A je také možné vložit řádkové zdroje do řetězce:

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

Prázdný řádek je důležitý pro úspěch. Funguje to pouze se zpožděným rozšířením, jinak bude zbytek řádku ignorován po podání řádku.

Funguje to, protože stříška na konci řádku ignoruje další posun řádku a unikne další znak, i když další znak je také posun řádku (návraty konce řádku jsou v této fázi vždy ignorovány).

240
jeb

(Toto je v podstatě přepsání Wayneova odpověď , ale se zmatkem kolem stříšky se vyjasnil. Takže jsem to zveřejnil jako CW. odpovědi, ale jejich úplné přepisování se zdá nevhodné.)

Pomocí stříšky můžete rozdělit dlouhé řádky (^), nezapomeňte, že stříška a nový řádek, který za ní následuje , jsou z příkazu zcela odstraněny , takže pokud je umístíte na místo, prostor by byl vyžadován (například mezi parametry), nezapomeňte také zahrnout prostor (buď před ^, nebo na začátek dalšího řádku - ta druhá volba může pomoci objasnit, že je to pokračování).

Příklady: (všechny testovány na Windows XP a Windows 7)

xcopy file1.txt file2.txt

lze napsat jako:

xcopy^
 file1.txt^
 file2.txt

nebo

xcopy ^
file1.txt ^
file2.txt

nebo dokonce

xc^
opy ^
file1.txt ^
file2.txt

(To poslední funguje, protože neexistují mezery mezi xca ^ a žádné mezery na začátku dalšího řádku. Takže když odeberete ^ a nový řádek, dostanete ...xcopyname__.)

Pro čitelnost a zdravý rozum je pravděpodobně nejlepší rozbít pouze mezi parametry (nezapomeňte zahrnout mezeru).

Ujistěte se, že ^ není není poslední věc v dávkovém souboru, protože zdá se, že je to hlavní problém .

59
T.J. Crowder

Více závorek lze vložit do závorek a rozložit je na mnoho řádků; takže něco jako echo hi && echo hello lze dát takto:

( echo hi
  echo hello )

Proměnné mohou také pomoci:

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

Také jsem si všiml s stříškami (^), že podmínění if chtělo, aby je následovali, pouze pokud je v nich místo:

if exist ^
14
Todd Partridge

Zdá se však, že rozdělení uprostřed hodnot smyčky for for nevyžaduje stříšku (a vlastně pokus o použití bude považován za chybu syntaxe). Například,

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

Všimněte si, že po pozdravu ani před rozloučením není potřeba žádný prostor.

8
Mohammed Safwat