PowerShell ISEでデバッグ
2023年12月、PowerShell ISEを使ってPowerShellスクリプトをデバッグする方法を調べました。
ブレークポイントを設定してステップ実行する方法は、すぐに分かったのですが、変数の値を調べる方法がなかなか分かりませんでした。
PowerShellは、ちょっと癖がありますけどすごく強力です。
先日、作成したTITLEタグを抽出するスクリプトは、Write-Debug文を挿入したデバッグ手法を使いましたが、デバッグ機能を使用するとデバッグが簡単に行えます。
PowerShell ISEのデバッグ機能
統合開発環境「PowerShell ISE」(Windows PowerShell Integrated Scripting Environment )は、Windows PowerShellのスクリプト作成から実行、デバッグを行うためのツールです。
メニューから「デバッグ(D)」を選択するとデバッグに使用するコマンドを表示します。
キー | 説明 |
---|---|
[F9] | ブレークポイント設定/解除
カーソル行の位置にブレークポイントを設定します。 |
Ctrl+Shift+L | ブレークポイントの一覧表示 |
[F5] | 実行/続行
プログラムの実行を開始します。 |
[F10] | ステップ オーバー
ステップ実行します。関数呼び出しの場合は、関数から戻るまで一度に実行します。 |
[F11] | ステップ イン
ステップ実行します。関数呼び出しの場合は、関数の中に入りステップ実行します。 |
Shift+ [F11] |
ステップ アウト
関数から抜けるまで一度に実行します。 |
PowerShellスクリプトのデバッグ
PowerShellスクリプト
「すごいPowerShell WEBスクレイピングが簡単!」と同じPowerShellスクリプトを使用します。
###=== WEB タイトル取得 ===
function get_title($url) {
$title_text = "???"
#== Get HTML
try {
$response = Invoke-WebRequest -Uri $url -TimeoutSec 5
} catch {
Write-Host "??? Error ",$url
return($title_text)
}
$oHtml = $response.ParsedHtml
# TITLE タグ
$elements = $oHtml.getElementsByTagName("title")
foreach($elm in $elements) {
$title_text = $elm.outerText
$title_html = $elm.outerHTML
Write-Debug $title_html
}
return($title_text)
}
### Main
#$debugPreference = "Continue"
#
$url_ary = @("indexttl.html" , "indexaut.html" , "indexkey.html")
$url_base = "http://my-web-site.iobb.net/~yuki/bit/"
Write-Host $url_base
foreach ($url in $url_ary) {
$url_adr = $url_base + $url
$title = get_title $url_adr
Write-Host " " $url " =====> " $title
}
スクリプト デバッグ操作
スクリプトの19行目にカーソルを設定して[F9]を押してブレークポイントを設定します。
「Ctrl+Shift+L」を入力すると、実行ウィンドゥでget-psbreakpointコマンドを実行してブレークポイントの一覧を表示します。
[F5]を押してスクリプトの実行を開始して、ブレークポイントで停止します。
[F11]を押すとステップ実行します。
変数の値を調べたい
統合開発環境「PowerShell ISE」で簡単にデバッグできるのですか、変数の値を調べる方法がわかりませんでした。
デバッグ(D)メニューにそれらしき項目もありません。
しばらく触っていると変数の値を調べる方法がようやくわかりました。
変数にマウスカーソルを合わせてちょっと待つとポップアップで変数の値を表示します。
例えば、18行目の「$elm.outerText」にマウスカーソルを合わせると「索引(題名) | bit目次」と表示します。また、「$elm」にマウスカーソルを合わせると$elmオブジェクトのメンバーを表示します。
$elmオブジェクトのメンバーは、outerTextやouterHTMLなど多くの項目を含んでいます。
どんなオブジェクトメンバーがあるか調べることができますが、このポップアップからコピペはできません。ちょっと不便です。
調べてみると実行ウィンドゥの[DBG]:プロンプトに変数を入力すると変数の値を表示することが分かりました。
[DBG]: PS E:\>> $elm.outerText
索引(題名) | bit目次
[DBG]: PS E:\>> $elm
className :
id :
tagName : TITLE
・・・省略・・・
innerHTML : 索引(題名) | bit目次
innerText : 索引(題名) | bit目次
outerHTML : <TITLE>索引(題名) | bit目次</TITLE>
outerText : 索引(題名) | bit目次
・・・省略・・・
[DBG]: PS E:\>>
PowerShell ISEは便利
PowerShell ISEを使用すると、ブレークポイントで止めて変数の値を確認できるのでとても便利です。
また、新しく使用するオブジェクトがあるときは、そのメンバーも調べることができます。