批处理文件变量覆盖

时间:2016-02-22 21:28:39

标签: windows batch-file

我正在创建一个批处理文件来运行命令。我按如下方式设置命令。

set my_command=some_command %out_file%

然后我使用不同的out_file变量

运行(或打算)该命令
set out_file=[some_dir_1]
%my_command%

set out_file=[some_dir_2]
%my_command%

当我运行批处理文件时,它运行my_command,out_file = [some_dir_2]两次,而不是第一次运行out_file = [some_dir_1]

有没有办法每次都可以使用不同的var reset运行相同的命令?

感谢。

1 个答案:

答案 0 :(得分:3)

这似乎有效:

@echo off
setlocal EnableDelayedExpansion
set my_command=some_command ^^!out_file^^!
set out_file=[some_dir_1]
echo %my_command%

set out_file=[some_dir_2]
echo %my_command%
pause

这可以通过将my_command的值设置为some_command !out_file!来实现,因此使用转义的感叹号。当您使用echo !my_command!时,您会看到它包含感叹号。但是,当您使用%my_command%时,感叹号会在%符号后读取,因此它会看到另一个要展开的变量。

您可以想象批处理解析顺序如下:

  1. %var%等变量扩展为其值
  2. !var!等变量扩展为其值
  3. 首先,解析器看到了

      

    %my_command%

    变成了

      

    some_command!out_file!

    然而,然后(由于某种原因,它被称为延迟扩展)开始检查感叹号并将其更改为

      

    some_command [some_dir_2]

    修改

    注意到这也有效:

    @echo off
    setlocal EnableDelayedExpansion
    set "my_command=some_command ^!out_file^!"
    set "out_file=[some_dir_1]"
    echo %my_command%
    
    set "out_file=[some_dir_2]"
    echo %my_command%
    pause