[英]Put batch file command DEL into a variable
假设我有一个批处理文件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%
但这没有用。 对于这种情况有什么解决方案吗?
如果有的话,我将不胜感激。
提前致谢
SET ALL_FILE_DELETE_CMD=%ComSpec% /C DEL "%%OUTPUT_PATH%%". /Q
您编码
SET ALL_FILE_DELETE_CMD=DEL "%OUTPUT_PATH%". /Q
解析此行后,所有变量读取都将替换为其值,然后执行该行。 所以
如果%OUTPUT_PATH%
具有初始值,则会在行中替换它,并且%ALL_FILE_DELETE%
使用%ALL_FILE_DELETE%
,都会删除同一文件夹
如果没有值,则没有可替换的值,结果为DEL "%OUTPUT_PATH%". /Q
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%
替换为当前值。变量
如果在批处理文件中使用setlocal EnableDelayedExpansion
,则解决方案非常简单:
在启用延迟扩展之前 ,在第一个批处理文件中定义ALL_FILE_DELETE_CMD
变量,并将%
更改为!
:
SET ALL_FILE_DELETE_CMD=DEL "!OUTPUT_PATH!". /Q
setlocal EnableDelayedExpansion
这就对了! 之后,您只需使用上面显示的变量(启用延迟扩展)即可:
setlocal EnableDelayedExpansion
. . . .
%ALL_FILE_DELETE_CMD%
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.