6

ディレクトリに多数の SQL スクリプトがあり、先頭に数字が付けられています。

ここに画像の説明を入力

現在、次のスクリプトを使用してそれらをループできます。

@ECHO OFF
FOR /r . %%F IN (*.sql) DO (
    ECHO File:"%%F"
)

ただし、Windows がディレクトリ内のファイルを読み取る方法のため、10 と 11 は 2 より先に読み取られます。

ここに画像の説明を入力

ディレクトリ内の各ファイルをプレフィックスの順にループするにはどうすればよいですか?

4

7 に答える 7

7

以下のバッチ ファイルは、必要なファイル名に先行ゼロを挿入します。

@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
)
于 2013-09-11T18:56:29.777 に答える
2

編集 - 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() 句は次のように機能します。

  1. すべての .sql ファイルを一覧表示する
  2. 数字で始まるファイルを探し、一致する各名前を、先頭に 5 つのゼロ、その後にコロン、元の名前が続く先頭の数字に置き換えます。
  3. 先頭の数字を置き換え、最後の 5 桁のみを保持します
  4. 結果を並べ替える

次に、親の FOR /F が結果を読み取り、元のファイル名を 2 番目の:区切りトークンとして解析します。

于 2013-09-11T19:49:15.620 に答える