La risposta breve: usa le parentesi quadre:
if [%1]==[] goto :blank
o (quando è necessario gestire gli argomenti tra virgolette, vedere la modifica di seguito):
if [%~1]==[] goto :blank
Perché? potresti chiedere. Bene, proprio come ha menzionato Jeremiah Willcock: http://ss64.com/nt/if.html - lo usano! OK, ma cosa c'è di sbagliato nelle virgolette?
Di nuovo, risposta breve: sono "magici" - a volte le virgolette doppie (doppie) vengono convertite in virgolette singole (doppie). E devono combaciare, tanto per cominciare.
Considera questo piccolo script:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
Proviamolo:
C:\> argq bla bla
bla
bla
Done.
Sembra funzionare. Ma ora, passiamo alla seconda marcia:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Boom Questo non è stato valutato come vero, né come falso. La sceneggiatura è MORTA. Se avessi dovuto spegnere il reattore da qualche parte lungo la linea, beh, sfortuna. Ora morirai come Harry Daghlian.
Potresti pensare: OK, gli argomenti non possono contenere virgolette. Se lo fanno, succede. Sbagliato Ecco qualche consolazione:
C:\> argq ""bla bla""
""bla
bla""
Done.
O si. Non ti preoccupare - a volte questo sarà lavorare.
Proviamo un altro script:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
Puoi metterti alla prova, che funziona bene per i casi sopra. Questo è logico: le virgolette non hanno nulla a che fare con le parentesi, quindi non c'è magia qui. Ma che dire di ravvivare gli argomenti con le parentesi?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
Nessuna fortuna lì. Le parentesi non possono semplicemente soffocare cmd.exe
il parser di.
Torniamo per un momento alle citazioni malvagie. Il problema era lì, quando l'argomento si è concluso con una citazione:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
E se passo solo:
D:\>argq bla2"
The syntax of the command is incorrect.
Lo script non verrà eseguito affatto. Lo stesso per args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
Ma cosa ottengo, quando il numero di "
caratteri "corrisponde" (cioè - è pari), in questo caso:
D:\>args bla2" "bla3
bla2" "bla3
Done.
NIZZA - Spero che tu abbia imparato qualcosa su come i .bat
file dividono i loro argomenti della riga di comando (SUGGERIMENTO: * Non è esattamente come in bash). L'argomento precedente contiene uno spazio. Ma le virgolette non vengono rimosse automaticamente.
E argq? Come reagisce a questo? Prevedibilmente:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
Quindi, pensa prima di dire: "Sai cosa? Usa solo le virgolette. [Perché, a me, questo sembra più carino]".
modificare
Recentemente, ci sono stati commenti su questa risposta - beh, le parentesi quadrate "non possono gestire" il passaggio di argomenti tra virgolette e trattarli come se non fossero citati.
La sintassi:
if "%~1"=="" (...)
Non è una virtù ritrovata di recente delle virgolette doppie, ma la visualizzazione di una chiara caratteristica di rimuovere le virgolette dalla variabile argomento, se il primo e l'ultimo carattere sono virgolette doppie.
Questa "tecnologia" funziona altrettanto bene con le parentesi quadre:
if [%~1]==[] (...)
È stato utile sottolinearlo, quindi ho anche votato a favore della nuova risposta.
Infine, fan delle virgolette doppie, esiste un argomento del modulo ""
nel tuo libro o è vuoto? Sto solo chiedendo;)
GOTO BLANK
riga) alle altre dueIF
affermazioni, questo risolve il problema?