2009-07-09 45 views
3

我試圖刪除使用批處理文件中的一些文件..(操作系統)意外刪除文件與長擴展使用命令提示符

我的問題是,當我刪除使用通配符..它是匹配的8.3名藏漢作爲長名。

如: 文件列表

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

,如果我做了

Del *.pyc 

它刪除一切,但file1.py

監守,如果我做了DIR/X所有TEH 8.3短名稱以.PYC結尾

+0

這就是爲什麼我在很久以前把DEL作爲DIR拼寫成DEL並查看結果的習慣......但是這對BAT文件沒有幫助。 – RBerteig 2009-07-10 00:24:30

回答

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#應用程序中。行爲令人不安,因此我將註冊表修補程序應用於我的計算機,並且確實有效。

+0

*嘆氣* ..是的..這是對的..我會在稍後測試。 我不會幫助我太多,因爲我想分發.bat文件..我無法在每臺機器上設置註冊表。 – ShoeLace 2009-07-09 19:56:04

+0

您可以隨時在.BAT文件中使用REG命令來測試和調整密鑰。它看起來像適用於文件系統驅動程序,因此需要重新啓動才能生效。 – RBerteig 2009-07-10 00:23:09

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:因爲有人很懷疑這是否會工作,從一個雙贏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" 

我希望這是顯而易見的,爲什麼這個工程不是由CMD做文件名匹配,其中包括8.3更好名。這裏沒有通配符,沒有任何錯誤。

forfiles變種確實在我的Win 7和Vista機器上工作。我只能猜測,但我強烈懷疑,forfiles沒有實現與cmd相同的通配符匹配規則。由於我們在Windows上,每個程序都爲自己擴展通配符。與UNIX系統不同,這是由shell完成的而不是。這種程序究竟有多不同,有時也會有所不同,顯然它也在這裏。

不用說,我認爲forfiles的方法更合理一點,因爲8.3名稱很快就會死於可怕的死亡。或者至少我希望他們這樣做。

+0

僅限Windows Server 2008?至少從Windows Vista開始,至少存在 – 2009-07-09 20:18:35

+0

forfiles,儘管迄今爲止我在某些傳統XP機器上也看到了它。 for命令至少可以追溯到NT 4. – Joey 2009-07-09 21:55:32

+0

考慮到操作系統在命令提示符下使用DEL和來自C#代碼的FileInfo.Delete()的行爲,我懷疑這實際上可行。 – 2009-07-09 23:15:37