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



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

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

谢谢!

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

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

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

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

  • forfiles(正如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循环捕获where的结果。命令set "PATHEXT="删除执行wherecmd实例中的PATHEXT变量,因为这也会涉及该变量,因此像important-document.doc.com这样的文件也可能无意中与默认值PATHEXT.COM;.EXE;.BAT;.CMD匹配,例如。

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

注:

forfiles /M "*.*"不会匹配没有扩展名的文件(或文件夹((因此请使用/M "*"匹配类似testfile的内容(,但where "*.*"匹配,因此这表明这两个命令具有自己各自的通配符处理/替换例程。

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

您可以在 del 之前添加if exist "%%~dpn?.docx",如果 .doc 和.docx位于同一文件夹中。

相关内容

  • 没有找到相关文章

最新更新