我经常发现自己在cmd.exe
使用setlocal
,以避免用临时variables污染环境variables空间(并确保命令扩展和延迟扩展都处于活动状态)。
然而,如果我真的想让这些variables中的一个变为可用的话,我就不知所措了。
考虑下面的代码,它给你当前目录的最后一个组件(所以c:\pax\dir1
会给你dir1
):
@echoclosures :主要 setlocal enableextensions enabledelayedexpansion 调用:func echo.main_folder =%文件夹% ENDLOCAL goto:eof :FUNC setlocal enableextensions enabledelayedexpansion 设定温度=%cd% 设置文件夹= :funcloop1 如果不是“x%temp:〜-1%”==“x \”( 设置文件夹=!temp:〜-1 !!文件夹! 设置temp =!temp:〜1,-1! goto:funcloop1 ) echo.func_folder =%文件夹% ENDLOCAL goto:eof
当我运行这个,我得到的输出:
func_folder = dir1 main_folder =
你可以看到%folder%
variables不能在endlocal
生存。 但是,如果我离开函数的setlocal/endlocal
, temp
variables会污染main
的名称空间。
我知道我可以在func
的末尾使用set temp=
,这将删除环境variables,但是不包括我已经在外部作用域中使用该variables的情况(在这种情况下它将被完全销毁) 。
有没有一种方法在cmd.exe
允许select一组环境variables传播到外部范围,同时仍然防止其他人影响它? 换句话说,你可以同时拥有局部variables和返回variables吗?
另外,请不要告诉我有一个获得最终path组件的更好方法。 这只是一个例子。
其实,你可以告诉我一个更好的方法,因为知道它会很高兴,但它不会回答我的具体问题:-)
“解决这个问题的方法就是利用CMD shell逐行评估变量这一事实 – 所以将ENDLOCAL放在与SET语句相同的行上,以提供我们想要的结果:”source: ss64.com
所以改变func的endlocal:这个…
endlocal & set folder=%folder%
…会给你你想要的行为。
为了更好地阅读和格式化,可以使用括号。
call :func resultVar echo(%resultVar% goto :eof :func setlocal set var=2 ( endlocal if "%1" NEQ "" set "%1=%var%" goto :eof )
这是有效的,因为一个命令块会像一条线一样展开。 解析器在执行命令块之前展开前两个阶段(百分比变量和转义字符)。 其他阶段执行时间(如延迟扩展,通过CALL第二阶段扩展,…)
endlocal && set aaa=%aaa% && set bbb=%bbb%
在setlocal
之外永久设置aaa
和bbb
,并在命令提示符下保存这个设置以供另一个批处理文件使用(例如,如果包含setlocal
的批处理文件是从另一个批处理文件中调用调用批处理文件现在将具有aaa
和bbb
的新设置
感谢谁解释了endlocal && set
。 我通过很多网站去解决这个简单的问题。