バッチファイル(batファイル)

サービスを起動・停止する

例:MySQLの場合

@ECHO OFF
REM サービス名
SET SNAME=MySQL
REM プロセス名
SET PNAME="mysqld-nt.exe"
REM プロセスの起動確認
TASKLIST | FIND %PNAME% > NUL
IF NOT ERRORLEVEL 1 (
  REM プロセスが起動していた場合
  NET STOP %SNAME%
) ELSE ( 
  NET START %SNAME%
)

Sleep

rem 5秒程待つ
ping localhost -n 6 >nul

引数をソートして処理する

@echo off
rem ソート処理
if exist %~dp0filelist.txt del %~dp0filelist.txt
for %%i in (%*) do (
  echo %%i >> %~dp0filelist.txt
)
sort.exe %~dp0filelist.txt > %~dp0filelist2.txt

for /F %%i in ( %~dp0filelist2.txt ) do echo %%i

if exist %~dp0filelist.txt del %~dp0filelist.txt
if exist %~dp0filelist2.txt del %~dp0filelist2.txt
pause
exit

複数のファイルを順番に処理する

@echo off
for %%i in (%*) do call :execute %%i
pause
goto :EOF

:execute
echo %1
exit /b

文字列の置換

「/」を「-」に置き換え

echo %date%
echo %date:/=-%

結果

2008/07/09
2008-07-09

引数の場合は変数に入れてから置換

SET HOGE=%~t1
ECHO %HOGE:/=-%

サブルーチンを呼び出す

CALL :ラベル 引数 

ファイル内のサブルーチンを呼ぶ

  • サンプルスクリプト(a.bat)
    @ECHO OFF
    
    CALL :SUBROUTINE hoge fuga
    ECHO [呼び出し元]
    ECHO %1
    ECHO %2
    GOTO :EOF
    
    :SUBROUTINE
    ECHO [SUBROUTINE]
    ECHO %1
    ECHO %2
    EXIT /b
  • 実行結果
    C:\>a.bat 1 2
    [SUBROUTINE]
    hoge
    fuga
    [呼び出し元]
    1
    2

外部ファイル内のサブルーチンを呼ぶ

  • 呼び出し元ファイル(b.bat)
    @ECHO OFF
    CALL c.bat SUBROUTINE2 hoge fuga
    ECHO [呼び出し元]
    ECHO %1
    ECHO %2
  • サブルーチンを含むファイル(c.bat)
    @ECHO OFF
    REM 引数チェック
    IF %1.==. GOTO NOPARAM
    IF %1==SUBROUTINE1 GOTO SUBROUTINE1
    IF %1==SUBROUTINE2 GOTO SUBROUTINE2
    GOTO BADPARAM
    
    :SUBROUTINE1
    SHIFT
    ECHO [SUBROUTINE1]
    ECHO %1
    ECHO %2
    EXIT /b
    
    :SUBROUTINE2
    SHIFT
    ECHO [SUBROUTINE2]
    ECHO %1
    ECHO %2
    EXIT /b
    
    :NOPARAM
    ECHO サブルーチン名が指定されていません。
    GOTO :EOF
    :BADPARAM
    ECHO 有効なサブルーチン名が指定されていません。
  • 実行結果
    [SUBROUTINE2]
    hoge
    fuga
    [呼び出し元]
    1
    2

標準エラー出力もリダイレクトするには?

program.exe > hogehoge.txt 2>&1 

ERRORLEVELが意図した動作をしない

ERRORLEVEL バッチ ファイル正しいテスト優先

ERRORLEVEL は降順でテストするべきです。

IF ERRORLEVEL 1 GOTO ONE
IF ERRORLEVEL 0 GOTO ZERO

:ONE
ECHO ONE
:ZERO
ECHO ZERO

実行されているバッチファイル自身のパスを取得

c:\bat\test.bat

SET PWD=%~dp0
ECHO %PWD%

結果

c:\bat\

参考サイト


Last-modified: 2016-09-07 (水) 19:31:20 (531d)