0

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

del /S  "*.res"

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

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

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

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

4

1 回答 1

1

这是因为dircmd.exe 中的FindFirstFileAPI 由于遗留问题而使用。该 API匹配 long 和 8.3 名称,因此*.res 和 *.resx 将是相同的

最简单的解决方案是使用 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
于 2018-02-22T11:33:13.820 回答