The line continuation ^
escapes the first character on the next line, quindi il primo &
viene trattato come un valore letterale e viene passato come argomento a falsey
. Il secondo &
viene considerato come una semplice concatenazione di comandi.
Una soluzione semplice per ottenere &&
di essere trattato come comando condizionale concatenazione è quello di mettere il &&
sulla linea prima:
falsey &&^
echo nope
oppure si potrebbe mettere uno spazio prima del &&
falsey^
&& echo nope
L'altra opzione è usare il trucco di reindirizzamento che jeb indica nella sua risposta collegata, ma non uso mai quel trucco.
quanto riguarda la tua "soluzione" con citato "&&"
- si sta prendendo in giro da soli. Sembra funzionare quando il falso fallisce.Ma se il vostro comando ha esito positivo, allora si hanno problemi:
echo ONE^
"&&" echo TWO
- USCITA -
C:\test>echo ONE " && " echo TWO
ONE "
'" echo TWO' is not recognized as an internal or external command,
operable program or batch file.
Nota che i &&
opere perché la prima "
è sfuggito, in modo che il &&
non è citato. Se si aggiunge uno spazio prima del "&&"
echo ONE^
"&&" echo TWO
poi si ottiene la seguente
C:\test>echo ONE "&&" echo TWO
ONE "&&" echo TWO
perché ora lo spazio è sfuggito ed il "&&"
è citato.
quanto riguarda il tuo commento, è possibile ignorare quegli spazi extra - sono un artefatto di come il parser visualizza la linea quando ECHO è ON. Il parser spesso riorganizza la linea in modo significativo, ma normalmente non influisce sul risultato.
Per esempio
< nul set test=OK
echo [%test%]
--OUTPUT--
C:\test>set test=OK 0<nul
C:\test>echo [OK]
[OK]
Nota come la linea SET fece eco è completamente risistemato. Il reindirizzamento viene compresso e spostato alla fine dell'istruzione, con uno spazio prima del reindirizzamento. Potresti pensare che lo spazio sia incluso nel compito, ma puoi vedere che non lo è :-)
L'unica volta che potresti doverti preoccupare del riarrangiamento è se il comando viene usato in una pipe.
Ad esempio:
(set test=OK&call echo [%%^^test%%])|findstr "^"
--OUTPUT--
C:\test>(set test=OK & call echo [%^test%]) | findstr "^"
[OK ]
Si può vedere che c'è un singolo spazio extra indesiderato che viene incluso nel valore SET. Questo è un artefatto del modo in cui le pipe vengono implementate: ogni lato viene eseguito in un nuovo processo CMD.EXE e la riga viene analizzata più volte. Puoi vedere da dove viene lo spazio usando %CMDCMDLINE%
per visualizzare la riga di comando passata al cmd.exe sul lato sinistro.
(set test=OK&call echo [%%^^test%%] %%^^cmdcmdline%%)|findstr "^"
--OUTPUT--
C:\test>(set test=OK & call echo [%^test%] %^cmdcmdline%) | findstr "^"
[OK ] C:\WINDOWS\system32\cmd.exe /S /D /c" (set test=OK & call echo [%^test%] %^cmdcmdline%)"
Vedi Why does delayed expansion fail when inside a piped block of code? per ulteriori informazioni su molti capricci con tubi. In particolare, prestare attenzione alla risposta selezionata per una buona spiegazione di ciò che sta accadendo.
Qual è il vantaggio di sfuggire un'interruzione di riga e di mettere '&&' nella riga successiva, comunque? 'falsey && echo nope' o' falsey && (\ n echo nope \ n) '(dove' \ n' sono nuove linee) è una convenzione standard. Quello che stai facendo è come iniziare una frase con una congiunzione. Ed è imbarazzante. – rojo
Quale editor di testo stai usando per modificare il tuo file batch? –
@rojo Perché le linee che in realtà voglio usare per questo sono piuttosto lunghe. Mettere il '&&' all'inizio della riga successiva rende chiaro che l'esecuzione dipende da quella della riga precedente. – 8bittree