はじめに
この連載では、Microsoftが提供している新しいシェル「Windows Power Shell」の使い方を解説します。今回は、さまざまなエラーの取り扱い方法、例外処理について説明します。
これまでの記事
- Windows PowerShell 入門(1)-基本操作編
- Windows PowerShell 入門(2)-基本操作編 2
- Windows PowerShell 入門(3)-スクリプト編
- Windows PowerShell 入門(4)-変数と演算子編
- Windows PowerShell 入門(5)-制御構文編
- Windows PowerShell 入門(6)-関数編1
- Windows PowerShell 入門(7)-関数編2
- Windows PowerShell 入門(8)-関数編3
対象読者
- 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
では、エラーの内容が変数に代入されているかを確認してみましょう。
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
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
パラメータを使用した場合は、そのとき発生したエラーの内容だけを特定の変数に代入できるという違いがあります。