假设我有一个批处理文件extract.bat,它反过来调用一些其他批处理文件,如parent.bat,operator.bat,contact.bat ....等。我从extract.bat调用的每个批处理文件都是假设使用以下命令从特定目录中删除所有文件:
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 :(得分:1)
SET ALL_FILE_DELETE_CMD=%ComSpec% /C DEL "%%OUTPUT_PATH%%". /Q
答案 1 :(得分: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
或在变量名称中使用scape字符以避免变量扩展(在批处理文件中,这不适用于命令行)
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%
替换为变量的当前值
答案 2 :(得分:0)
如果您在批处理文件中使用setlocal EnableDelayedExpansion
,那么解决方案非常简单:
在启用延迟展开之前,在第一个批处理文件中定义ALL_FILE_DELETE_CMD
变量,并按%
更改!
:
SET ALL_FILE_DELETE_CMD=DEL "!OUTPUT_PATH!". /Q
setlocal EnableDelayedExpansion
就是这样!之后,您只需使用上面显示的变量(启用延迟扩展):
setlocal EnableDelayedExpansion
. . . .
%ALL_FILE_DELETE_CMD%