バッチファイルで前ゼロ付き連番ファイル生成

| コメント(3) | トラックバック(0)

windowsのバッチファイルにやらせることなんてたいした内容じゃないんだけど、いかんせん文法が貧弱すぎて簡単なことなのに時間を食うのがいつものパターン。忘れないようにメモっておくよ。

ファイル生成をする際に、時々連番を使ったファイル名を使用したいという場合がある。まぁ大抵の場合、エクスプローラー上での見た目をよくするため、前ゼロ使って桁数を揃えるわけです。

先にコード載せるとこんな感じ。
http://gist.github.com/175608

@echo off
:: test of "sequence number file"
setlocal enabledelayedexpansion 
 
set prefix=C:\path\to\hoge.
set extension=.bk
set pad=2
 
for /l %%i in (1, 1, 15) do (
	set num=00000%%i
	set file_path=%prefix%!num:~-%pad%!%extension%
	echo !file_path!
)
 
pause

実行結果は

C:\path\to\hoge.01.bk
C:\path\to\hoge.02.bk
C:\path\to\hoge.03.bk
C:\path\to\hoge.04.bk
C:\path\to\hoge.05.bk
C:\path\to\hoge.06.bk
C:\path\to\hoge.07.bk
C:\path\to\hoge.08.bk
C:\path\to\hoge.09.bk
C:\path\to\hoge.10.bk
C:\path\to\hoge.11.bk
C:\path\to\hoge.12.bk
C:\path\to\hoge.13.bk
C:\path\to\hoge.14.bk
C:\path\to\hoge.15.bk
続行するには何かキーを押してください . . .

後はfile_pathを好きなコマンドに料理させてあげればよい。
前ゼロ付きまくりな数値を右から指定桁分取り出すだけだが、ちゃんと動かすまでに時間かかっちゃったなぁ...。

::でコメントになるって今まで知らんかった...。こっちの方がremよりも見やすくて良い。しかし、doブロック内で::使うとエラーになるのがなんだかなぁ...。

forループ中に宣言した変数を正しく展開するには
setlocal enabledelayedexpansion とやって遅延環境変数の展開機能を有効化しないとまずいらしい。展開するときは%ではなく!を使う。これを知らなくてすげーハマった。


参考:
連番フォルダ作成バッチ:.knowledge - frog.raindrop.jp
[窓] DOSでのforループ | 今日もねむひ(-。-)zZZ
CMD.EXEの遅延環境変数の展開 - KOBUN

トラックバック(0)

トラックバックURL: http://hoge.sub.jp/blog-cgi/mt/mt-tb.cgi/536

コメント(3)

> set num=00000%%i

00000ではなく100000のほうがいいと思います。
例えば) 00001だとすると0が切り捨てられ(?)ました。
自分はファイル名をまとめて連番に変更するバッチファイルをつくりました。
参考までに。
@echo off
setlocal enabledelayedexpansion
set /p file1="変更するファイル名を入力してください >"
set /p file2="変更後のファイル名を入力してください(拡張子は除く) >"
set /p num="連番に変更する場合は連番の桁数を指定してください(1 to 8) >"
set /p extension="変更後の拡張子を入力してください >"
set /a N=100000001
for %%i in (%file1%) do (
rename "%%i" "%file2% (!N:~-%num%!^)%extension%"
echo "%%i" --^> "%file2% (!N:~-%num%!^)%extension%"
set /a N=!N!+1
)
pause
それと自分もなのですが
setlocal enabledelayedexpansion
↑にハマりましたw

参考情報ありがとうございます。
前ゼロが消えてしまう件ですが、ソースを見る限り /a スイッチが入っているため、8進数として解釈されているのが原因かと思います。スイッチ無しで文字列として扱えばいけると思いますよ。

windowsバッチ内でプログラミングっぽいことするのは面倒ですよね。

(参考)
ゼロ埋めの逆ですが。

ゼロサプレス、ゼロ桁の切り出し、文字列の長さについては、これでどうでしょう。

- 入力 String が "0" の場合の問題を改善しました。
- 環境変数の使い方を、応用しやすく効率的な方法に改善しました。

@echo off
setlocal enabledelayedexpansion
set _S=000102030
if not "%~1"=="" set _S=%~1
set _D=!_S!
set _Z=!_S!
set /A _L=0
for /L %%L in (0,1,20) do (
if not "!_D!"=="" (
if !_L! EQU 0 if not "!_D:~0,1!"=="0" set /A _L=!_D!
set _D=!_D:~1!
) else (
set /A _D=!_L!
call set _Z=%%_Z:!_D!=%%
set /A _L=%%L
goto :L
)
)
:L
echo "!_S!" # String
echo "!_D!" # Decimal No.
echo "!_Z!" # Zero digits
echo "!_L!" # Length
endlocal

コメントする

このブログ記事について

このページは、Lyoが2009年8月27日 00:37に書いたブログ記事です。

ひとつ前のブログ記事は「fooの語源」です。

次のブログ記事は「やきぐり」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

OpenID対応しています OpenIDについて
Powered by Movable Type 4.261