Qual è la differenza tra% e %% in un file cmd?


88

Recentemente ho incluso una riga simile a questa in un file .cmd:

for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f"

Inizialmente avevo usato solo% f, e avrebbe funzionato bene se eseguito sulla riga di comando, ma non se eseguito attraverso il file. Quando sono passato a %% f, ha funzionato nel file. Mi chiedo solo qual è la differenza.

Risposte:


138

(Una spiegazione più dettagliata può essere trovata in un articolo della Microsoft KB archiviato .)

Tre cose da sapere:

  1. Il segno di percentuale viene utilizzato nei file batch per rappresentare i parametri della riga di comando: %1, %2, ...
  2. Due segni di percentuale con qualsiasi carattere tra di loro vengono interpretati come una variabile:

    echo %myvar%

  3. Due segni di percentuale senza alcun elemento intermedio (in un file batch) vengono trattati come un singolo segno di percentuale in un comando (non un file batch):%%f

Perché è così?

Ad esempio, se eseguiamo la tua riga di comando (semplificata)

FOR /f %f in ('dir /b .') DO somecommand %f

in un file batch, la regola 2 tenta di interpretare

%f in ('dir /b .') DO somecommand %

come variabile. Per evitare ciò, devi applicare la regola 3 e sfuggire alla %con un secondo %:

FOR /f %%f in ('dir /b .') DO somecommand %%f

21
C'è una spiegazione del motivo per cui posso farla franca utilizzando solo un segno di percentuale in un ciclo FOR, se eseguito direttamente da un prompt dei comandi e non da un file batch? Conosco l'eredità DOS, ma ora possiamo usare le variabili da una riga di comando.
Alec Mev

6
Inoltre, assicurati che la variabile sia un singolo carattere.
jiggunjer

1
E se volessi emettere un comando che contiene%, ad esempio: for / f %% i in ('git log -1 --pretty = format: "%% H"') imposta GIT_COMMIT = %% i
Wakan Tanka

15

In DOS non si potevano usare le variabili d'ambiente sulla riga di comando, solo nei file batch, dove usavano il %segno come delimitatore. Se si desiderava un %segno letterale in un file batch, ad esempio in echoun'istruzione, era necessario raddoppiarlo.

Questo è stato trasferito a Windows NT che consentiva le variabili di ambiente sulla riga di comando, tuttavia per la compatibilità con le versioni precedenti è ancora necessario raddoppiare i %segni in un file .cmd.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.