我正在尝试使用批处理文件删除一些文件..(winxp)
我的问题是当我使用通配符删除时..它匹配8.3名称以及长名称。
例如: 文件列表
file1.py
file1.pyc
file2.pycstlongname
file2.pycstlongnamec
如果我做了
Del *.pyc
它会删除除file1.py
之外的所有内容因为如果我做了一个dir / X所有的8.3短号以.PYC结尾
答案 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名称很快就会死于可怕的死亡。或者至少我希望他们这样做。