1

私のifステートメント(forループ内)が協力していないように見えるという問題があります。私がやろうとしていることはこれです:

  • 一連のzipファイルをループして、それらの名前を005.zip、006.zip、007.zipなどに変更します。
  • ファイル番号を決定する5から始まるカウンターと、005、006などを取得するための00のプレフィックスを保持します。
  • カウンターが10に達したら、プレフィックスを00ではなく0にします。したがって、カウンターが10の場合、そのファイルの名前は010.zipになり、0010.zip、0011.zipなどの代わりに011.zipになります。

これが私がこれまでに持っているものです:

setlocal enableextensions enabledelayedexpansion
SET /a COUNT=5
SET FILE_PREFIX=00
SET /a MAX=10
for %%f in (*.zip) do  (
   if !COUNT! == !MAX! (set FILE_PREFIX=0)
   ren "%%f" %FILE_PREFIX%!COUNT!.zip
   set /a COUNT+=1
   echo !COUNT!
)
endlocal

ifステートメントが機能しないのはなぜですか?ファイルの名前変更は正常に機能しています。FILE_PREFIXを0に変更しないifステートメントだけです。

4

1 に答える 1

3

問題は、コードが遅延拡張を FILE_PREFIX に適用しないため、値が解析時にループ内で 1 回だけ計算されることです。実行時に反復ごとに更新されるのではなく。

行を次のように変更するだけです

ren "%%f" !FILE_PREFIX!!COUNT!.zip

そしてプレスト!それはうまくいくはずです。

しかし、一度修正しても、999 を超える数値ではメソッドが失敗します。

より堅牢な実装については、この代替手段を試してください

SET /a count=1
for %%f in (*.zip) do  (
  set fn=0000!count!
  echo REN "%%f" !fn:~-4!%%~xf
  set /a count+=1
)

ループの内側

  1. コード0000!count!は数値にいくつかのゼロ (この場合は 4) を追加します。したがって、00001、00002、... 00009、000010、000011、... のシーケンスに従います。

  2. 次に!fn:~-4!、最後の N (この例では 4) 以外のすべての数字を削除します。したがって、目的のシーケンス 0001、0002、... 0009、0010、0011、... に従います。

  3. %%~xf拡張子 (このループのすべてのケースで .zip)を抽出し、それを追加して最終的なファイル名を形成します。したがって、0001.zip、0002.zip、... 0009.zip、0010.zip、0011.zip、... という目的のシーケンスに従います。

この方法は、9999 までの任意の数に対して機能します。5 から 6 桁またはそれ以上の桁数に簡単に拡張できます。

于 2012-08-01T15:24:02.563 に答える