[英]Batch file to delete folder if it contains specific file
我正在尝试创建将执行以下操作的批处理文件:
例如,我要查找的文件是“ test.txt”,主文件夹是“ C:\\ Test”,其结构如下:
\A
\B with test.txt
\C
\C\C0
\C\C1
\C\C2 with test.txt
\D
\D\D0
\D\D1 with test.txt
\D\D1\D10
\D\D1\D11
每个文件夹中都有一些其他随机文件。
在此示例脚本中,应删除以下文件夹及其所有内容:
C:\Test\B
C:\Test\C\C2
C:\Test\D\D1
我尝试了几种不同的脚本,但没有成功。 批处理文件直接放在“ C:\\ Test \\”中
我检查的第一个脚本是:
for /R %%f in (test.txt) do @IF EXIST %%f @echo "%%f"
它只列出了内部包含text.txt的文件夹的正确路径。 因为它有效,所以我尝试按照以下步骤删除仅要测试的文件:
for /R %%f in (test.txt) do @IF EXIST %%f del /q /s /f "*.*"
它删除了主文件夹中的所有文件以及批处理文件所在的所有子文件夹,以及批处理文件本身。
我尝试编辑其他几个脚本以符合我的条件,但是结果很明显。 我能够创建的最后一件事是:
for /R %%p in (test.txt) do @IF EXIST %%p (rd "%%p" /s || del "*.*" /s/f)
我在这里省略了“ / q”参数,以便能够看到要删除的内容。 它会正确找到第一个“ text.txt”文件。 如果选择“ y”删除此文件,脚本将返回错误消息,指出该文件夹不合适。 然后它开始从主文件夹和所有子文件夹中删除文件,而批处理文件是第一个受害者(它每次询问我是否要删除特定子文件夹中的文件)。 子文件夹不会被删除,只会删除其内容。
我没主意了。
当问题似乎难以解决时,将其分成两个部分。
1)将目录树列出到一个临时文本文件中,每行一个:
dir /ad /b /s %1 >%TEMP%\Temporary.txt
2)迭代列出的目录,并对每个目录执行所需的操作:
for /f %%g in (%TEMP%\Temporary.txt) do if exist %%g\test.txt rd /s /q %%g
也许您对此有点过高。 如果您正在读取文件,则只需执行rmdir
,它将自动删除目录中的文件和子文件夹。 您的del *.*
没有设置路径,将从工作目录中删除。
请记住,如果在脚本中使用引号,则您的测试文件夹不应包含引号。 所以应该是:
c:\\任何文件夹\\文件夹
c:\\任何文件夹\\文件夹2
这应该很好。
for /F "eol=; tokens=*" %%p in (test.txt) do @if exist %%p (echo rd /S "%%p")
删除echo
一旦你高兴,它只会删除你想要什么。 使用/ Q选项还可以帮助您删除而不用每次都确认。
for /F "eol=; tokens=*" %%p in (test.txt) do @if exist %%p (rd /S /Q "%%p")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.