批处理文件Test.cmd
:
@set args=args1
@set value=value1
@if defined value (
@echo args: [%args%], value: [%value%]
@set args=%args% /value=%value%
@echo args: [%args%]
)
@echo args: [%args%]
命令>.\Test.cmd
的输出:
args: [args1], value: [value1]
args: [args1]
args: [args1 /value=value1]
为什么我对@echo args: [%args%]
的每个调用都返回不同的值? (一个没有更新的args值args1
,一个没有更新的args值args1 /value=value1
)
首先,不要在每行的开头使用@
,只需将@echo off
放在脚本的最开始即可,这样做也一样,但是省却了在每行上都需要输入@
的麻烦。
[我也建议在脚本开头使用setlocal
,以避免在CMD窗口/脚本关闭后遗漏在系统上定义的变量。它使变量仅可用于该CMD /脚本实例。
尝试以下代码并注意echo args: [!args!]
@echo off
Setlocal EnableDelayedExpansion
set args=args1
set value=value1
if defined value (
echo args: [%args%], value: [%value%]
set args=%args% /value=%value%
echo args: [!args!]
)
echo args: [%args%]
endlocal
pause
输出:
args: [args1], value: [value1]
args: [args1 /value=value1]
args: [args1 /value=value1]
在这里阅读更多关于EnableDelayedExpansion
的用法... https://ss64.com/nt/delayedexpansion.html