我有一个包含以下文件结构的文件夹:
等。模式持续n次。
如果文件夹/文件层次结构中存在更高级别的文件,如何删除子目录中的文件?所以,如果更高级别的文件夹中存在相同的文件名,我试图摆脱子目录中的重复文件。
答案 0 :(得分:0)
这可以通过两个 FOR 循环和一个 IF 条件来完成:
@echo off
rem Process all files in current directory and all its subdirectories.
rem For each file first check if the file still exists after processing
rem the other files before.
rem For each file still existing search for this file in its directory
rem and all its subdirectories with skipping from output of command DIR
rem the first line which is the current file to keep.
for /F "delims=" %%I in ('dir * /A-D /B /S 2^>nul') do (
if exist "%%I" (
for /F "skip=1 delims=" %%J in ('dir "%%I" /A-D /B /S 2^>nul') do del "%%J" 2>nul
)
)
注意:执行该批处理文件时不应删除该批处理文件。这可以通过将其存储在目录树中来进行处理,或者只在目录树中处理一次,或者至少在目录树的最高级别运行批处理文件来处理来实现。
当然可以在第一个目录上指定例如*.jpg *.png *.tif
而不仅仅*
来处理JPEG,PNG和TIFF文件,并忽略所有其他文件目录树。
请将此修改版本用于没有真正删除文件的测试运行:
@echo off
for /F "delims=" %%I in ('dir * /A-D /B /S 2^>nul') do (
echo File: "%%I"
if exist "%%I" (
for /F "skip=1 delims=" %%J in ('dir "%%I" /A-D /B /S 2^>nul') do echo del "%%J" 2>nul
)
)
当真正完成文件删除时,输出的行数会减少,因为if exist "%%I"
并不总是如此,因为这是批处理代码的情况。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
del /?
dir /?
echo /?
if /?
另请阅读Microsoft文章Using Command Redirection Operators,了解2>nul
通过将错误消息从句柄 STDERR 重定向到设备 NUL 来取消错误消息的说明
重定向运算符>
必须在带有插入符^
的第一个 FOR 命令行中进行转义,才能在处理 FOR Windows命令解释程序的命令行,但稍后由后台执行 FOR 的单独命令进程执行重定向操作符,以执行 DIR 命令行并捕获其写入句柄的输出< strong> STDOUT ,可通过 FOR 进行处理。