在批处理cmd文件中使用set来更新变量值

sat*_*kum 2 cmd batch-file set echo

批处理文件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%]
Run Code Online (Sandbox Code Playgroud)

命令输出>.\Test.cmd

args: [args1], value: [value1]
args: [args1]
args: [args1 /value=value1]
Run Code Online (Sandbox Code Playgroud)

为什么我的每次调用都会@echo args: [%args%]返回不同的值?(一种没有更新的参数值,args1,一种具有更新,args1 /value=value1

小智 5

首先,不要@在每行的开头使用,而是放在@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
Run Code Online (Sandbox Code Playgroud)

输出:

args: [args1], value: [value1]
args: [args1 /value=value1]
args: [args1 /value=value1]
Run Code Online (Sandbox Code Playgroud)

阅读有关EnableDelayedExpansion此处使用的更多信息... https://ss64.com/nt/delayedexpansion.html