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

时间:2009-07-09 19:35:06

标签: windows command-line batch-file

我正在尝试使用批处理文件删除一些文件..(winxp)

我的问题是当我使用通配符删除时..它匹配8.3名称以及长名称。

例如: 文件列表

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

如果我做了

Del *.pyc

它会删除除file1.py

之外的所有内容

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

2 个答案:

答案 0 :(得分:4)

  

使用时执行文件管理   来自命令提示符的通配符,   扩展名为的文件可以是   意外显示,复制或   删除。

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

有关详细信息,请参阅以下Microsoft知识库文章,以及将解决此问题的注册表更改。这个一直回到Windows NT 4.0:

文章编号:164351 - 最后修改:2006年11月1日 - 修订:1.1
Command Prompt's Treatment of Long File Extensions

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

UPDATE:在我编写的测试C#应用程序中也会发生此行为。这种行为令人不安,我将注册表修复程序应用于我的计算机,它确实有效。

答案 1 :(得分:4)

嗯,在您的情况下,您可以使用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 VM上使用cmd会话获得一小段代码:

S:\Temp>for %i in (file1.py,file1.pyc,file2.pycstlongname,file2.pycstlongnamec) do @copy nul %i
        1 Datei(en) kopiert.
        1 Datei(en) kopiert.
        1 Datei(en) kopiert.
        1 Datei(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 Datei(en) kopiert.
        1 Datei(en) kopiert.
        1 Datei(en) kopiert.
        1 Datei(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内容),因此在行上方运行将导致运行以下命令:

if .py == .pyc del "file1.py"
if .pyc == .pyc del "file1.pyc"
if .pycstlongname == .pyc del "file2.pycstlongname"
if .pycstlongnamec == .pyc del "file2.pycstlongnamec"

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

forfiles变种适用于我的Win 7和Vista计算机。我只能猜测,但我强烈怀疑,forfiles没有实现与cmd相同的通配符匹配规则。由于我们在Windows上,每个程序都会为自己扩展通配符。与UNIX系统不同,这是由shell完成的。程序究竟如何做到这一点有时会有所不同,显然它也在这里。

毋庸置疑,我认为forfiles这里的方法更为明智,因为8.3名称很快就会死于可怕的死亡。或者至少我希望他们这样做。