【问题标题】:Batch file issue (filenames with long file extension)批处理文件问题(具有长文件扩展名的文件名)
【发布时间】:2018-08-02 05:01:09
【问题描述】:

最近我写了一个简单的BAT文件来删除当前目录及其子目录中所有不必要的*.RES文件:

del /S  "*.res"

但它还删除了所有 *.RESX 文件(哦,我倒霉的 C# 项目......)。

我知道它之前将所有文件名转换为 DOS 8.3 格式,因此任何像“Resources.resx”这样的文件都将具有 DOS 8.3 文件名“resour~1.res ",所以不幸的是它会匹配模式 "*.res"。

问题:是否有简单的方法强制批处理文件考虑完整文件名,不是 8.3 文件名?

至少“说”文件扩展名的长度应该是 3 个字符。

【问题讨论】:

    标签: batch-file wildcard filenames short-filenames


    【解决方案1】:

    这是因为 cmd.exe 中的 dir 由于遗留问题而使用了 FindFirstFile API。该 API matches both long and 8.3 names,因此是 *.res and *.resx would be the same

    最简单的解决方案是使用powershell

    Get-ChildItem *.res -Recurse | Remove-Item
    

    可以像这样从 cmd 调用它(这里我将 cmdlet 替换为它们的常用别名):

    powershell -C "ls *.res -r | rm"
    

    纯批处理会比较麻烦

    for /f "usebackq delims=|" %%f in (`dir /s /b ^| findstr /i /v /r "\.res.$"`) do del %%f
    

    【讨论】:

    • 非常感谢!你帮了我很多。 (我会将第二行包含在我的旧 bat 文件中)。
    • 也可以:...^| findstr /ir "\.res$" ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多