Ich benutze setlocal
häufig in cmd.exe
, um den Umgebungsvariablenraum nicht mit temporären Variablen zu belasten (und um sicherzustellen, dass sowohl Befehlserweiterungen als auch verzögerte Erweiterungen aktiv sind).
Ich weiß jedoch nicht, wie ich das machen soll, wenn ich tatsächlich möchte, dass eine dieser Variablen verfügbar gemacht wird.
Betrachten Sie den folgenden Code, der Ihnen die letzte Komponente des aktuellen Verzeichnisses gibt (so würde c:\pax\dir1
Ihnen dir1
geben):
Wenn ich das ausführe, bekomme ich die Ausgabe:
%Vor% und Sie können sehen, dass die Variable %folder%
die endlocal
nicht überlebt. Wenn ich jedoch das setlocal/endlocal
von der Funktion weglasse, verschmutzt temp
varaiable den Namensraum von main
.
Ich weiß, dass ich set temp=
am Ende von func
verwenden kann. Dadurch wird die Umgebungsvariable entfernt, aber das deckt nicht den Fall ab, in dem ich diese Variable bereits außerhalb des Gültigkeitsbereichs verwende zerstört in diesem Fall).
Gibt es eine Möglichkeit in cmd.exe
, einer ausgewählten Gruppe von Umgebungsvariablen die Möglichkeit zu geben, sich nach außen zu bewegen, ohne dass andere davon betroffen sind? Mit anderen Worten, können Sie sowohl lokale Variablen als auch Rückgabevariablen haben?
Sagen Sie mir bitte nicht, dass es eine bessere Möglichkeit gibt, die endgültige Pfadkomponente zu erhalten. Das ist nur ein Beispiel.
Eigentlich könntest du mir einen besseren Weg sagen, denn es wäre nett zu wissen, aber es wird nicht meine spezifische Frage beantworten: -)
"Die Lösung besteht darin, die Tatsache zu nutzen, dass die CMD-Shell Variablen zeilenweise auswertet. Wenn ENDLOCAL in derselben Zeile wie die SET-Anweisung (en) platziert wird, ergibt dies das gewünschte Ergebnis: "Quelle: ss64.com
Also das Endlocal von func ändern: zu diesem ...
%Vor%... wird Ihnen das gewünschte Verhalten geben.
Zum besseren Lesen und Formatieren können Sie Klammern verwenden.
%Vor%Das funktioniert, weil ein Befehlsblock wie eine einzelne Zeile erweitert wird. Der Parser erweitert die ersten beiden Phasen (Prozent-Variablen und Escape-Zeichen), bevor der Befehlsblock ausgeführt wird. Die anderen Phasen werden zeitlich ausgeführt (wie verzögerte Expansion, zweite Expansionsphase durch CALL, ...)
endlocal && set aaa=%aaa% && set bbb=%bbb%
setzt permanent aaa
und bbb
außerhalb von setlocal
und behält diese Einstellung in der Eingabeaufforderung für die Verwendung einer anderen Batchdatei bei (wenn die Batchdatei, die den setlocal
enthält, von einer anderen Batchdatei aufgerufen wurde) Batch-Datei hat jetzt die neuen Einstellungen für aaa
und bbb
Danke an alle, die über endlocal && set
erklärt haben. Ich ging durch unzählige Websites, um eine Lösung für diese unkomplizierte Situation zu finden.
Tags und Links windows scope cmd batch-file