Как в cmd.exe можно получить одну переменную для выхода из команды setlocal?

Я часто использую setlocal в cmd.exe , чтобы не загрязнять пространство переменных среды временными переменными (и чтобы гарантировать как расширения команд, так и

Однако я не понимаю, как это сделать, если я действительно хочу, чтобы одна из этих переменных была доступна.

Рассмотрим следующий код, который дает вам последний компонент текущий каталог (поэтому c: \ pax \ dir1 даст вам dir1 ):

        @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

Когда я запустил это, я получаю вывод:

func_folder = dir1
main_folder =

, и вы можете видеть, что Переменная % folder% не сохраняется в endlocal . Однако, если я оставлю se tlocal / endlocal из функции, переменная temp загрязняет пространство имен main .

Я знаю, что могу просто использовать set temp = в конце func , и это удалит переменную среды, но это не касается случая, когда я уже использую эта переменная во внешней области видимости (в этом случае она полностью уничтожается).

Есть ли способ в cmd.exe , чтобы позволить выбранной группе переменных среды распространяться за пределы области видимости, при этом не позволяя другим влиять на нее? Другими словами, можно ли использовать как локальные, так и возвращаемые переменные?


Кроме того, пожалуйста, не говорите мне, что есть лучший способ получить последний компонент пути. Это только примерный случай.

На самом деле, вы можете указать мне лучший способ, так как было бы неплохо узнать, но он не будет отвечать на мой конкретный вопрос: -)

8
задан paxdiablo 4 October 2010 в 02:57
поделиться