記事一覧

DOSバッチのechoの話

 

  
目次     



  

DOSバッチはこだまする

ハロー、みなさん。エジソンです。

本日は、DOSバッチを書き上げる際の基本とも言える事柄を紹介したいと思います。

DOSバッチを作ると、記述した mkdir であったり copy コマンドがコンソールにそのまま出力されます。

自分用のツールとしてバッチファイルを作る場合には、echo が垂れ流されたとしても問題になりませんが、システムの一機能として作成する際には、echoを抑止したくなることもあるでしょう。

echoをオフにする

バッチファイルを作成して、そのファイル中にコマンドを書き連ねると、実行したコマンドが都度コンソールに出力されます。

リスト1-1:test.batとして保存
mkdir test

リスト1-2:実行結果
C:\Users\username\Desktop>test.bat ← 実行すると、記述したコマンドが出力される
C:\Users\username\Desktop>mkdir test
C:\Users\username\Desktop>

コンソールへの出力を防ぐには、以下のようにします。 ポイントは @echo off です。
@を付けることで、@を付けたコマンド行自体も echo 出力させないという意味になります。これが無いと、"echo off"と出力されるので格好悪いです。

リスト2-1:test2.batとして保存
@echo off
mkdir test

リスト2-2:実行結果
C:\Users\username\Desktop>test.bat
C:\Users\username\Desktop>

ただし、二回目以降はディレクトリが既に存在するのでエラーメッセージが表示されます。

リスト2-3:実行結果
C:\Users\username\Desktop>test.bat
サブディレクトリまたはファイル test は既に存在します。

C:\Users\username\Desktop>

このようにコマンド自体が発するエラーメッセージ(標準エラー出力への出力)を防ぐには以下のようにします。

リスト3-1:test3.batとして保存
mkdir test > NUL 2>&1
IF NOT %ERRORLEVEL% == 0 (
    echo エラーが発生しました
)

リスト3-2:実行結果
C:\Users\username\Desktop>test3.bat
エラーが発生しました

これは、どのような意味かというと、

mkdirの標準出力をNULにリダイレクト(何処にも出力しない)する。

→ mkdir test > NUL

さらに標準エラー出力を標準出力にリダイレクトするという意味になります。

→ mkdir test > NUL 2>&1

上記の
 1というのは、ファイルハンドルの予約番号で標準出力を意味します。
 2というのは、ファイルハンドルの予約番号でエラー出力を意味します。

2>&1 というのは、エラー出力を標準出力にリダイレクトするという意味になり、1の前に何故 & が付いているかと言うと、リダイレクト記号の右側に単に1と書くと”1”というファイル名として解釈されるからです。

&を付けることでファイルハンドルの1(標準出力)という意味になるのです。

そして、最後のIF文は、単にエラーを握りつぶすとよろしくないので、コマンドのエラー結果をチェックしています。

スクリプトだからと言ってエラーをスルーすると、後続の処理で問題が噴出するおそれがあるので、エラーチェックは常に実施する癖を付けるべきかと思います。

余談ですが、旧来のエラーコードチェックのことを考えると、例外機構というのはやはり優秀なんだなと、しみじみと思いました。

結論

バッチで余計なメッセージを出したくない場合は、以下のようにしましょう!

  • 先頭に @echo off
  • 標準のコマンドには、 command > NUL 2>&1
  • ただし、エラーメッセージを出さない場合は実行結果のチェックを忘れずに
   

関連記事

このエントリーをはてなブックマークに追加

コメント

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp

ezolab