我正在使用Windows 10。
我在基本目录(此处为“ d:\ dir”)的不同子目录中有许多相同的命名文件夹(假设名称为“ data”)。
如何删除所有名为“数据”的文件夹的内容(仅包含文件)而不删除自身?
例如,三个文件夹:
d:\ dir \ data d:\ dir \ tmp1 \ data d:\ dir \ tmp3 \ tmp2 \ data
在Windows命令提示符窗口中,以下命令行可用于仅删除及其子目录的所有data
目录中的所有文件(而非文件夹)D:\dir
:
for /F "delims=" %I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| findstr /E /I /C:"\data"') do @del /A /F /Q "%I\*"
在Windows批处理文件中,将相同的命令行编写如下:
@echo off
for /F "delims=" %%I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /C:"\data"') do del /A /F /Q "%%I\*"
命令FOR在一个单独的命令过程中执行,该过程以后台%ComSpec% /C
命令行开始:
dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"
ComSpec
通常定义环境变量,%SystemRoot%\System32\cmd.exe
就像在Windows控制面板-系统-高级系统设置-环境变量...中查看系统环境变量所看到的那样。默认情况下,环境变量是使用Windows目录的路径定义的。换句话说,默认情况下,FOR在大多数Windows PC上使用选项和命令行在和之间指定的方式执行。另请参阅Wikipedia文章,其中包含预定义的Windows环境变量列表。SystemRoot
C:\Windows\System32.exe
/C
('
')
命令DIR输出以处理STDOUT(标准输出)
/B
/AD
(属性目录)/S
*data
D:\dir
/S
。如果没有符合这些条件的目录条目,DIR将输出一条错误消息来处理STDERR(标准错误)。通过使用将其重定向到设备NUL,可以抑制此错误消息2>nul
。
因此,对于给定的示例,DIR的输出为:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
用于处理STDOUT的DIR的输出重定向|
至用于处理下一个命令FINDSTR的STDIN(标准输入)。
FINDSTR在流搜索读取STDIN逐行
/I
\data
/E
。因此,FINDSTR输出以处理后台命令的STDOUT处理行\data
尾的所有行,这再次是给定示例的:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
必须使用FINDSTR过滤命令DIR的输出,以排除具有类似名称的目录,该目录也将由DIR输出,因为通配符要求不输出其及其子目录的所有子目录,而是输出其及其子目录中的所有目录。MyData
*
D:\dir\data
data
D:\dir
阅读有关使用命令重定向运算符的Microsoft文章,以获取有关2>nul
和的说明|
。当Windows命令解释器在执行命令FOR之前,Windows命令解释器处理此命令行时,重定向操作符>
和|
必须^
在FOR命令行上使用脱字符号转义为文字字符,该命令在后台启动的单独命令进程中执行嵌入式命令行。dir
带选项的FOR/F
最终捕获所有输出,以处理启动的命令进程的STDOUT,并在启动终止后逐行处理此输出cmd.exe
。
空行始终被FOR忽略,但DIR和FINDSTR没有输出空行。
默认情况下,FOR也会忽略所有以a开头的行,;
这是默认的行尾字符。但是在这种情况下,FOR捕获的所有行都不会以分号开头,因为所有行都以开头D:
。因此eol=;
可以保留默认值。否则eol=|
,通常最好是处理文件/文件夹名称列表,因为没有文件/文件夹名称可以包含竖线。
默认情况下,FOR将使用正常空格和水平制表符作为字符串定界符将每一行拆分为子字符串,并且仅将第一个空格/制表符分隔的字符串分配给指定的循环变量I
。目录路径中的文件夹名称data
可能包含空格字符。因此,指定了一个空的定界符列表,该列表delims=
将禁用行分割行为,从而导致I
始终将分配给循环变量的已找到data
文件夹的全限定名称分配给循环变量。
FOR为data
分配给I
命令的每个目录执行:
del /A /F /Q "%I\*"
%I
在执行DEL之前将其替换为当前分配给循环变量的完整合格目录名称I
。
命令DEL用于删除文件。它不会删除目录。该选项/A
用于删除所有与文件属性无关的文件,包括具有隐藏属性集的文件,如果没有选项,DEL将不会删除该文件/A
。/F
需要使用option来强制删除具有只读属性集的文件,如果没有option,则不会删除该文件/F
。该选项/Q
用于禁止询问用户是否确实*
由DEL删除了所有与之匹配的文件。
完整的合格目录名称必须用双引号引起来,因为它可能包含空格或这些字符之一,&()[]{}^=;!'+,`~
这需要使用"
命令的参数字符串,如最后一个帮助页面上CMD的帮助所解释的那样,该命令在运行时输出命令提示符窗口cmd /?
。
请注意,DEL无法删除没有NTFS许可权的用户删除文件或正在由应用程序打开的文件,以防止在打开应用程序时删除文件的方式删除文件。DEL为每个文件输出一条错误消息,由于缺少NTFS或文件访问权限,该文件无法删除。
为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
del /?
dir /?
echo /?
findstr /?
for /?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句