2014-03-19 66 views
0

假设我有一个批处理文件extract.bat,它又调用其他一些批处理文件,如parent.bat,operator.bat,contact.bat ....等每个批处理文件我从extract.bat叫是假设使用下面的命令来删除特定目录下的所有文件:将批处理文件命令DEL放入一个变量

DEL "%OUTPUT_PATH%". /Q 

其中“%OUTPUT_PATH%”是我会删除所有文件,是不同的目录批处理文件parent.bat,operator.bat ......等等这样的变量在每一个批处理文件中设置如下:

SET OUTBOUND_PATH=./SAP Outbound Files/ 
SET OUTPUT_PATH=%OUTBOUND_PATH%Parents/ 

显然是把DEL“%OUTPUT_PATH%”。/Q在每个批处理文件中都会执行我所问的内容,但我想知道是否有方法将DEL命令放入某种变量中,以便只从该批处理文件调用该变量将删除指定目录中的文件? 这会阻止在每个文件中写入相同的代码。

我试图设置变量extract.bat如下

SET ALL_FILE_DELETE_CMD=DEL "%OUTPUT_PATH%". /Q 

,并呼吁它parent.bat如下:

%ALL_FILE_DELETE_CMD% 

但没有奏效。 这种情况有没有解决方案?

如果有任何我会明白这一点。

在此先感谢

回答

0

你的代码

SET ALL_FILE_DELETE_CMD=DEL "%OUTPUT_PATH%". /Q 

当此行被解析,所有的变量读取被替换为它们的值,然后执行线。所以

  • 如果%OUTPUT_PATH%有一个初始值,它取代了线与您使用的所有%ALL_FILE_DELETE%时代,同一个文件夹都将被删除

  • ,如果它没有价值,没有什么导致DEL "%OUTPUT_PATH%". /Q

第二种情况是你需要的。

所以,现在我们有

SET "OUTPUT_PATH=" 
SET "ALL_FILE_DELETE_CMD=DEL "%OUTPUT_PATH%" /Q 

或使用该变量的名称花茎字符以避免变量扩展(在批处理文件中,这将不会在命令行工作)

SET "ALL_FILE_DELETE_CMD=DEL "%%OUTPUT_PATH%%" /Q 

但是现在,执行的行是%ALL_FILE_DELETE_CMD%。当解析器处理该行时,它将被转换为DEL "%OUTPUT_PATH%" /Q然后执行。但是,%OUTPUT_PATH%将不会被其值取代。解析器在被替换之前完成了它的工作。因此,命令按原样执行,无法执行您所需的操作。

如何纠正它?强制解析器的第二遍。怎么做?使用CALL命令。

CALL %ALL_FILE_DELETE_CMD% 

行被解析,因为它被读取,导致CALL DEL "%OUTPUT_PATH%" /Q。然后,当CALL命令必须处理线,第二解析器轮被执行,所以执行的最后一行是DEL "C:\whatever\folder\it\is" /q%OUTPUT_PATH%替换成可变

1
SET ALL_FILE_DELETE_CMD=%ComSpec% /C DEL "%%OUTPUT_PATH%%". /Q 
+0

+1,尼斯。我不想在不需要时启动另一个进程,但这非常优雅。 –

0

的当前值如果在批处理文件中使用setlocal EnableDelayedExpansion ,则该解决方案是相当简单:

定义ALL_FILE_DELETE_CMD变量在所述第一批处理文件之前启用延迟扩展和改变%通过!

SET ALL_FILE_DELETE_CMD=DEL "!OUTPUT_PATH!". /Q 
setlocal EnableDelayedExpansion 

就是这样!之后,您只需使用上面显示的变量(启用延迟扩展):

setlocal EnableDelayedExpansion 

. . . . 

%ALL_FILE_DELETE_CMD% 
相关问题