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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage