首页 > 解决方案 > 当子文件夹包含 .one 文件时,如何递归删除文件并跳过删除?

问题描述

我的目标是在驱动器的所有文件夹和子文件夹中删除一个名为Open Notebook.onetoc2Z:的文件,但不要从那些包含*.one文件(实际 OneNote 文件)的文件夹中删除该文件。

我已经在网上搜索了这个问题的解决方案,但没有找到并且不知道如何自己构建一个这样的命令。

我已经做到了这一点:

for /F "delims=" %a in ('dir /b /s "Open Notebook.onetoc2"') do @if exist %~da%~pa*.one echo del: "%~da%~paOpen Notebook.onetoc2" 

似乎完成了 99%,但仍然坚持这种情况,“如果存在 *.one”也将 .onetoc2 文件包含在“搜索”中,这是不需要的。我只希望“搜索”找到 .one 文件,而不是其中的 .onetoc2,因为如果该目录中存在 .one 文件,跳过删除 .onetoc2 文件很重要。

提前谢谢了!:)

标签: batch-filecommand-linedirectorydelete-filedel

解决方案


我的评论建议作为运行的答案:

For /F "Delims=" %A In ('Dir /B/S/A-D-S-L "Z:\Open Notebook.onetoc2" 2^>NUL')Do @If Not Exist "%~dpA*.one" Del /A/F "%A"

根据For /F语法:For /F ["options"] %variable In ('command')Do command [command-parameters]我们首先需要看一下'command'. 我们想输出所有以Z:\named 为根的文件Open Notebook.onetoc2,我们使用Dir, (输入dir /?它的用法)。为了安全起见,我已从该输出中排除任何系统文件或重新解析点,并将任何错误消息重定向到NUL设备,这会阻止任何消息(如果不存在)被传递到Do.

For循环会将每个文件作为一个完全限定的路径传递给Dometavariable %A。我们想首先验证除了返回的任何文件之外,.one不存在另一个具有扩展名的文件。为此,我们使用If Not Exist条件,(参见if /?其语法)%A只能使用 , 扩展至其驱动器和路径(即任何返回Open Notebook.onetoc2文件的父目录)(此语法在命令帮助信息中可用%~dpAForfor /?

如果满足条件,我们使用Del命令删除文件。由于文件可以是只读的,我们使用/Aand/F选项,(参见del /?其语法)


如果你想做同样的事情,但是从一个,它看起来更像这样:

@For /F "Delims=" %%A In ('Dir /B/S/A-D-S-L "Z:\Open Notebook.onetoc2" 2^>NUL')Do @If Not Exist "%%~dpA*.one" Del /A/F "%%A"

推荐阅读