我試圖刪除使用批處理文件中的一些文件..(操作系統)意外刪除文件與長擴展使用命令提示符
我的問題是,當我刪除使用通配符..它是匹配的8.3名藏漢作爲長名。
如: 文件列表
file1.py
file1.pyc
file2.pycstlongname
file2.pycstlongnamec
,如果我做了
Del *.pyc
它刪除一切,但file1.py
監守,如果我做了DIR/X所有TEH 8.3短名稱以.PYC結尾
我試圖刪除使用批處理文件中的一些文件..(操作系統)意外刪除文件與長擴展使用命令提示符
我的問題是,當我刪除使用通配符..它是匹配的8.3名藏漢作爲長名。
如: 文件列表
file1.py
file1.pyc
file2.pycstlongname
file2.pycstlongnamec
,如果我做了
Del *.pyc
它刪除一切,但file1.py
監守,如果我做了DIR/X所有TEH 8.3短名稱以.PYC結尾
使用 命令提示符下的 通配符執行文件管理時,具有長擴展名的文件可能會被 意外顯示,複製或刪除 。
你是對的,它也發生在我的電腦上,運行完整補丁的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#應用程序中。行爲令人不安,因此我將註冊表修補程序應用於我的計算機,並且確實有效。
嗯,你的情況,你可以可能使用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名稱很快就會死於可怕的死亡。或者至少我希望他們這樣做。
僅限Windows Server 2008?至少從Windows Vista開始,至少存在 – 2009-07-09 20:18:35
forfiles,儘管迄今爲止我在某些傳統XP機器上也看到了它。 for命令至少可以追溯到NT 4. – Joey 2009-07-09 21:55:32
考慮到操作系統在命令提示符下使用DEL和來自C#代碼的FileInfo.Delete()的行爲,我懷疑這實際上可行。 – 2009-07-09 23:15:37
這就是爲什麼我在很久以前把DEL作爲DIR拼寫成DEL並查看結果的習慣......但是這對BAT文件沒有幫助。 – RBerteig 2009-07-10 00:24:30