Q:所以.bat程序中对于文件夹的名字,能使用“*”作为通配符吗?
A:您好,参数中是否可以使用通配符,取决于命令本身的参数是否支持通配符。
这是rd命令的帮助信息:
删除一个目录。
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S 除目录本身外,还将删除指定目录下的所有子目录和
文件。用于删除目录树。
/Q 安静模式,带 /S 删除目录树时不要求确认
作为对照,这是del命令的帮助信息:
删除一个或多个文件。
DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
names 指定一个或多个文件或者目录列表。
通配符可用来删除多个文件。
如果指定了一个目录,该目录中的所
有文件都会被删除。
/P 删除每一个文件之前提示确认。
/F 强制删除只读文件。
/S 删除所有子目录中的指定的文件。
/Q 安静模式。删除全局通配符时,不要求确认
/A 根据属性选择要删除的文件
属性 R 只读文件 S 系统文件
H 隐藏文件 A 准备存档的文件
I 无内容索引文件 L 重新分析点
O 脱机文件 - 表示“否”的前缀
如果命令扩展被启用,DEL 和 ERASE 更改如下:
/S 开关的显示句法会颠倒,即只显示已经
删除的文件,而不显示找不到的文件。
所以,
虽然rd "C:\2020*"命令确实符合在CMD命令下的通配符语法,
但rd命令的path参数本身不支持通配符所以会返回文件名、目录名或卷标语法不正确。
Q:如果不能,有何替代方案?
A:虽然rd命令本身不支持通配符,但可以通过cmd的for循环命令的通配符参数补足这个功能的缺失,
因此,如果要做到您提出的需求,可以执行以下命令:
注意:数据无价,该命令执行后将会自动删除所有C盘根目录下开头为“2020”的文件,不会移动到回收站
for /d %i in (C:\2020*) do rd /S /Q "%i"
命令解释:
for:循环命令
/d:遍历所有文件夹
%i:变量名,循环产生的路径字符将在 do 后面用此代替
in:for循环命令的语法关键词,用于指示后面将是一个文件集合
(C:\2020*):文件的集合,可以指定多个路径,这里就可以使用您所熟悉的通配符语法
do:指示后面将是要循环执行的语句
rd:删除文件夹
/S:删除目录下的所有子目录和文件(由于通常文件夹都不是空的,不加这个参数所有的有内容文件夹将会报错,只有空的文件夹才会被删除)。
/Q:安静模式,删除目录树时不要求确认(考虑到您已经确定要删除此开头的文件夹,且已经到了需要使用批处理的地步,揣测您要删除的文件夹数量应不会少于20个,如果不加这个参数,每当删除非空目录时,批处理将会中断并要求您手动确认是否删除,如果您需要逐个确认,请去除这个参数)
"%i":要删除的文件夹路径,这里使用了for命令中定义的变量,考虑到目录中可能包含空格,所以需要使用双引号将路径包起,以免因空格导致找不到路径而执行错误。
注意:在.bat批处理中使用 for 命令时,变量需要双写百分号,请将命令中的 %i 替换为 %%i