【问题标题】:How to delete files recursively & skip deletion, when subfolder contains .one files?当子文件夹包含 .one 文件时,如何递归删除文件并跳过删除?
【发布时间】:2020-02-18 05:44:27
【问题描述】:

我的目标是删除 Z: 驱动器的所有文件夹和子文件夹中名为 Open Notebook.onetoc2 的文件,但不要从那些包含 *.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 文件很重要。

提前非常感谢! :)

【问题讨论】:

  • 为什么不更具体地说明您想要搜索的内容或以某种方式匹配它? do if "%~xa"==".one" ... 这个问题还是有点不清楚,因为你首先说你想删除一个名为 Open Notebook.onetoc2 的文件,然后你说你不想,只想删除 .one 文件。
  • 如果我正确理解您的问题,也许这就是您想要的: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"
  • @Compo - 你明白了!这非常有效! :)) 谢谢!
  • @GerhardBarnard - 也感谢您指出看待事物的方式。

标签: batch-file command-line directory delete-file del


【解决方案1】:

我的评论建议是从 运行的答案:

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:\ 命名的所有文件Open Notebook.onetoc2,我们使用Dir(输入dir /? 用于其用法)。为了安全起见,我已从该输出中排除任何系统文件或重新解析点,并将任何错误消息重定向到 NUL 设备,这会阻止任何消息(如果不存在)被传递到 Do

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

如果满足条件,我们使用Del 命令删除文件。由于文件是只读的,我们使用/A/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"

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2011-01-15
    相关资源
    最近更新 更多