在cmd.exe
中,我经常使用setlocal
命令来避免使用临时变量污染环境变量空间(同时确保启用了命令扩展和延迟环境变量扩展)。
但是,如果我想要其中一个变量可供使用,我该怎么做呢?
请考虑以下代码,它可以获取当前目录的最后一个组成部分(例如对于路径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
后没有被保留。但是,如果我在函数中去掉 setlocal/endlocal
,temp
变量将污染 main
的命名空间。我知道我可以在
func
结尾处使用 set temp=
来移除环境变量,但这并不适用于已经在外部作用域中使用该变量的情况(在这种情况下,它会完全被销毁)。在
cmd.exe
中是否有一种方法允许选择性的环境变量传播到外部作用域,同时防止其他变量影响它?换句话说,您是否可以同时拥有局部变量和返回变量?此外,请不要告诉我有更好的方法来获取最终路径组件。那只是一个示例而已。
实际上,您可以告诉我有更好的方法,因为了解这些方法很好,但这不会回答我的具体问题 :-)
&& set
命令以允许超过一个变量逃逸。 - paxdiablo