2009-07-09 21 views
3

私はバッチファイルを使用して、いくつかのファイルを削除しようとしています。..(WinXPの)を使用して削除ファイルが予期せずに、コマンドプロンプト

私の問題は、私は、ワイルドカードを使用して削除する場合...それは8.3名のaswellをマッチングされています長い名前として。

例: ファイルリスト

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

私が行う場合

Del *.pyc 

それは

私はtehの8.3のDIR/Xすべてを行う場合becuase file1.py以外のすべてを削除します短い名前は.PYCで終わります。

+0

これは、私が以前DELをDIRとしてスペルして結果を見ている習慣になった理由ですが、BATファイルには役立ちません。 – RBerteig

答えて

4

コマンドプロンプトから ワイルドカードを使用してファイル管理を実行すると、 長い拡張子を持つファイルが予期せず表示、コピー、または が削除された になることがあります。

あなたは正しいです、それは完全にパッチを適用のWindows XP SP3を実行している、あまりにも自分のコンピュータ上で起こります。

詳細については、次の「サポート技術情報」(Microsoft Knowledge Base)を参照してください。この1は、すべての帰りの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

* sigh * ..うん..そうだろう。私は後でこれをテストするだろう。 私は.batファイルを配布したいので、私はあまり助けにならないでしょう。私はすべてのマシンでレジストリを設定することはできません。 – ShoeLace

+0

.BATファイルでREGコマンドを使用して、キーをテストおよび調整することはいつでも可能です。それはファイルシステムドライバに当てはまると思われますので、再起動する必要があります。 – RBerteig

4

まあ、あなたのケースでは、おそらくforfilesを使用することができます。

> forfiles /m *.pyc 
"file1.pyc" 

それはCMDのワイルドカード拡張ルールに準拠していません。

また、その後の拡張のためのすべてのファイルとフィルタを列挙することができます

> for %i in (*) do @if %~xi==.pyc @echo %i 
file1.pyc 

どちらの方法がどこ拡張試合の唯一の0.3の一部のファイルをスキップします。

だからあなたはしかし、もう少し複雑なシンプルdel *.pycより確かに、

forfiles /m *.pyc /c del @FILE 

または

for %i in (*) do @if %~xi==.pyc @del "%i" 

のいずれかを使用することができます。

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" 

私は、これは8.3が含まれcmdで行わグロブより良い作品、なぜそれが明らかであると思います名前。ここにはワイルドカードはなく、間違ってはいけません。

forfilesの亜種は、私のWin 7マシンとVistaマシンで動作します。私は推測することしかできませんが、forfilesはcmdと同じワイルドカードマッチングルールを実装していないことを強く疑います。私たちはWindows上にいるので、すべてのプログラムがワイルドカードを展開します。これはUNIXシステムと異なり、ではなく、シェルによって行われたです。どのようにプログラムがこれを行うのかは、時には異なります。明らかに、ここでもそうです。

私はforfilesのアプローチが、8.3の名前がまもなく恐ろしい死をすぐにやめるべきであると考えています。少なくとも、私は彼らが願っています。

+0

Windows Server 2008のみ? –

+0

forfilesは少なくともWindows Vista以降に存在しますが、これまでのXPマシンでも見ましたが、 forコマンドは少なくともNT 4にまでさかのぼります。 – Joey

+0

コマンドプロンプトからDelを使用するOSの動作とC#コードのFileInfo.Delete()を使用すると、これは実際に動作すると懐疑的です。 –

関連する問題