batch-file - 当子文件夹包含 .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 文件很重要。
提前谢谢了!:)
解决方案
我的评论建议作为从命令行运行的答案:
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
循环会将每个文件作为一个完全限定的路径传递给Do
metavariable %A
。我们想首先验证除了返回的任何文件之外,.one
不存在另一个具有扩展名的文件。为此,我们使用If Not Exist
条件,(参见if /?
其语法)。%A
只能使用 , 扩展至其驱动器和路径(即任何返回Open Notebook.onetoc2
文件的父目录)(此语法在命令帮助信息中可用)。%~dpA
For
for /?
如果满足条件,我们使用Del
命令删除文件。由于文件可以是只读的,我们使用/A
and/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"
推荐阅读
- reactjs - 如何使用 react js/react native 中的函数发送道具值
- mysql - 在 MySQL 中强制日期时间为 UTC?
- javascript - 如何从字符串数组中获取只有数字的数组
- angular - Angular 找不到我的自定义库的模块
- html - 为什么当容器宽度小于 100% 且内容内边距大于 700px 时“box-sizing:border-box”不起作用?
- awk - bash / grep:从 json 中获取多个匹配元素
- javascript - 如何使用html链接到同一目录中的页面?
- c# - 订阅/取消订阅列表中的事件
- python - 使用 Python spaCy 的命名实体识别
- machine-learning - 正则化如何防止过拟合?