スポンサーリンク

Windows:バッチファイルの書き方忘れそうだから備忘録を書くよ

この記事は約9分で読めます。

操作画面

こんにちは、さち です。

以前、「バッチファイル」を自作した時にコマンドプロンプトの勉強をしたんですが
使用機会があまりなく、記憶がゆっくりと頭から抜けてしまいそうです……。

拙いながらせっかく勉強したので
今回は、Windows のコマンドプロンプトで使用できる
「バッチファイル」の記述方法ついて備忘録を残しておきたいと思います。

スポンサーリンク

そもそも「バッチファイル」とは?

バッチファイルとは、簡単に言うと Windows の作業を自動で行うための指示書です。
Windows はバッチファイルに書かれている指示のとおりに動いてくれます。
(例えば、「エクスプローラーを終了しろ」と指示すればそのとおりになります)

つまり、バッチファイルは
決まりきった面倒な作業を省く(サボる)ための手段です。

バッチファイルで使用するコマンドを勉強しなくてはいけませんが
楽をするための努力は必要ということで前向きに行きましょう。

まえおき

現在は、「Windows PowerShell」 の方ができることが多いようですが
Windows 7 以降ではないと標準搭載されていないということから
現在稼働しているほぼすべての Windows PC で動くであろう
「コマンドプロンプト」を使うことにしました。

あくまで備忘録ですので
ここで解説するコマンド等は実際に私が使ったものだけです。
つまり、全然網羅していません。
コマンドについてちゃんと勉強したい人は他サイトも読んで下さいね。

コメントを書く

rem コメント

行頭に rem と書くと、その行はコメントとして扱われます。
(何の意味も持たない単なるメモと見なされる)

3文字もアルファベットを書くのは面倒だという場合は
:(コロン) で同じことができなくはないですが
本来は「ラベル(※後述)」として使うものなので多用するのは微妙です。

メッセージの表示

rem メッセージを表示
echo メッセージ

rem 空白のメッセージを表示
echo.

行頭に echo と記述すると、その行をメッセージとして表示します。

ただし、空白のメッセージ(空白の行)を表示するには
単に echo と記述するだけではダメで echo. とピリオドが必要。
(echo とピリオドの間にはスペースは入れない)

サービスの開始/停止

rem サービを開始
net start サービス名

rem サービスを停止
net stop サービス名

サービス名の確認は「サービス(管理ツール)」で行います。
(「サービス」の起動は、「Windows + R」キー→「services.msc」と入力)
目的のサービス上で「右クリック」→「プロパティ」と進み
表示された「サービス名」を使用します。

Windows 8 以降の場合は
「タスクマネージャー(Ctrl + Shift + Esc)」にある「サービス」タブであれば
表示されている名前がそのまま「サービス名」です。

プロセス(アプリ)の起動/終了

rem プロセス(アプリ)を起動
start プロセス名

rem プロセスを終了(未保存時のダイアログあり)
taskkill /IM プロセス名

rem プロセスを強制終了(未保存時のダイアログなし)
taskkill /F /IM プロセス名

rem プロセス(親)と、その子プロセスを強制終了
taskkill /T /F /IM プロセス名

プロセス名は、「xxxxx.exe」の形で記述します。
終了は、起動中のプロセス(アプリ)名「xxxxx.exe」の記述のみでOKですが
起動は、Windows 標準のプロセス(explorer.exe)など以外は
「C:\Program Files\xxxxx\xxxxx.exe」のようなパスで記述しないと起動できません。

例えば、エクスプローラー(explorer.exe)を強制終了する場合はこんな感じ。

taskkill /F /IM explorer.exe

 

変数を使う

rem 変数の作成(定義)
set 変数名 = 変数に入れる値

rem 変数の中身を表示
echo %変数名%

set の後に任意の変数名を記述
続いて、= の後にその変数に入れる値を記述します。
変数の中身を表示する時は変数名を % で囲みます。

変数の作成(定義)の例は下記のとおり。

rem 「おはよしこ」を値に持つ変数「message」を作成
set message = おはよしこ

rem 変数「message」の中身(おはよしこ)を表示
echo %message%

 

条件別に処理を分岐

rem 条件を満たす時だけ処理を実行
if 条件 ( 処理 )

rem 条件を満たせば処理1、それ以外は処理2を実行
if 条件 (
  処理1
) else (
  処理2
)

rem 条件1を満たせば処理1、条件2を満たせば処理2、それ以外は処理3を実行
if 条件1 (
  処理1
) else if 条件2 (
  処理2
) else (
  処理3
)

if else は何個でも続けることができます。
最後の else 以降の記述は無くても構いません。

条件を記述する際、例えば「AとBが一致」などのように
2つの値を比較する場合は演算子を使います。

rem AとBが一致するとき、処理を実行
if %A% == %B% ( 処理 )

rem AとBが一致するとき、処理を実行(大文字/小文字の区別なし)
if /i %A% == %B% ( 処理 )

rem AとBが一致しないとき、処理を実行
if not %A% == %B% ( 処理 )

数値の場合、「等しい」以外に「大きい」「小さい」という比較もありえます。
その場合は、下記のような演算子を使います。
ただし、前述の not は下記と組み合わせて使うことはできません。

