In cmd.exe, wie können Sie eine Variable erhalten, um den Befehl setlocal zu entkommen?
Ich finde mich häufig mitsetlocal
innerhalbcmd.exe
um zu vermeiden, dass der Umgebungsvariablenraum mit temporären Variablen verschmutzt wird (und um sicherzustellen, dass sowohl Befehlserweiterungen als auch verzögerte Erweiterungen aktiv sind).
Ich bin jedoch ratlos, 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 (alsoc:\pax\dir1
würde dir gebendir1
):
@echo off :main setlocal enableextensions enabledelayedexpansion call :func echo.main_folder = %folder% endlocal goto :eof :func setlocal enableextensions enabledelayedexpansion set temp=%cd% set folder= :funcloop1 if not "x%temp:~-1%"=="x\" ( set folder=!temp:~-1!!folder! set temp=!temp:~1,-1! goto :funcloop1 ) echo.func_folder = %folder% endlocal goto :eof
Wenn ich das starte, bekomme ich die Ausgabe:
func_folder = dir1
main_folder =
und Sie können sehen, dass das%folder%
Variable überlebt das @ nicendlocal
. Wenn ich jedoch das @ weglassetlocal/endlocal
aus der Funktion, demtemp
varaible verschmutzt den Namespace vonmain
.
Ich weiß, ich kann nur @ verwendset temp=
am Ende vonfunc
und dies entfernt die Umgebungsvariable, aber das deckt nicht den Fall ab, in dem ich diese Variable bereits im externen Bereich verwende (in diesem Fall wird sie vollständig zerstört).
Gibt es einen Weg incmd.exe
, um einer ausgewählten Gruppe von Umgebungsvariablen die Weitergabe an den externen Bereich zu ermöglichen und gleichzeitig zu verhindern, dass andere sie beeinflussen? Können Sie also sowohl lokale Variablen als auch Rückgabevariablen haben?
Aside, bitte sagen Sie mir nicht, dass es einen besseren Weg gibt, die endgültige Pfadkomponente zu erhalten. Das ist nur ein Beispiel.
Eigentlich Siekönne Erzähl mir einen besseren Weg, da es nett wäre, es zu wissen, aber es wird meine spezifische Frage nicht beantworten: -)