Windows 命令行 - 删除具有特定扩展名的文件,但不删除扩展名包含子字符串的文件(doc 不是 docx)

Windows command line - Remove files with specific extension, but not ones where extension contains substring (doc not docx)

我正在使用 wordconv.exe 将一堆旧的 doc 文件转换为 docx。之后我想删除原来的doc文件。

当我在命令行上 运行 "del /S *.doc" 时,它会同时删除 doc 和 docx 文件。无论如何让它只删除 .doc 文件?

谢谢!

让我们尝试使用这样的东西:

forfiles /s /m *.doc /c "cmd /c del @file"

问题是文件的短 8.3 名称,因为对于内部 cmd 命令和许多外部命令,通配符(*?)也匹配他们。例如,像 important-document.docx 这样的文件有一个像 import~1.doc 这样的短名称,它与 *.doc.

相匹配

有些命令以不同方式处理通配符:

  • forfiles (as already demonstrated in the by Michał Mielczarek):

    forfiles /S /M "*.doc" /C "cmd /C if @isdir==FALSE del @relpath"
    

    @isdir 查询检查当前项目是否为文件并允许跳过文件夹。

  • where:

    for /F "delims=" %%F in ('set "PATHEXT=" ^& where /R "." "*.doc"') do @del "%%~F"
    

    周围的for /F loop捕获了where的结果。命令 set "PATHEXT=" 删除执行 wherecmd 实例中的 PATHEXT 变量,因为这也涉及该变量,所以像 important-document.doc.com 这样的文件可以例如,也可能无意中与 .COM;.EXE;.BAT;.CMD 的默认值 PATHEXT 匹配。

    尽管 where 方法看起来有点复杂,但您可能更喜欢它,因为它比 forfiles 更快,尤其是在目录树很大的情况下。

N。 B.:

forfiles /M "*.*" 不匹配没有扩展名的文件(或文件夹)(所以使用 /M "*" 来匹配类似 testfile 的东西),但是 where "*.*" 匹配,所以这个表示这两个命令有自己的通配符 handling/substitution 例程。

for /f "tokens=*" %%? in ('dir /b /a-d /s *.doc') do if  /i "%%~x?"==".doc"  del "%%~f?"

如果 .doc 和 .docx 在同一文件夹中,您可以在删除前添加 if exist "%%~dpn?.docx"