2015-04-14 25 views
2

這讓我瘋狂。基本上,我有一個程序可以將表輸出到一個平面文件中,用於具有相同結構的多個數據庫。這些文件的格式爲tablename_####.dat,其中####是4位數的公司編號。所有這些都創建後,程序然後按tablename組合所有文件,並在結尾添加時間戳。所以,最終的文件名格式爲tablename_YYYYMMDD_HHmmSS.dat。最後,我想刪除所有單個.dat文件,只保留組合的帶時間戳的文件。Windows刪除與通配符不正常刪除

這對所有的表格都適用,除了表格VEX。例如,我有文件:

VEX_1234.dat 
VEX_5678.dat 
VEX_0987.dat 

它們結合形成VEX_20150414_144352.dat。在此之後,我運行命令:

`del *_????.dat` 

這將刪除所有表的個人文件(V_1234.datPAT_9534.dat等),同時保持組合的文件(V_20150414_142311.datPAT_20150413_132113.dat)...除了VEX。它會刪除單個文件和組合文件。不應該只刪除以下劃線,4個字符和「.dat」結尾的文件嗎?

我知道這一定是非常簡單的東西,我錯過了。到底是怎麼回事?

+0

如果使用'dir * _ ????。dat',組合文件是否顯示? –

+0

是的,它的確如此。很奇怪。該文件夾中有大約30個以###### _ ######。dat結尾的其他文件,但唯一一個被拾取的VEX文件。 – Eldroch

回答

1

很可能您的問題是由短8.3文件名引起的。

?通配符可以匹配0或1個字符,前提是一個點。您的文件掩碼*_????.dat將匹配任何具有任意數量字符的名稱,後跟_,後跟0-4個字符,然後是.dat擴展名。棘手的是,它會嘗試匹配長文件名和任何短8.3名稱(如果存在)。

嘗試發出dir /x *.dat,並查看問題文件的簡稱。我懷疑它會匹配你的文件掩碼。

有一些模式是如何得到短名稱的,但除非您知道文件夾中的所有現有短名稱,然後您將依賴未記錄的行爲,否則無法預測任何給定文件的短名稱。

這是一個相當普遍的問題。如果您的文件位於NTFS驅動器上並且擁有管理員權限,則可以禁用短文件名的生成。但是這並不能消除已經存在的短名稱。

最好的通用解決方案是通過FINDSTR管道DIR/B來刪除不需要的文件,並用FOR/F處理結果來單獨刪除每個文件。下面的FINDSTR將排除包含兩個或多個_字符的文件名。

for /f "delims=" %%F in ('dir /b *.dat^|findstr /v "_.*_"') do del "%%F"