Windows バッチファイル

文字列操作

文字列の部分を取り出す
C:\Windows\System32>set stringop=abcdefg

C:\Windows\System32>echo %stringop%
abcdefg

C:\Windows\System32>echo %stringop:~3,2%
de

日時

Windowsのバッチスクリプトの場合、bashみたいに、date関数があるわけでなくて、環境変数dateとtimeで取得する。

C:\>echo %date% %time%
2011/03/19  0:17:53.29

C:\Windows\System32>echo %date% %time%
2011/03/19  0:20:41.59

for

便利な機能もあるのだけど、どうもシンプルでないな。
helpを何度も見ないと、とてもあつかえる気がしない。

for-L-examples.cmd

@echo off
for /L %%i in (0, 1, 3) do echo %%i

for /L %%i in (10, 5, 30) do (
    echo %%i
)

rem 変数名がabのように2文字以上になるとエラー
for /L %%ab in (0, 1, 3) do echo %%i

実行すると

0
1
2
3
10
15
20
25
30
%ab の使い方が誤っています。

for-F-examples.cmd

@echo off
rem for /FをつかうとCSVのような書式のテキストを処理できる

call :cat a.txt
call :cat b.txt
call :cat c.txt
call :countline a.txt
call :countline b.txt
call :countline c.txt

rem ここでexitしないとこれ以降の行も実行されてしまう
exit /b

:cat

rem :区切りのCSVを処理する
rem 1番目のフィールドを%%aで取得できる
rem 2番目以降のフィールドを%%bで取得できる
for /F "delims=: tokens=1,2*" %%a in ('findstr /n "^" %1') do (
    @echo %%a %%b
)

@rem ここでexitしないとこれ以降の行も実行されてしまう
exit /b

:countline

setlocal enabledelayedexpansion
set COUNT=0
rem findstr /n "^"これは、cat -n
for /F "delims=:" %%a in ('findstr /n "^" %1') do (
    set /a COUNT=!COUNT!+1
)
echo !COUNT! 
endlocal

exit /b

参考

findstrコマンドだと、行数が何万行、何十万行もあると、とても処理に時間がかかる。

コマンドライン リファレンス