Wie können Sie in cmd.exe eine Variable erhalten, um den Befehl setlocal zu umgehen?

8

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):

%Vor%

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: -)

    
paxdiablo 04.10.2010, 02:55
quelle

3 Antworten

10

"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.

    
Robert Groves 04.10.2010, 03:25
quelle
3

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, ...)

    
jeb 04.10.2010 09:43
quelle
0

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.

    
col 07.07.2013 20:58
quelle

Tags und Links