Windows 7 を使用しており、次のタスクを完了するためにバッチ ファイルを作成したいと考えています。
C:\images
ディレクトリ内の名前が 4 文字のファイルをすべて削除します。例: 1234.jpg 7123.jpg、8923.jpg、7812.jpg、1245.jpg、0067.jpg、0001.jpg、0010.jpg、0060.jpg など。
それは可能ですか?
Windows 7 を使用しており、次のタスクを完了するためにバッチ ファイルを作成したいと考えています。
C:\images
ディレクトリ内の名前が 4 文字のファイルをすべて削除します。例: 1234.jpg 7123.jpg、8923.jpg、7812.jpg、1245.jpg、0067.jpg、0001.jpg、0010.jpg、0060.jpg など。
それは可能ですか?
この解決策は、ドットの前の名前部分が 4 文字であるすべてのファイルと、ドットの前の部分が短いファイルをすべて消去します。
ERASE C:\images\????.*
?
任意の文字を表します (または、まったく文字がない場合もあります。以下を参照してください)。*
任意の文字列を表します。Windows 98 では (そして、これは長い FAT 名を完全にサポートしていない「純粋な」DOS バージョンにも有効であると私は感じています。これには win95 以前と、おそらく Windows Millennium が含まれます)、 は?
正確に 1 文字を表します。
@dbenham のコメントに基づいて、それ以降のバージョンの Windows では、?
0 または 1 文字を表します。
ここで、トリッキーな部分について説明します。先頭にドットがある名前 (つまり、最初のドットの前に 0 文字) はどうでしょうか? 複数のドットを含むファイルはどうですか?
末尾のドットは何かが実行される前に取り除かれるため、 の拡張子abc.def.....
はdef
であり、その基数はabc
です。
ドットは短い名前の固定位置にあり、拡張子のないファイルにも存在します。そのため*.*
、拡張子のないものも含め、すべてのファイルに一致します。
先頭のドット、複数のドット、3 文字を超える拡張子、8 文字を超えるベース (ドットの前) 部分は、短い FAT 名 (DOS 名とも呼ばれる) では無効であるため、長い名前 (Windows で表示される) のファイルは、それらの 1 つには、次のような短い名前が付けられPOBASE~N.POE
ます。
POBASE
ベースの一部である (通常は先頭で、異常な文字が取り除かれている)、~
リテラルのチルダ文字です。N
は 1 桁または複数桁の数字で、通常は既存の名前と衝突しない最小の数字です。POE
拡張子の一部 (通常は先頭から異常な文字を取り除いたもの) で、拡張子は最後のドットの後の部分です。次のファイルをこの順序で作成しました。
.ab
短い名前を持っていたAB~1
a.b.c
短い名前を持っていたAB~1.C
a.bcde
短い名前を持っていたA~1.BCD
a.x y
(スペースに注意してください)短い名前がありましたa.xy
..ab
AB~2
すでにそこにあったため、短い名前AB~1
がありました(最初の例)a.b
、a.b.
、a.b..
、a.b...
はすべて同じファイルの同等の名前です (つまり、作成すると、存在する場合a.b...
は上書きされます)。a.b
dir ????.*
古い Windows 98 システムでコマンドを実行すると、次のファイルが一致します。
AB~1
、長い名前で.ab
AB~1.C
、長い名前でa.b.c
AB~2
、長い名前で..ab
現在、Vista と 7 はほとんどの DOS レガシーをウィンドウから追い出そうとしていますが (しゃれは意図されています)、まだいくつかの名残があります:C:\PROGRA~1
エクスプローラー ウィンドウのアドレス バーに入力すると、(中途半端なのローカライズされたバリアントでありC:\Program files
、FAT 形式の USB キーを接続すると、ファイルには短い名前が付けられます。ワイルドカードがこれらの短い名前と一致するかどうかはわかりませんが、調査する価値さえないことを示すいくつかの「楽しい」事実を次に示します。
C:\Program files
、エクスプローラーに として表示されC:\Programmes
ますが、しようとcd C:\Programmes
すると失敗するため、翻訳された名前はコマンドラインで使用されていないようです。????????.?
(8.1 の疑問符) はa.b.c
(5 文字のみ) と一致しますが、それより短いもの ( ???????.?
7.1 の疑問符など) は一致しません。????????.?
に一致します。foo
foo
結論として、最初 (または最後) のドットの前に正確に 4 文字があるファイルを確実に削除するプログラムを作成する場合は、ワイルドカードを使用しないで、他の解決策を使用してください。
ただし、古いバージョンの Windows には、ぎこちない構文で文字列の長さを取得するための派手なスクリプト機能がすべて備わっているわけではないことに注意してください (つまり、真剣に、それはzsh のグロビング修飾子if "!n:~3,1!" neq "" echo del "%%F"
とほぼ同じくらい悪いということです。
Windows に 3 層のファイル命名 (FAT ショート ネーム、「実際の」ファイル名、および変換されたファイル名) がなく、?
.
はぁ
これにより、正確に 4 文字の名前 (拡張子を除く) と任意の拡張子を持つファイルが削除されます。
例えば:del4chrs "C:\DATA\Junk Folder"
@echo off
setlocal enabledelayedexpansion
if "%1" == "" (
echo Usage del4chrs {folder}
goto :eof
)
if not exist "%~1\nul" (
echo Folder not found.
goto :eof
)
pushd "%~1"
for %%F in (????.*) do (
set n=%%~nF
if "!n:~3,1!" neq "" echo del "%%F"
)
これは、拡張子を無視したベース名が正確に 4 文字であるすべてのファイルを削除するための最も簡単な解決策だと思います。
for /f "eol=: delims=" %%F in ('dir /b /a-d^|findstr /rx "....\.[^.]* ...."') do del "%%F"
4 桁の数字 (拡張子は無視) で構成されるファイルのみを削除するようにソリューションを変更するのは簡単です。
for /f "eol=: delims=" %%F in ('dir /b /a-d^|findstr /rx "[0-9][0-9][0-9][0-9]\.[^.]* [0-9][0-9][0-9][0-9]"') do del "%%F"