在 *NIX 系统中,您可以轻松键入rmdir *
以删除所有空目录.
。rmdir 将会抱怨非空目录并且不会删除它们。
基本上,如果你有一棵这样的树:
/
d0/
file
d1/
d0/
d2/
d3/
rmdir *
然后从内部运行/
将导致d2/
和d3/
仅被删除。d0/
和d1/
将被单独留下并回显有关它们非空的错误,以防止内容丢失在不确定的状态。
/
d0/
file
d1/
d0/
我找不到与此等效的 Windows 版本。最接近的版本是rmdir /s .
,它等效于rm -r .
,只不过它拒绝删除,.
因为 shell 正在使用它。不确定它是否rm -r .
也拒绝删除.
。还没有测试过。
与 *NIX 一样rmdir
,rmdir
如果目录非空,Windows 将拒绝删除该目录。但是,似乎没有像典型的 那样的通配符选择器*
,这很奇怪,因为该标记可以在其他任何地方使用。
正是这种东西让我对 Windows 命令行感到沮丧。如果我有 4,000 个目录,那么rmdir
明确地执行每个目录显然不是一个明智的选择。一定有更好的方法。
我尝试for
按照使用帮助中的语法构建一个语句(for /?
)
FOR %variable IN (set) DO command [command-parameters]
...要得到...
for %f in * do rmdir %f
%f
以及它的几种变体(例如将第二个改为%f%
、将语法全部大写(尽管我知道它不区分大小写)、*
用括号括起来等)。这些都不起作用。所有都失败了,并出现了无法解释且无用的错误,例如:
%f was unexpected at this time.
* was unexpected at this time.
(注意:我在交互式提示中尝试执行此操作,而不是在脚本中)
或者在变化的情况下(*)
......
>for %f in (*) do rmdir %f
>rmdir file
The directory name is invalid.
>dir
Volume in blah blah blah
Directory of blah
blah blah <DIR> .
blah blah <DIR> ..
blah blah <DIR> nonemptydir
blah blah <DIR> emptydir
blah blah 1 file
1 File(s) 1 bytes
4 Dir(s) huge number bytes free
...它甚至没有触及目录。
我不明白为什么它会这样做。我按照帮助中描述的语法进行操作。
Powershell 不是一个选项。我需要能够在保证已安装的 shell 中执行此操作,即 Jeff Zeitlin 告诉我 Powershell 保证 >= Windows 7不过,cmd.exe
。cmd.exe
还是比较推荐的。
答案1
您的FOR
语句需要/D
开关:FOR /D %I in (*) do ...
。这会导致完全跳过文件,只处理文件夹(目录)。由于RMDIR/RD
不会删除非空目录,这似乎就是您想要的;请注意,不同版本的 Windows 可能会对尝试删除非空目录的错误做出不同的反应。
参考文献:SS64FOR
和FOR /D
(适用于文件夹)
答案2
%f
这时候出乎意料。*
这时候出乎意料。
for %f in * do rmdir %f
使用时里面您需要将 s 加倍的批处理文件%
。
这放你所指的是一个括号中的表达式。括号是不是选修的。
更正的命令行:
for %f in (*) do rmdir %f
正确的批处理文件:
for %%f in (*) do rmdir %%f
在线帮助中对此进行了记录:
> for /?
Runs a specified command for each file in a set of files.
FOR %variable IN (set) DO command [command-parameters]
%variable Specifies a single letter replaceable parameter.
(set) Specifies a set of one or more files. Wildcards may be used.
command Specifies the command to carry out for each file.
command-parameters
Specifies parameters or switches for the specified command.
To use the FOR command in a batch program, specify %%variable instead
of %variable. Variable names are case sensitive, so %i is different
from %I.
并且在为了:
如果您在命令行而不是批处理程序中使用 FOR 命令,则只需使用一个百分号:
%G
而不是%%G
。FOR 参数
第一个参数必须使用单个字符来定义,例如字母 G。
FOR %%G IN ...
- Windows CMD 命令行的 AZ 索引
- Windows CMD 命令的分类列表
- 为了- 有条件地执行命令多次。