{{category Command Prompt,nolink}} Windows Command Prompt バッチ処理 !!!Windows DOS バッチ処理 バッチ処理とは、一定期間(もしくは一定量)データを集め、まとめて一括処理を行なう処理方式。または、複数の手順からなる処理において、あらかじめ一連の手順を登録しておき、自動的に連続処理を行なう処理方式である。 Windowsでも、UNIXのシェルコマンドほど多様な処理は、難しいが基本的な処理(繰り返し、条件分岐、処理のジャンプ、他処理の実行など)は行うことができる。さらに、Windows 2000 以降のNT系OSの CMD.COM は、機能が拡張され多様なことが実行できるようになった。 ※注:ここで紹介するバッチ処理は、一部で Windows 2000 以降のNT系OSのコマンドプロンプトのみ有効なコマンド(処理)を使用している。 また、DOSバッチ自体過去の遺産になってきています。可能ならば Windows Script Host (WSH) や Windows PowerShell (PS) で行う方が、制御や機能が豊富になります。 ただ、VBScript については、廃止が決定されている。 2023年10月で非推奨、2024年後半でオンデマンド機能で提供(デフォルトで有効)、2027年にオンデマンド機能がデフォルトで無効。廃止(削除)の時期は未定。 !! 個別ページ * [[WinBat/DateTime]] ** バッチで日時の取得と日付計算処理 * [[WinBat/Modifier]] ** バッチパラメータ修飾子によるファイル情報の取得 * [[WinBat/runas]] ** 管理者権限チェック、昇格して実行する * [[WinBat/Multiple]] ** バッチで多重起動チェック * [[Script/Mixed]] ** 1ファイルに複数のスクリプトを記載(ほとんど、バッチファイル+何か) !! tips バッチ処理でいろいろと → [[WinBat/Tips]] バッチでOSを判定する方法(XPまで) → [[WinBat/OsCheck]] 一定時間停止(スリープ)する → [[WinBat/sleep]] 文字色と背景色を変えて文字列を表示する → [[WinBat/ColoredEcho]] echo コマンドによる、メッセージ出力・画面制御など → [[WinBat/Echo]] !!!コマンドプロンプトとバッチファイル !!ウインドウタイトル変更 コマンドプロンプト の ウインドウタイトルを変更する。 TITLE [新しいタイトル] !!ビープ音 !ベル echo コマンドで、ベル文字(0x07, ^G )を出力し、「システムエラー」のサウンドを鳴らす。 コマンドプロンプトで、「echo ^G」と入力。※「^G」は Ctrl + G キー バッチファイルでも、「echo ^G」。※「^G」も同様に制御文字のベル文字 !メッセージビープ rundll32 で、「メッセージビープ」のサウンドを鳴らす。 rundll32 user32.dll,MessageBeep !!コマンドプロンプトでSJIS以外を表示する chcp コマンドを使用することで、コマンドプロンプトの文字コードを変更できる。 引数に変更するページコードを指定する。デフォルトは、Shift_JIS の 932。他には、EUC が 20932、JIS が 50220、UTF-7 が 65000、UTF-8 が 65001 などがある。引数がなければ現在のコードページが表示される。 ちなみに、単純にコードページを変更しただけではフォントが日本語対象外となるため、マルチバイトを表示すると文字化けする。プロパティからフォントを"MS ゴシック"に変更すれば、ユニコードに対応するので表示されるらしい(自分ところはうまくいかない)。 !!同一バッチファイル内でのサブルーチン呼び出し 昔は複数のバッチファイルやGOTO文を駆使してやっていた内容を、単一のバッチファイルの中に、まとめることができるようになった。(高級言語で言うサブルーチンのを呼び出して処理を行うような感覚で行うことができる)  : CALL :SubRoutine [パラメータ]  : GOTO :EOF :SubRoutine rem ECHO %1 %2 %3 %4 %5 ......  : GOTO :EOF "GOTO :EOF"はバッチファイルの終端へのジャンプ。 または、"EXIT /B" でバッチ処理(サブルーチン呼び出し)を抜ける。 !!局所的な環境変数の利用 バッチ処理内やある範囲内のみで環境変数を使用したり、再設定する場合は、'''SETLOCAL''' 及び '''ENDLOCAL''' コマンドを利用する。SETLOCALを実行後設定した環境変数の内容は、ENDLOCALを実行時に破棄され、以前の状態に戻される。 SETLOCALにオプションを指定することにより、'コマンド拡張機能'と'遅延環境変数の展開'の有効/無効を指定できる。指定したオプションは、ENDLOCAL実行まで有効になる。 SETLOCAL  ENABLEEXTENSIONS … コマンド拡張機能の有効を指定  DISABLEEXTENSIONS … コマンド拡張機能の無効を指定  ENABLEDELAYEDEXPANSION … 遅延環境変数の展開の有効を指定  DISABLEDELAYEDEXPANSION … 遅延環境変数の展開の無効を指定 !!遅延環境変数の展開 環境変数は実行時に展開される。よって、IF文やFOR文の処理内で、環境変数を設定し、それを利用して処理等を行っても、評価される内容は、実行前の内容のままである。 これを実行毎に正しく展開されるようにするには、cmd.comのオプションに /V:ON を付ける必要がある。  : REM 遅延環境変数の展開が有効チェック SET VAR=BEFORE IF "%VAR%" == "BEFORE" ( SET VAR=AFTER IF "!VAR!" == "AFTER" GOTO DELAY_OK ) GOTO DELAY_NG :DELAY_OK  : REM リストの結合 SET LIST= FOR /F %%f IN (DBTB_LIST.TXT) do set LIST=!LIST!,%%f SET LIST=%LIST:~1%  : GOTO :EOF REM エラー処理 :DELAY_NG ECHO 遅延環境変数の展開が有効になっていません。 ECHO 「CMD.EXE /V:ON /C %0」として起動してください。 GOTO :EOF  : もしくは、'''SETLOCAL ENABLEDELAYEDEXPANSION''' で遅延環境変数の展開を有効にし、バッチ終了時に、'''ENDLOCAL''' でSETLOCALの設定を無効にする。 REM 遅延環境変数の展開を有効に SETLOCAL ENABLEDELAYEDEXPANSION  : REM リストの結合 SET LIST= FOR /F %%f IN (DBTB_LIST.TXT) do set LIST=!LIST!,%%f SET LIST=%LIST:~1%  : ENDLOCAL !!バッチ処理の終了コード 通常バッチ処理を実行しただけでは、エラーレベルは返さない。バッチ処理をコールした側でエラーレベルを取るためには、"EXET /B 終了コード"を行う。 "/B"を忘れると、コマンドプロンプト自体を終了してしまう。 > typt test1.bat @ECHO OFF CALL test2.bat ECHO TEST2 ErrorLevel = %ERRORLEVEL% > typt test2.bat @ECHO OFF EXIT /B 3 > test1 TEST2 ErrorLevel = 3 !!リダイレクト、パイプ、コマンドの連結 ::command > filename :::標準出力のリダイレクト (commandの出力をfilenameに上書保存) ::command >> filename :::標準出力のリダイレクト (commandの出力をfilenameに追記保存) ::command 2> filename :::標準エラー出力のリダイレクト (commandのエラー出力をfilenameに上書保存) ::command 2>> filename :::標準エラー出力のリダイレクト (commandのエラー出力をfilenameに追記保存) ::command 2>&1 :::標準エラー出力を標準出力と同じにする ::command > filename 2>&1 :::標準エラー出力を標準出力と同じファイルにリダイレクト (commandの出力をfilenameに上書保存) ::command >> filename 2>&1 :::標準エラー出力を標準出力と同じファイルにリダイレクト (commandの出力をfilenameに追記保存) ::command < filename :::標準入力のリダイレクト (filenameの内容をcommandの入力にする) ::command1 | command2 :::パイプ (command1の標準出力をcommand2の標準入力にする) ::command1 & command2 :::command1を実行後、command2を実行する ::command1 && command2 :::command1が成功した場合に、command2を実行する ::command1 || command2 :::command1が失敗した場合に、command2を実行する ※標準エラーを標準出力と同じにする場合は、記述する順番に注意すること。 !ファイル記述子 (ファイルディスクリプタ / file descriptor) ,FD,意味,デフォルト ,0,標準入力(stdin) ,キーボード ,1,標準出力(stdout) ,ディスプレイ ,2,エラー出力(stderr) ,ディスプレイ 「2>&1」は、 FD:2 (stderr) を、FD:1 (stdout) に接続する(その時の接続先)。 そのため、「command 2>&1 > filename」とした場合、エラー出力は標準出力に、(コマンドからの)標準出力は、ファイルに出力となる。 !!システムディバイス MS-DOS から存在するディバイスファイル。予約ファイル(デバイス)で、ファイル名等には使用できない。 ::CON :::コンソール (キーボード または ディスプレイ) ::NUL :::ヌルディバイス ::PRN :::プリンタ装置 ::AUX :::補助入出力装置 (RS-232C等) ::CLOCK$ :::クロック ::COM1〜COM9 :::シリアル通信ポート ::LPT1〜LPT9 :::パラレル通信ポート !システム デバイス状態・設定 mode コマンドで接続されているディバイスの確認や設定が行える。 コンソール(CON)の表示行数や桁数、シリアルポート(COMx)のボーレートやパリティ有無・データ長などが設定できる。 !!!ECHO出力 echo コマンドによる、メッセージ出力・画面制御など。詳細は [[WinBat/Echo]] !!改行の出力 ECHOコマンドだけだと「ECHO は です。」と出力される。以下のようにしてECHOコマンドを実行します。ECHOの後に空白を入れないことが重要です。 ECHO. ECHO: ECHO\ ECHO/ !!パーセント記号の出力 バッチの中で %1 や %path% は引数や環境変数の内容に置き換えられてしまいます。 パーセント記号そのものを表示したい場合は、記号を2つ重ねて出力する。 ECHO OFF ECHO %%1 の内容は %1 です。 ECHO ECHO %%PATH%% の実行結果は... ECHO %PATH% !!特殊記号"<>|&^"表示する方法 これらの特殊記号は"<>|&^" の前に "^"をつけて記述します。 ECHO ^<  → < ECHO ^>  → > ECHO ^|  → | ECHO ^&  → & ECHO ^^  → ^ ECHO ^<^^_^^^> → <^_^> !!!参考文献・リンク *@IT Windows2000 コマンドライン徹底活用 **http://www.atmarkit.co.jp/fwin2k/serial/index/index.html#commandline *バッチもん研究所 **http://homepage1.nifty.com/jak/batch/