ディレクトリに多数の SQL スクリプトがあり、先頭に数字が付けられています。
現在、次のスクリプトを使用してそれらをループできます。
@ECHO OFF
FOR /r . %%F IN (*.sql) DO (
ECHO File:"%%F"
)
ただし、Windows がディレクトリ内のファイルを読み取る方法のため、10 と 11 は 2 より先に読み取られます。
ディレクトリ内の各ファイルをプレフィックスの順にループするにはどうすればよいですか?
ディレクトリに多数の SQL スクリプトがあり、先頭に数字が付けられています。
現在、次のスクリプトを使用してそれらをループできます。
@ECHO OFF
FOR /r . %%F IN (*.sql) DO (
ECHO File:"%%F"
)
ただし、Windows がディレクトリ内のファイルを読み取る方法のため、10 と 11 は 2 より先に読み取られます。
ディレクトリ内の各ファイルをプレフィックスの順にループするにはどうすればよいですか?
以下のバッチ ファイルは、必要なファイル名に先行ゼロを挿入します。
@echo off
setlocal EnableDelayedExpansion
for /F "delims=" %%f in ('dir /B *.sql') do (
set "filename=%%f"
if "!filename:~1,1!" equ "-" ren "%%f" "0%%f"
)
編集:新しいソリューションが追加されました
以下のバッチ ファイルは、ファイルの名前を変更せずに正しい順序でファイルを示しています。
@echo off
setlocal EnableDelayedExpansion
rem Create an array with filenames in right order
for %%f in (*.sql) do (
for /F "delims=-" %%n in ("%%f") do (
set "number=00000%%n"
set "file[!number:~-6!]=%%f"
)
)
rem Process the filenames in right order
for /F "tokens=2 delims==" %%f in ('set file[') do (
echo %%f
)
編集 - JSORT.BAT を使用した新しいシンプルなソリューション
ネイティブのバッチ SORT コマンドは非常に制限されています。数値に基づいて数字で文字列をソートする機能など、多くの便利な機能を提供する便利なJSORT.BAT ソート ユーティリティを作成しました。JSORT.BAT は純粋なスクリプト (ハイブリッド JScript/バッチ) であり、サードパーティの exe ファイルを必要とせずに、任意の Windows マシンでネイティブに実行されます。
を使用してファイルを数値でリストできます
dir /b /a-d *.sql^|jsort /n /i
結果を繰り返したい場合は、単にコマンドを FOR /F ループに入れます。
for /f "delims=" %%F in ('dir /b /a-d *.sql^|jsort /n /i') do echo %%F
完全なドキュメントは、 を使用してコマンド ラインから入手できますjsort /?
。
JSORT.BATより前のオリジナルのソリューション
ファイル名を変更せずに、バッチを使用して必要なことを行うことができます。標準入力で正規表現の検索と置換を実行し、結果を標準出力に書き込むREPL.BAT と呼ばれるハイブリッド JScript/バッチ ユーティリティを使用すると、非常に効率的です。このユーティリティは、XP 以降のすべての Windows マシンで実行される純粋なスクリプトであり、サードパーティの実行ファイルは必要ありません。完全なドキュメントがスクリプト内に埋め込まれています。
REPL.BAT が現在のディレクトリにあるか、さらには PATH 内のどこかにあると仮定すると、次の例.sql
では、番号で始まるファイルを目的の並べ替え順序で繰り返し処理します。書かれているように、5桁までの数字をサポートしています。より大きな数をサポートするように簡単に拡張できます。
@echo off
for /f "tokens=2 delims=:" %%F in (
'dir /b /a-d *.sql^|repl "^(\d+).*" "00000$1:$&" a^|repl ".*(\d{5}:)" "$1"^|sort'
) do echo %%F
これは本当にパイプの力を示しています:)
複雑な IN() 句は次のように機能します。
次に、親の FOR /F が結果を読み取り、元のファイル名を 2 番目の:
区切りトークンとして解析します。