È importante quando si utilizza% 1 per mettere qualcosa attorno ad esso per evitare che il file batch si rompa quando% 1 è vuoto, perché% 1 non è una variabile che viene sostituita con il valore, come SQL injection un esempio di iniezione in batch , e quando il valore è nulla e% 1 è in un IF, viene visualizzato un codice non funzionante. if %1==""
diventa if == ""
e dà un errore.
Per quanto riguarda il motivo per cui se definito non funziona su% 1,% 1 è il valore non la variabile, quindi definito non funziona lì. Per il codice che funziona con% 1 vuoto, è necessario un codice che non si interrompa quando% 1 viene sostituito con nulla. Prova if "%1"==""
o provaif [%1]==[]
Per dire -% 1 sembra un po 'confuso, non mi sembra una buona convenzione! Tecnicamente potresti persino fare if a%1==a%1
o if %1a==%1a
ma la convenzione tende ad essere[]
Puoi usare le virgolette, oppure [] o qualsiasi altro carattere. Ma come ha sottolineato il supercat nel commento, le virgolette non sono una buona idea intorno a% 1. (Perché se% 1 contiene spazi, l'utente include le virgolette in ciò che viene passato a% 1 e se c'è uno spazio in% 1 e nel file batch si inseriscono virgolette attorno a% 1, le virgolette verranno annullate e lo spazio non quotato causerà un errore).
Se stavi facendo un IF sulla riga di comando e non testassi alcuna variabile, non avresti% 1 e non avresti nemmeno bisogno di []. Diresti IF "a b c"=="a b c" echo a
o IF a==b echo a
Se in un file batch hai spesso% 1 e invece di usare le virgolette attorno a% 1, usa ad esempio uno o due caratteri attorno ad esempio [%1]
e usa le virgolette se devi conservare spazi e non è un% 1 egeg IF [%1]==[a]
o IF [%1]==["a b"] echo a
Don't do "%1"
perché% 1 potrebbe già avere delle virgolette che le tue virgolette annulleranno e quindi se% 1 ha uno spazio, l'istruzione if si interrompe.
Se eri sulla riga di comando e stavi testando una variabile, dipende se la variabile ha virgolette. Puoi vedere i contenuti.
È possibile che una variabile abbia uno spazio e non contenga virgolette.
Quindi, in questo caso particolare della riga di comando, mettere le virgolette attorno a% a% non raddoppierà le virgolette e devi mettere le virgolette attorno a% a% se vuoi testarlo contro "a b"
C:\>set a=a b
C:\>echo %a%
a b
C:\>IF %a%=="a b" echo sdf
b=="a b" was unexpected at this time.
C:\>IF "%a%"=="a b" echo sdf
sdf
So ^^^ we want "%a%"
Considerando che se% a% contenesse virgolette, sarebbe un caso diverso
C:\>set a="a b"
C:\>echo %a%
"a b"
C:\>IF %a%=="a b" echo a
a
C:\>IF "%a%"=="a b" echo a
b""=="a b" was unexpected at this time.
C:\>
^^^^ So there we want %a% without quotes around it.
Quindi è tutta una questione se la variabile o il parametro contiene virgolette. Se% 1 contiene spazi, conterrà virgolette. Quindi sappiamo che se confrontassimo% 1 con "a b", allora w non farebbe "% 1". E se% 1 non contenesse virgolette non conterrebbe spazi, quindi non faremmo "% 1" Quindi penso che non vorrai mai fare "% 1". Quindi, se% 1 contiene spazi, ci saranno virgolette all'interno di% 1 e gli spazi saranno già conservati.
Ho cancellato il seguito alla luce del commento di Supercat. E ho aggiunto altro al mio post sopra.
Le virgolette sono migliori intorno a% 1, piuttosto che [] o ad alcuni caratteri come A o -, perché ad esempio, se usi [], non manterrà gli spazi
C: \> if [dab] == [dab] echo sdf
a era inaspettato in questo momento.
Di ' if "d a b"
che funzionerà. Quindi if "%1"
è meglio di altri personaggi come if [%1]
o a%1a
o-%1
for %1 in (*.*) do @echo %1
e sarebbe ambiguo farlo in un file batch, quindi per le istruzioni quando all'interno di un file batch usano %% ma i parametri batch (che tra l'altro sono sempre e solo in un file batch), sono sempre% 1 ,% 2 ecc.