エラーのリダイレクト、エラーの変数とオブジェクト、例外処理
HIRO [著] 2008/08/25 14:00

この連載では、Microsoftが提供している新しいシェル、Windows PowerShellの使い方を解説します。今回は、様々なエラーの取り扱い方法、例外処理について説明します。

1 2 3 4 5 →

はじめに

 この連載では、Microsoftが提供している新しいシェル「Windows Power Shell」の使い方を解説します。今回は、さまざまなエラーの取り扱い方法、例外処理について説明します。

これまでの記事

対象読者

  • Windows PowerShellでコマンドレット操作ができる方
  • 何らかのプログラミング経験があればなお良い

必要環境

  • Windows PowerShell

エラーをリダイレクトする

 リダイレクトとは、処理を行った結果の出力先を別の場所へ変更することを意味します。

 通常PowerShell上で、あるコマンドを実行してエラーが発生した場合は、コンソールウィンドウにエラーメッセージが表示されます。ここでは、このエラーをファイルに出力することを「リダイレクトする」と呼んでいます。

 PowerShellでエラーをファイルにリダイレクトするには、リダイレクト演算子を使用した3つの方法があります。

2> 演算子

 この演算子は、エラーの内容をファイルに出力します。出力先のファイルが既に存在する場合には上書きをします。

 下記は、dirコマンドで存在しないファイルを指定した場合の例です。(「C:\Work」フォルダに「HOGE.txt」が存在しないものとします)

PS C:\Work> dir HOGE.txt
Get-ChildItem : パス 'C:\Work\HOGE.txt' が存在しないため検出できません。
発生場所 行:1 文字:4
+ dir  <<<< HOGE.txt

 では、このエラーをファイルにリダイレクトしてみます。

PS C:\Work> dir HOGE.txt 2>err.txt

 上記のように、2>演算子の後ろに、エラーメッセージを書き込むファイル名を記述します。

 では、Get-Contentコマンドレットを使用して作成された「err.txt」ファイルの中身をみてみましょう。

PS C:\Work> Get-Content err.txt
Get-ChildItem : パス 'C:\Work\HOGE.txt' が存在しないため検出できませ
ん。
発生場所 行:1 文字:4
+ dir  <<<< HOGE.txt 2>err.txt

 エラーの内容がリダイレクトされていることが分かります。

2>> 演算子

 この演算子は、エラーの出力先のファイルが既に存在する場合は、追記書き込みを行います。

 追記されることを確認するために、出力先のファイルは先ほどと同じ「err.txt」とします。また。異なるエラーメッセージが記述されるようmkdirコマンドに変更しました。

PS C:\Work> mkdir HO*GE 2>> err.txt

 実行したら、先ほど同様Get-Contentコマンドレットで確認してみましょう。

PS C:\Work> Get-Content err.txt
Get-ChildItem : パス 'C:\Work\HOGE.txt' が存在しないため検出できませ
ん。
発生場所 行:1 文字:4
+ dir  <<<< HOGE.txt 2>err.txt
New-Item : パスに無効な文字が含まれています。
発生場所 行:1 文字:34
+ param([string[]]$paths); New-Item <<<< -type directory -path $paths

 エラーメッセージが追記されていることが分かります。

2>&1 演算子

 この演算子を使用すると、エラーの内容を変数に書き込むことができます。

$err = mkdir HO*GE 2>&1

 では、エラーの内容が変数に代入されているかを確認してみましょう。

caption
PS C:\Work> $err
New-Item : パスに無効な文字が含まれています。
発生場所 行:1 文字:34
+ param([string[]]$paths); New-Item <<<< -type directory -path $paths

 通常、変数の内容を確認してもメッセージに色がつかないのですが、2>&1演算子を使用して代入された値は、赤色で表示されていることが分かります。

 これは、変数に代入された値はエラーであることを示すErrorRecordオブジェクトとなるからです。(Errorオブジェクトは後述します))

PS C:\Work> $err.GetType()

IsPublic IsSerial Name                                  BaseType
-------- -------- ----                                  --------
True     True     ErrorRecord                           System.Object
-ErrorVariableパラメータ
 2>&1 演算子を使用する以外に-ErrorVariableパラメータを使用しても変数にエラーを代入することが可能です。
PS C:\Work> Get-ChildItem HOGE.txt -ErrorVariable err1
Get-ChildItem : パス 'C:\Work\HOGE.txt' が存在しないため検出できませ
ん。
発生場所 行:1 文字:14
+ Get-ChildItem  <<<< HOGE.txt -ErrorVariable err1
 -ErrorVariableパラメータの後ろには、エラー内容を代入するための変数を指定します。このとき、指定する変数に$を付加してはいけないことに注意してください。
 $Error変数は、PowerShellの操作時に発生したすべてのエラーが格納されますが、この-ErrorVariableパラメータを使用した場合は、そのとき発生したエラーの内容だけを特定の変数に代入できるという違いがあります。
 

1 2 3 4 5
→
INDEX
Windows PowerShell 入門(9)-エラー編
Page1
はじめに
対象読者
必要環境
エラーをリダイレクトする
ErrorRecordオブジェクト
$Error変数
$?変数
-ErrorActionパラメータと$ErrorActionPreference変数
例外処理をする
まとめ
プロフィール
HIRO ヒロ

HIRO's.NETのHIROです。
とある半導体工場のSEです。
VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。
最近はBlog でPowerShellについて書いています。

2008/07/07にPowerShell from Japan!!というサイトを立ち上げました。PowerShellユーザーが集まってブログを書いています。よろしかったら来てください。

HIRO's.NET Blog
HIRO's.NET - VB.NET, C#, PowerShell Tips -
PowerShell from Japan!!


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。

スポンサーサイト