我正在使用 Windows 10。
我在基目录(此处为“d:\dir”)的不同子目录中有许多同名文件夹(假设名称为“data”)。
如何删除所有名为“数据”的文件夹的内容(仅包含文件)而不删除它们自己?
例如三个文件夹:
d:\dir\数据 d:\dir\tmp1\data d:\dir\tmp3\tmp2\data
答案1
在 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\*"
命令为了%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 中的环境变量控制面板-系统-高级系统设置-环境变量...。环境变量SystemRoot
默认定义为 Windows 目录的路径。换句话说为了在大多数 Windows PC 上,默认情况下使用C:\Windows\System32.exe
选项和在和/C
之间指定的命令行执行。另请参阅 Wikipedia 文章,其中列出了预定义的('
')
Windows 环境变量。
命令目录要处理的输出标准输出(标准输出)
- 由于选择,采用裸格式
/B
- 由于选项
/AD
(属性目录)而仅是目录的名称 - 由于选项而具有完整路径
/S
- 匹配通配符模式
*data
- 在指定目录中
D:\dir
- 及其所有子目录也因为选项而改变
/S
。
目录将输出错误消息来处理标准错误(标准错误)没有符合这些条件的目录条目。此错误消息通过将其重定向到设备来抑制空值和2>nul
。
因此输出目录例如:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
输出目录处理标准输出重定向至|
处理标准输入(标准输入)下一个命令查找字符串。
查找字符串在流读取中搜索标准输入逐行
- 由于选项而不区分大小写
/I
- 字面解释的字符串
\data
- 由于选项,必须在行尾找到它
/E
。
所以查找字符串要处理的输出标准输出后台命令处理所有以\data
结尾的行,再次给出示例:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
过滤命令输出目录和查找字符串有必要排除具有类似名称的目录,MyData
该目录也输出目录因为需要通配符*
才能输出的不是及其子目录的所有子目录,而是及其子目录中的D:\dir\data
所有data
目录。D:\dir
阅读有关使用命令重定向运算符2>nul
有关和的解释|
。重定向运算符>
和|
必须用脱字符^
转义为了当 Windows 命令解释器在执行命令之前处理此命令行时,该命令行将被解释为文字字符为了它dir
在后台启动的单独命令进程中执行嵌入的命令行。
为了使用选项/F
捕获所有内容输出最后进行处理标准输出已启动命令进程,并在已启动终止后逐行处理此输出cmd.exe
。
空行总是被忽略为了,但没有空行输出目录和查找字符串。
为了默认情况下,还会忽略以 开头的所有行,;
这是默认的行结束符。但所有被捕获的行为了在这种情况下,不要以分号开头,因为所有行都以 开头。因此可以保留D:
默认值。否则,在处理文件/文件夹名称列表时通常是最好的,因为没有文件/文件夹名称可以包含竖线。eol=;
eol=|
为了默认情况下,将使用普通空格和水平制表符作为字符串分隔符将每行拆分为子字符串,并将第一个空格/制表符分隔的字符串分配给指定的循环变量I
。目录路径中的文件夹名称data
可能包含空格字符。因此,指定了一个空的分隔符列表,用于禁用行拆分行为,从而始终将找到的文件夹的完整限定名称delims=
分配给循环变量。I
data
为了对分配给命令的每个data
目录执行:I
del /A /F /Q "%I\*"
%I
在执行之前被替换德尔通过当前分配给循环变量的完整限定目录名I
。
命令德尔用于删除文件。它不会删除目录。该选项/A
用于删除所有文件(无论其属性如何),包括具有隐藏属性集的文件,这些文件德尔如果没有选项 则不会删除/A
。此选项/F
也是强制删除具有只读属性的文件所必需的,如果没有选项 则不会删除/F
。此选项/Q
用于禁止询问用户是否真的*
应该删除所有匹配的文件德尔。
完整限定目录名必须用双引号括起来,因为它可能包含空格或这些字符之一,这需要在命令的参数字符串周围&()[]{}^=;!'+,`~
使用,如帮助中所述"
命令 在命令提示符窗口中运行时输出的最后一个帮助页面cmd /?
。
请注意德尔无法删除那些用户没有 NTFS 权限删除的文件,或者那些当前正由某个应用程序打开的文件,而且打开方式不允许删除正在被该应用程序打开的文件。德尔对于由于缺少 NTFS 或文件访问权限而无法删除的每个文件输出一条错误消息。
为了了解所使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
del /?
dir /?
echo /?
findstr /?
for /?
答案2
按照你的例子,你必须调用:
Get-ChildItem -Recurse d:\dir | Where-Object { ($_.DirectoryName) -and (Split-Path $_.DirectoryName -Leaf) -eq 'data' } | Remove-Item
答案3
递归枚举所有名为“data”的文件夹,然后删除其内容。
$base_dir = 'D:\dir'
$name = 'data'
Get-ChildItem $base_dir -Recurse -Force | Where-Object {
$_.PSIsContainer -and
$_.Name -eq $name
} | Select-Object -Expand FullName | ForEach-Object {
Remove-Item "$_\*" -Recurse -Force
}
$_.PSIsContainer
在 PowerShell v3 及更新版本中,您可以使用参数-Directory
来替换过滤条件Get-ChildItem
。