2016-02-22 144 views
2

我正在创建一个批处理文件来运行命令。我按如下设置命令。批处理文件变量覆盖

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每次?

谢谢。

回答

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!变量,其价值

因此,首先,解析器看到

%my_command%

其中获得化作

some_command!out_file!

然而,然后(它被称为延迟膨胀的一个原因)开始检查感叹号和改变了到

some_command [some_dir_2]

EDIT

Just注意到这也是有效的:

@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 
+0

这工作,但只是好奇....什么^^!与%不同吗? – ScottF

+0

@ScottF加入了更好的解释。 –

+0

@ScottF改进了一下。 –