我是新手,所以请放轻松! :)
基本上,我正在编写一个批处理文件,用于删除不的文件夹中包含特定扩展名类型的文件。
所以例如,如果我有以下文件夹
C:\MUSIC\FLAC\JAZZ\Jazzysong.ape
我需要一些可以删除JAZZ文件夹的代码,因为.ape是FLAC文件夹的错误文件类型。
任何帮助都会很棒,因为我尝试了findstr
,exist
的变体并写入文本文件并尝试使用dir /s /b
我迷失了
答案 0 :(得分:2)
在决定删除目录之前,我仍然不确定要对目录执行哪种测试 - “是否存在某种文件类型”或“是否确定文件类型不存在“。你的帖子似乎暗示它是后者,所以它必须是误导性的标题。出于这个答案的目的,我假设它确实是“是否某个文件类型不存在”测试你想要的。
这是解决问题的一种非常简单和谦逊的方法:
@ECHO OFF
FOR /D /R "D:\directory_with_flac_files_only" %%D IN (*) DO (
IF NOT EXIST "%%D\*.flac" ECHO RD /S /Q "%%D"
)
也就是说,只需遍历目录树,并为每个子目录检查它是否包含必要的文件。如果没有,请告别它。 (为了安全起见,我在ECHO
命令之前添加了RD
,这样它确实说出了再见但是没有执行实际操作,以防万一你急于执行脚本没有进一步阅读。)
然而,这种做法是错误的。即使目录可能不包含所需文件,其 sub - 目录也可能,并且此脚本不会验证该事实。因此,您可能会丢失一些宝贵的FLAC文件。 (而我刚刚救了你的悲痛。)
因此,这里需要更精细的内容。我提出的方法包括以下步骤:
将目录分为两类:包含具有必要扩展名的文件和不包含文件的目录。
处理不包含文件的目录列表:
1)如果在另一个列表中找到目录,则省略它;
2)如果在其他列表中找不到,请将其删除。
(如果您想知道:第一个列表中的目录确实可以在第二个列表中找到其子目录路径的 part 。)
我远没有确信这是最好的方法,但至少它应该有效(无论如何它确实适用于我)。这是我的实现:
@ECHO OFF
:: set the params
SET "ext=flac"
SET "rootdir=D:\dir_with_flac_files_only"
SET "todelete=%TEMP%\dirs_to_delete.txt"
SET "topreserve=%TEMP%\dirs_to_preserve.txt"
:: clear the temp lists
TYPE NUL >"%todelete%"
TYPE NUL >"%topreserve%"
:: sort the dirs
FOR /D /R "%rootdir%" %%D IN (*) DO (
IF EXIST "%%D\*.%ext%" (
ECHO %%D>>"%topreserve%"
) ELSE (
ECHO %%D>>"%todelete%"
)
)
:: process the sorted lists
FOR /F "usebackq delims=" %%D IN ("%todelete%") DO (
FIND "%%D" <"%topreserve%" >NUL || ECHO RD /S /Q "%%D" 2>NUL
)
您仍然可以在ECHO
之前看到RD
,但请考虑一下我的说法,'如果我错过了某些内容......'。运行脚本并查看输出。如果它只正确显示了要删除的目录,请删除ECHO
并再次运行脚本以继续操作。