2
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

バッチファイルを使って設定確認をテンプレート化する

Last updated at Posted at 2018-03-20

はじめに

テスト時の設定値確認などよく使うコマンドをbatファイルにしておいて、作業の手間を減らしたい。
また、テンプレートとして確認する設定項目はbat処理中に入力し、batの中身を都度書き換えないようにしたい。
今回は例として、サービスのステータス確認をするbatを作成する。

1.作業前の確認を入れる

batファイルに設定変更コマンドを記述していると、誤った実行で設定変更してしまう可能性があるため、処理の開始前にワンクッション置けるようにする。
「pause」だといずれかのボタン押下で処理が続行してしまうため、特定の文字を入力しないと処理が続行できないようにする。

echo ------ 作業前確認 ------
REM 作業時刻の取得
echo %date% %time%
echo.
echo ------ 作業前確認 ------
REM 対象サーバのホスト名確認
hostname
echo. 

REM 入力待ち処理
SET /P ANSWER="実行しますか(y/n)?"

REM 「y」or「yes」を入力すると「:yes」へジャンプし、処理を続行
REM 「y」or「yes」以外が入力されると「EXIT」へジャンプし、バッチが終了
if /i {%ANSWER%}=={y} (goto :yes)
if /i {%ANSWER%}=={yes} (goto :yes)

EXIT
:yes

2.ステータス確認用のテンプレートを作成する

実行イメージ

ループ処理を使って、定義したサービス名を一つずつ取り出して実行したい。

REM %I%にサービス名を一つずつ定義して、コマンドを実行したい。
%I% = サービス名1 サービス名2 サービス名3 
sc query %I% (サービス1)
sc query %I% (サービス2)
sc query %I% (サービス3)

ループ処理(for文)の基本形

for /f tokens %%アルファベット1文字 in (ループ処理の対象) do コマンド 
  • for /f はデフォルトでは、スペースやタブで区切って変数に格納することができる。
  • オプション:tokens=何番目のトークンを指定するか

今回は「for /f」を使ってサービス名を一つずつ取り出せるようにする。

処理の流れ

  1. batを実行し、%A%にスペース区切りでサービス名を入力する
  2. %A%に定義された文字列を一つずつ取り出して、%I%に定義する。
  3. 「sc query %I%」を実行する。
  4. 「2~3」の処理を%A%から文字列が取り出せなくなるまで、ループ処理する。

echo off

REM 入力した文字を変数「%A%」へ定義する
set A=
set /P A="サービス名を入力してください: "
set /P ANSWER="サービス名は %A% です。"

pause

REM ループ処理開始
REM %A%に定義した文字をスペース区切りで取りだして%I%に定義する。
set N=0
:loop
set /a N+=1
set I=
for /f "tokens=%N%" %%I in ("%A%") do set I=%%I
REM 変数が定義されていない場合「:next」へ移動
if not defined I goto next
REM ステータス確認コマンドを実行()
sc query %I%
goto loop
:next

pause

3.ログディレクトリ作成やエビデンスを出力できるようにする

上記の処理に対してログディレクトリの作成やエビデンスとしてコマンド結果をテキストに出力できるようにする。
記載を省力しているが、冒頭に記載した作業前確認と組み合わせることも可能。

echo off

:retry

REM 入力した文字を変数「%A%」へ定義する
set A=
set /P A="サービス名を入力してください: "
set /P ANSWER="サービス名は %A% です。実行しますか(Y/N)?"

REM 「y」or「yes」を入力すると「:yes2」へジャンプし、処理を続行。
REM 「y」or「yes」以外が入力されると「:retry」へジャンプし、ループする。
if /i {%ANSWER%}=={y} (goto :yes2)
if /i {%ANSWER%}=={yes} (goto :yes2)
if /i {%ANSWER%}=={n} (goto :retry)
if /i {%ANSWER%}=={no} (goto :retry)

EXIT
:yes2

REM コマンドを再表示する
echo on

REM ログディレクトリ定義
set LOG=C:\work\log
REM ログディレクトリの作成
mkdir %LOG%
cd %LOG%
dir

pause

REM %HOSTN%へホスト名を定義する
set HOSTN=%COMPUTERNAME%
REM 日付をyyymmdd形式で取得する。
set TESTDATE=%DATE:/=%

REM ループ処理開始
set N=0
:loop
set /a N+=1
set I=
for /f "tokens=%N%" %%I in ("%A%") do set I=%%I
REM 変数が定義されていない場合「:next」へ移動
if not defined I goto next
REM サービスステータス確認 「C:\work\log\yyyymmdd_ホスト名.log」にコマンド結果を出力する。
sc query %I% >> %TESTDATE%_%HOSTN%.log
goto loop
:next

pause

最後に

batの勉強を始めたばかりですが、こういったbatファイルは一度作成しておくと結構作業の手間を減らすのではないかと思い作成してみました。
今回はサービスのステータス確認のみを焦点を置いて書いてみましたが、応用すれば任意のログディレクトリの作成・エビデンス名の指定や他のコマンドなどでも応用が効くと思います

2
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?