2016-02-22 142 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改進了一下。 –