2013-01-24 30 views
54

Recentemente ho incluso una linea simile a questo in un file .cmd:Qual è la differenza tra% e %% in un file cmd?

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

Originariamente avevo usato solo% f, e che avrebbe funzionato bene quando eseguito sulla riga di comando, ma non quando eseguito attraverso il file . Quando sono passato a %% f, ha funzionato nel file. Mi chiedo solo quale sia la differenza.

risposta

86

(. Spiegazione più in dettaglio può essere trovato in this Microsoft kb)

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 sono interpretati come una variabile:

    segni

    echo %myvar%

  3. due per cento senza nulla in mezzo (in un file batch) sono trattati come un unico segno di percentuale in un comando (non un file batch): %%f

Perché è quella?

Per esempio, se eseguiamo la riga di comando (semplificato)

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

in un file batch, regola 2 sarebbe cercare di interpretare

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

come variabile. Al fine di evitare che, si deve applicare regola 3 e sfuggire alla % con una seconda %:

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

C'è una spiegazione del perché posso farla franca con l'utilizzo di un solo segno di percentuale in un ciclo, se eseguito direttamente da un prompt dei comandi e non da un file batch? Conosco l'eredità DOS, ma ** possiamo ** usare le variabili da una riga di comando ora. –

+3

Inoltre, assicurarsi che la variabile sia un singolo carattere. – jiggunjer

10

In DOS non è possibile utilizzare le variabili di ambiente sulla riga di comando, solo nei file batch, dove hanno utilizzato il segno % come delimitatore. Se si desidera un letterale % segno in un file batch, ad es. in una dichiarazione echo, era necessario raddoppiarla.

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