まあ、あなたのケースでは、おそらく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の名前がまもなく恐ろしい死をすぐにやめるべきであると考えています。少なくとも、私は彼らが願っています。
これは、私が以前DELをDIRとしてスペルして結果を見ている習慣になった理由ですが、BATファイルには役立ちません。 – RBerteig