#author("2016-09-07T19:31:20+09:00","","")
#contents
*バッチファイル(batファイル) [#c79bf38b]
**サービスを起動・停止する [#n2318ea2]
例:MySQLの場合
#pre{{
@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%
)
}}

 @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 [#hb652df4]
 rem 5秒程待つ
 ping localhost -n 6 >nul
**引数をソートして処理する [#wddcaff9]
 @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

**複数のファイルを順番に処理する [#y72a56c5]
 @echo off
 for %%i in (%*) do call :execute %%i
 pause
 goto :EOF
 
 :execute
 echo %1
 exit /b

**文字列の置換 [#n3287a68]
「/」を「-」に置き換え
 echo %date%
 echo %date:/=-%
結果
 2008/07/09
 2008-07-09
引数の場合は変数に入れてから置換
 SET HOGE=%~t1
 ECHO %HOGE:/=-%

**サブルーチンを呼び出す [#n32c7b2f]
 CALL :ラベル 引数 
***ファイル内のサブルーチンを呼ぶ [#i18371aa]
-サンプルスクリプト(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

***外部ファイル内のサブルーチンを呼ぶ [#q1b6bc7c]
-呼び出し元ファイル(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
**[[標準エラー出力もリダイレクトするには?:http://blog.kumacchi.com/2007/07/msdos.html]] [#wda2b8a6]
 program.exe > hogehoge.txt 2>&1 
**ERRORLEVELが意図した動作をしない [#k1ea40f0]
[[ERRORLEVEL バッチ ファイル正しいテスト優先:http://support.microsoft.com/kb/39585/ja]]

ERRORLEVEL は降順でテストするべきです。
 IF ERRORLEVEL 1 GOTO ONE
 IF ERRORLEVEL 0 GOTO ZERO
 
 :ONE
 ECHO ONE
 :ZERO
 ECHO ZERO

** 実行されているバッチファイル自身のパスを取得 [#t84a41d6]
c:\bat\test.bat
 SET PWD=%~dp0
 ECHO %PWD%
結果
 c:\bat\

**参考サイト [#ub79a583]
-[[バッチメモ(Hishidama's bat-file Memo):http://www.ne.jp/asahi/hishidama/home/tech/windows/bat.html]]
-[[バッチファイルの制御用コマンド [FPCU]DOS/V&Windowsコマンド・プロンプト・リファレンス:http://www.fpcu.jp/dosvcmd/batch.htm]]
-[[DOS/Vコマンド・リファレンス@FPCU:http://www.fpcu.jp/dosvcmd/]]