この問題にはさまざまなアプローチが考えられます。
たとえば、@Loadmaster の answer のように、同じ宛先に移動する必要があるファイルのセットごとに個別のコマンドを使用できます。
かなり異なるアプローチは、すべてのファイルを繰り返し処理し、それぞれの宛先を決定することです。このアプローチの実装は次のようになります。
@ECHO OFF
FOR %%I IN ("D:\path\to\source\file-*-tmp.txt") DO (
FOR /F "tokens=2 delims=-" %%C IN ("%%C") DO (
IF %%C == 1 (
MOVE %%I D:\path\to\destination\1
) ELSE IF %%C == 2 (
MOVE %%I D:\path\to\destination\2
) ELSE IF ...
...
)
)
つまり、単純なFOR
ループを使用して、特定のフォルダーに格納され、特定のマスクに一致するファイルを反復処理します。ループ本体では、もうFOR /F
1 つのループを使用して名前を分割し、宛先を決定する部分に到達します。その部分を取得したら、一連のネストされたIF
コマンドを使用して、可能なすべての値と個別に比較し、一致するたびに、MOVE
それに応じてファイルを配置するコマンドを指定します。
上記のスクリプトを変更して、宛先パスをより便利に指定できるようにすることもできます。特に、スクリプトの開始時に、すべての可能な宛先パスを含む一連の変数を準備できます。内側のループの本体では、複数IF
の の代わりに、抽出された部分に対応する「宛先変数」が存在するかどうかを判断する 1 つだけを使用します。その場合は、その変数に格納されているパスを使用してファイルを移動します。このバリエーションを実装する方法は次のとおりです。
@ECHO OFF
SETLOCAL
SET "dest1=D:\path\to\destination\1"
SET "dest2=D:\path\to\destination\2"
...
FOR %%I IN ("D:\path\to\source\file-*-tmp.txt") DO (
FOR /F "tokens=2 delims=-" %%C IN ("%%C") DO (
SETLOCAL EnableDelayedExpansion
IF DEFINED dest%%C MOVE %%I !dest%%C!
ENDLOCAL
)
)