rem A=B(AとBが等しい)のとき、処理を実行
if %A% equ %B% ( 処理 )

rem A≠B(AとBが等しくない)のとき、処理を実行
if %A% neq %B% ( 処理 )

rem A≧B(AがB以上)のとき、処理を実行
if %A% geq %B% ( 処理 )

rem A>B(AがBより大きい)のとき、処理を実行
if %A% gtr %B% ( 処理 )

rem A≦B(AがB以下)のとき、処理を実行
if %A% leq %B% ( 処理 )

rem A<B(AがB未満)のとき、処理を実行
if %A% lss %B% ( 処理 )

例えば、変数「message」の中身が「おはよしこ」なら「だからヨハネよ!」と表示し
それ以外なら「ギラン!」と表示するならこんな感じ。

if %message% == おはよしこ (
  echo だからヨハネよ!
) else (
  echo ギラン!
)

 

一時停止,停止など

rem 何かキーを入力するまで一時停止
pause

rem 指定した秒数だけ一時停止(キー入力で一時停止を中断)
timeout 秒数

rem コマンド入力を受け付ける状態で停止
cmd /k

rem バッチファイルを終了
exit

timeout は Windows Vista 以降で標準使用できます。
timeout の秒数を「-1」にすると無期限に一時停止します。
また、秒数の後に /nobreak を記述するとキー入力を無視します。

ラベルを使って別の行にジャンプする

rem ジャンプ先を指定
goto jump

rem ジャンプの着地点の指定
:jump

例えば、下記のようなバッチファイルの場合
変数「message」の中身が「おはヨハネ」なら3行目の :ok にジャンプして終了。
それ以外なら「だからヨハネよ!」を表示してから3行目以降に進んで終了します。

if %message% == おはヨハネ ( goto ok )
echo だからヨハネよ!
:ok
exit

 

コマンドの非表示

rem その行だけ非表示
@コマンド

rem その行以降すべて非表示
@echo off

rem その行以降すべて表示
@echo on

コマンドプロンプトでは記述したコマンドが実行時に表示されます。
非表示にするにはそれ用の記述が必要です。

特定の行のみ非表示にするには
行頭に @ を付け、その後ろは普通にコマンドを記述すればOK。

その行以降すべてのコマンドを非表示にするには
@echo off を記述して、次の行から普通にコマンドを記述します。
(つまり、最初の行に記述すればすべてのコマンドが非表示になる)

標準出力,エラー出力を表示しない

そもそも「標準出力」「エラー出力」って何?という話ですね。

簡単に言うと
「標準出力」は、コマンドを正常に処理した時に表示されるメッセージ。
「エラー出力」は、正常に処理できなかった時に表示されるメッセージです。

コマンドが実行されたときの出力が鬱陶しいという場合は
その行の末尾に下記記述を足すことでそのコマンドの出力を非表示にできます。

rem エラー出力だけ非表示
コマンド 2>NUL

rem 標準出力,エラー出力 両方を非表示
コマンド >NUL 2>&1

1」が標準出力、「2」がエラー出力をあらわしています。

例えば、2>NUL はエラー出力を NUL(空のファイル) に表示するということ。
つまり、エラー出力は破棄されるため表示されません。

そして、>NUL 2>&1
前半の >NUL が標準出力を NUL(空のファイル) に表示するという意味
後半の 2>&1 がエラー出力を標準出力と同じ場所に表示するという意味
つまり、標準出力,エラー出力 両方とも破棄されるため表示されません。

ちなみに、NUL の代わりに実在するテキストファイルを指定すれば
出力をそのテキストファイルに書き込ませることができます。

実際の使用例はこんな感じ。

rem 正常にEdgeを強制終了した場合は標準出力が表示されるが
rem Edgeが存在しない場合のエラー出力は表示されない
taskkill /F /IM MicrosoftEdge.exe 2>NUL

rem timeout(5秒)に関する出力は何も表示されない
timeout 5 >NUL 2>&1

 

エスケープが必要な(そのままでは使えない)文字

特別な意味を持つ文字は、単体で文字として表示することができません。
文字の前に ^(サーカムフレックス) を付ける必要があります。
この作業(エスケープ)が必要なのは下記の文字です。

^&
^|
^<
^>
^%
^^

 

その他

「管理者として実行」しないと
バッチファイルが正常に動かない場合があるため、それを確認するコマンドです。

openfiles >NUL 2>&1

if errorlevel 1 (
  echo 管理者として実行されていません
  cmd /k
  exit
)

echo 管理者として実行されています

「openfiles」はファイルの情報を開くためのコマンドです。
このコマンドは管理者権限がないと動作せず
その状態が「errorlevel」の値として返ってきます。

errorlevel の値は
「管理者として実行」されている場合は「0」
されていない場合は「1」になります。

if errorlevel 1」は「errorlevel が1以上の場合」という意味。
「errorlevel が1の場合」ではありません。注意して下さい。
if %errorlevel% geq 1」と書くのと同じ効果です。

【参考サイト様】

→ Windowsコマンド集(機能別一覧) - ITpro
→ DOS コマンド一覧 - Programming Field

コメント

タイトルとURLをコピーしました