使用命令提示符意外删除具有长扩展名的文件

我想删除一些文件使用batch file..(winxp)

我的问题是,当我删除使用通配符。它匹配8.3名称和长名称。

例如:文件列表

file1.py file1.pyc file2.pycstlongname file2.pycstlongnamec 

如果我做了

 Del *.pyc 

它删除了一切,但file1.py

因为如果我做一个dir / X所有的8.3短名都以.PYC结尾

从命令提示符使用通配符执行文件管理时,具有较长扩展名的文件可能会意外地显示,复制或删除。

你是对的,它也发生在我的电脑上,运行完全修补的Windows XP SP3。

请参阅下面的Microsoft知识库文章以获取更多信息和注册表更改,以解决此问题。 这个一直回到Windows NT 4.0:

文章编号:164351 – 最后修改:2006年11月1日 – 修订:1.1
命令提示符处理长文件扩展名

http://support.microsoft.com/kb/164351

更新:这种行为也发生在我写的测试C#应用程序。 行为是令人不安的,我把注册表修复程序应用到我的电脑,它确实工作。

那么,在你的情况下,你可以使用forfiles

 > forfiles /m *.pyc "file1.pyc" 

它不符合cmd的通配符扩展规则。

您也可以枚举所有文件,然后筛选扩展名:

 > for %i in (*) do @if %~xi==.pyc @echo %i file1.pyc 

这两种方法都跳过只有.3部分扩展名匹配的文件。

所以你可以使用

 forfiles /m *.pyc /c del @FILE 

要么

 for %i in (*) do @if %~xi==.pyc @del "%i" 

无可否认,比简单的del *.pyc复杂一点。

ETA:由于有人怀疑这是否可行,在Win XP SP 2虚拟机上的cmd会话中有一小段:

 S:\ Temp> for%i in(file1.py,file1.pyc,file2.pycstlongname,file2.pycstlongnamec)do @copy nul%i
         1 file(en)kopiert。
         1 file(en)kopiert。
         1 file(en)kopiert。
         1 file(en)kopiert。

 S:\ Temp> dir / b
 file1.py
 file1.pyc
 file2.pycstlongname
 file2.pycstlongnamec

 S:\ Temp> del * .pyc

 S:\ Temp> dir / b
 file1.py

 S:\ Temp> del *

 S:\ Temp> for%i in(file1.py,file1.pyc,file2.pycstlongname,file2.pycstlongnamec)do @copy nul%i
         1 file(en)kopiert。
         1 file(en)kopiert。
         1 file(en)kopiert。
         1 file(en)kopiert。

 S:\ Temp> for%i in(*)do @if%〜xi ==。pyc @del“%i”

 S:\ Temp> dir / b
 file1.py
 file2.pycstlongname
 file2.pycstlongnamec

没有德国的信息,我希望它表明,上述方法确实工作。


为了解释一下它为什么起作用,我们可以看看这个命令:

 for %i in (*) do @if %~xi==.pyc @del "%i" 

第一部分是微不足道的。 for %i in (*)只是枚举当前目录中的所有文件。 然后我们检查扩展名; %~xi扩展为完整扩展(不是8.3东西),所以在上面运行会导致下面的命令运行:

如果.py == .pyc del“file1.py”
如果.pyc == .pyc del“file1.pyc”
如果.pycstlongname == .pyc del“file2.pycstlongname”
 if .pycstlongnamec == .pyc del“file2.pycstlongnamec”

我希望这很明显,为什么这比cmd包含8.3个名字所做的更好。 这里没有通配符,没有什么错。

forfiles变种确实在我的Win 7和Vista机器上工作。 我只能猜测,但我强烈怀疑,forfiles不执行与cmd相同的通配符匹配规则。 由于我们在Windows上,每个程序都为自己扩展通配符。 与UNIX系统不同,这不是由shell完成的。 这个程序到底有多不同,显然它也在这里。

不用说,我认为在这里文件的方法更加明智一点,因为8.3的名字很快就会死掉。 或者至少我希望他们这样做。