Innerhalb einer Blockanweisung (a parenthesised series of statements)
, das ist gesamte Block analysiert und dann ausgeführt. Jede %var%
innerhalb des Blocks wird durch den Wert dieser Variablen zum Zeitpunkt der Analyse des Blocks ersetzt - vor der Blockausführung - das gleiche gilt für eine FOR ... DO (block)
.
Daher wird IF (something) else (somethingelse)
mit den Werten von %variables%
zum Zeitpunkt IF
ausgeführt.
Zwei allgemeine Wege, dies zu überwinden, sind 1) zu verwenden und setlocal enabledelayedexpansion
!var!
anstelle von %var%
verwenden den geänderten Wert von var
oder 2) für den Zugriff auf ein Unterprogramm aufrufen weitere Verarbeitung auszuführen, um die geänderten Werte verwenden.
Beachten Sie daher die Verwendung von CALL ECHO %%var%%
, die den geänderten Wert var
anzeigt.
Ihr Code enthält zwei separate Variablen mit der Bezeichnung f
.
Die erste ist die "Metavariable" der Schleifensteuerung f
genannt und referenziert durch %%f
.
Die zweite ist die gemeinsame Umgebungsvariable f
, die durch die set "f=..."
-Anweisung festgelegt wird.Diese Variable kann mit %f%
aber innerhalb eines block
zugegriffen werden kann, wird es den Wert, den es hatte zu behalten erscheinen, wenn die Steuerung for
(in der Tat analysiert wurde, jede %var%
bei Parse-Zeit durch den Wert von var
an, dass ausgetauschte Zeit)
metavariables
kann nicht in String-Manipulation Aussagen wie Substrings oder Ersatzstoffe verwendet werden, nur gemeinsame Umgebungsvariablen für diese Operationen verwendet werden können, daher müssen Sie den Wert des Metavariable f
der Umgebungsvariablen f
und zuweisen dann führen Sie die String-Substitution Aufgabe von die Umgebungsvariable f
.
Der Twist ist natürlich, dass Sie delayedexpansion
und die !var!
Syntax verwenden müssen, um auf den geänderten Wert einer Umgebungsvariablen innerhalb eines Blocks zuzugreifen.
So
setlocal enabledelayedexpansion
for...%%f...do (
echo %%f
set "f=%%f"
set "f=!f:\=/!"
echo !f!
)
echo just for demonstration %f% !f! %%f
Dieser Wert von f
in der erforderlichen Weise setzt (natürlich können Sie immer den Namen Verwirrung zu vermeiden, ändern ...)
Die letzte Zeile ist einfach zu Zeigen Sie, dass der von f
erfasste Endwert außerhalb der Schleife als %f%
oder !f!
abgerufen werden kann und dass %%f
außerhalb des Kontexts liegt und als %f
angezeigt wird.
Ein anderer Weg, dies ohne delayedexpansion
zu tun ist,
for...%%f...do (
echo %%f
set "f=%%f"
call set "f=%%f:\=/%%"
call echo %%f%%
)
echo just for demonstration %f% !f! %%f
der Unterschied die Verwendung von call
zu sein und die %
s verdoppelt, und die letzte Zeile !f!
wie genau das zeigen wird - eine wörtliche, da außerhalb von delayedexpansion
Modus, !
ist nur ein weiteres Zeichen ohne besondere Bedeutung zu cmd
.
Diese Frage hat die gleiche Lösung (http [Wie Sie die Benutzername in FTP-Upload von einer Batch-Datei angeben]://stackoverflow.com/questions/23535640/how-do-you-specify-the-username-in-ftp-upload-by-a-batch-file) – jeb
Sind Sie sicher, dass die Lösung in der Frage enthalten ist, mit der Sie verknüpft sind ? Ich sehe die Antwort nicht und sie sehen für mich wie verschiedene Fragen aus. – user3253319
Entschuldigung, Sie haben Recht. Ich meinte [BATCH - Leerzeichen im Dateinamen mit% 20 für curl ersetzen] (http://stackoverflow.com/questions/23538894/batch-erplacing-spaces-in-filename-with-20-for-curl) – jeb