Zuweisen einer Variablen in einer Schleife (Batchdatei) [Duplikat]
Ich werde mein Gesamtproblem auf eine sehr einfache Frage reduzieren. Wie ordne ich eine Variable innerhalb einer for-Schleife innerhalb einer Batchdatei zu?
Wenn ich die folgende Batchdatei in Windows verwende:
for %%f in (.\Update\!dos\*.zip) do (
echo %%f
set FileName3=%%f
echo %FileName3%
pause
)
Es wird echoder richtige Wert für, %%faber echoes ist nichts für%FileName3%
Ich habe es dann getestet, indem ich direkt FileName3einen direkten Wert wie zugewiesen habe test, was fehlgeschlagen ist.
Bei der Suche nach Lösungen ist ein üblicher Zeiger zu verwenden SETLOCAL enabledelayedexpansion
Wenn ich das jedoch oben in meine Batch-Datei einfüge, wird es einfach nicht mehr ausgeführt. Obwohl ich denke, dass dies wahrscheinlich Teil der Lösung ist, kann ich nicht feststellen, ob die Batchdatei zum Testen ausgeführt werden kann.
Um ganz klar zu sein SETLOCAL enabledelayedexpansion: Wenn ich oben in meiner Batch-Datei auf die Datei doppelklicke, passiert nichts. Wenn ich es über eine Befehlszeile ausführe, kehrt es einfach zur Eingabeaufforderung zurück, als wäre nichts passiert.
Meine Frage ist also, wie kann ich eine Variable innerhalb einer Schleife in einer Batchdatei zuweisen? Wenn die Antwort verwendet werden soll SETLOCAL enabledelayedexpansion, warum führt das Hinzufügen zu meiner Batch-Datei dazu, dass sie absolut nichts bewirkt?
Antworten
In Ihrem Fall funktioniert das Aktivieren der verzögerten Erweiterung oben in Ihrem Skript nicht. Der Grund dafür ist, dass ein Teil Ihres Quellspeicherorts das !Zeichen enthält, das aufgrund einer verzögerten Erweiterung im Namen weggelassen wird und Ihr Skript endet, weil der Pfad .\Update\dos\nicht vorhanden ist.
Der Trick besteht darin, die verzögerte Erweiterung nur dort zu aktivieren, wo Sie sie benötigen.
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
If Not Exist "Update\!dos\*.zip" GoTo :EOF
For %%G In ("Update\!dos\*.zip") Do (
Echo %%G
Set "FileName3=%%G"
SetLocal EnableDelayedExpansion
Echo !FileName3!
EndLocal
)
Pause
Was Sie jedoch beachten müssen, ist, dass alle Ihre Variablen, die während der Schleifen SetLocaldefiniert werden, beim nächsten Mal undefiniert werden EndLocal. Dies bedeutet, wenn Sie diese Variablen später im Code benötigen, müssen Sie eine Methode verwenden, um diese über die EndLocalBarriere zu übergeben. Dies liegt jedoch außerhalb des Bereichs Ihres spezifischen Codebeispiels und wurde in diesem Beispiel nicht berücksichtigt.