
次のスクリプトを検討してください:
SETLOCAL EnableDelayedExpansion
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name = %%G
if partial_name GEQ 9200 ( move I:\rosa\transfertmp\%1 L:\OSLDos\Tmp\ ) else ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )
ENDLOCAL
として呼び出されるthisscript 11111.9100.csv
私がやりたいことは、ファイル名の 2 番目のセグメント (9100) に基づいて、ファイルを正しいフォルダーに移動することです。つまり、9200 より大きい場合は 1 つのフォルダーに移動し、そうでない場合は別のフォルダーに移動します。
問題は比較が機能しないことにあるようです。
答え1
デニスは 1 つの問題を特定し、回答の中で解決策を示しました。しかし、まだ他の問題が残っています。
1)set partial_name = %%G
変数名の末尾にスペース、値の先頭にスペースが入ります。コードは次のようになります。set partial_name=%%G
2)値がすでに引用符で囲まれている可能性があります。その場合は、の代わりに%1
を使用して独自の値を追加する前に引用符を削除する必要があります。"%~1"
"%1"
3) あなたの場合は問題にならないかもしれませんが、名前にスペースや特殊文字が含まれている場合は、ファイル パスを引用符で囲むのが一般的に良いでしょう。
4) 数値比較をしたいと仮定します。IF コマンドは、数値を解析するときに SET /A コマンドとほぼ同じルールを使用します。先頭に 0 が付いた数値はすべて 16 進表記として扱われます。8 や 9 などの無効な 16 進数字が見つかった場合、IF は数値比較ではなく文字列比較に戻ります。
たとえば、if 09 lss 8 (echo true) else echo false
を返しますtrue
。
したがって、ファイル名の 2 番目のセグメントの先頭にゼロが含まれる可能性がある場合は、さらに作業を行う必要があります。
set "partial_name="
for /f "tokens=2 delims=." %%G in ("%~1") do (
for /f "tokens=* delims=0" %%N in ("%%G") do set /a "partial_name=%%N"
if not defined partial_name set "partial_name=0"
)
if %partial_name% GEQ 9200 (
move "I:\rosa\transfertmp\%1" "L:\OSLDos\Tmp\"
) else (
move "I:\rosa\transfertmp\%1" "L:\LdisOSLDos\Tmp\"
)
答え2
実際には、変数の内容ではなく、文字列partial_name
を と比較しています。9100
なのでp GEQ 9
、これは true と評価されます。
また、にset partial_name = %%G
設定されます(末尾と先頭のスペースに注意してください)。partial_name
%%G
両方の問題を解決するには、変数名をパーセント記号 ( ) で囲み、等号記号 ( )%
を囲むスペースを削除します。=
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name=%%G
if %partial_name% GEQ 9200 ( move I:\rosa\transfertmp\%1 L:\OSLDos\Tmp\ ) else ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )