All'interno di un blocco di istruzioni (a parenthesised series of statements)
, il blocco intera viene analizzato e quindi giustiziati. Qualsiasi %var%
all'interno del blocco sarà sostituito dal valore della variabile al momento del blocco viene analizzato - prima che venga eseguito il blocco - la stessa cosa vale per un FOR ... DO (block)
.
Quindi, IF (something) else (somethingelse)
verrà eseguita utilizzando i valori di %variables%
al momento si incontra il IF
.
Due modi comuni per superare questo sono: 1) utilizzare setlocal enabledelayedexpansion
e utilizzare !var!
in luogo di %var%
per accedere al valore modificato della var
o 2) per chiamare una subroutine per eseguire un'ulteriore elaborazione utilizzando i valori modificati.
Si noti quindi l'uso di CALL ECHO %%var%%
che visualizza il valore modificato di var
.
il codice contiene due variabili separate chiamate f
.
Il primo è l'anello di controllo 'metavariable' chiamato f
e fa riferimento %%f
.
Il secondo è l'ambiente comune variabile f
sia stabilita da dichiarazione set "f=..."
.Questa variabile può essere letta utilizzando %f%
ma entro un block
, apparirà di mantenere il valore che aveva quando il controllo for
stato analizzato (in realtà, qualsiasi %var%
è sostituito al parse-tempo dal valore var
in quel tempo)
metavariables
non possono essere utilizzati in istruzioni di manipolazione delle stringhe come sottostringhe o sostituti, solo variabili d'ambiente comuni possono essere utilizzati per queste operazioni, quindi è necessario assegnare il valore del metavariable f
alla variabile di ambiente f
e quindi eseguire l'attività di sostituzione delle stringhe di la variabile ambientale f
.
La svolta, ovviamente, è che è necessario utilizzare delayedexpansion
e la sintassi !var!
per accedere al valore modificato di una variabile di ambiente all'interno di un blocco.
Quindi,
setlocal enabledelayedexpansion
for...%%f...do (
echo %%f
set "f=%%f"
set "f=!f:\=/!"
echo !f!
)
echo just for demonstration %f% !f! %%f
Questo imposta il valore della f
nella maniera richiesta (naturalmente, si può sempre cambiare il nome per evitare confusione ...)
L'ultima riga è semplicemente quello di mostrare che il valore finale acquisito da f
è accessibile al di fuori del ciclo come %f%
o !f!
e che %%f
è fuori contesto e visualizzato come %f
.
Un altro modo per fare questo senza delayedexpansion
è
for...%%f...do (
echo %%f
set "f=%%f"
call set "f=%%f:\=/%%"
call echo %%f%%
)
echo just for demonstration %f% !f! %%f
la differenza è l'uso di call
e raddoppiando le %
s, e la riga finale mostrerà !f!
come proprio questo - un letterale, poiché al di fuori di delayedexpansion
modo, !
è solo un altro carattere senza significato speciale per cmd
.
Questa domanda ha la stessa soluzione [Come si specifica il nome utente in upload ftp da un file batch] (http://stackoverflow.com/questions/23535640/how-do-you-specify-the-username-in-ftp-upload-by-a-batch-file) – jeb
Sei sicuro che la soluzione sia nella domanda a cui ti sei collegato ? Non vedo la risposta, e mi sembrano domande diverse. – user3253319
Siamo spiacenti, hai ragione. Intendevo [BATCH - Sostituire gli spazi nel nomefile con% 20 per arricciare] (http://stackoverflow.com/questions/23538894/batch-replacing-spaces-in-filename-with-20-for-curl) – jeb