Windows PowerShell 入門(10)-デバッグ編
対象読者
- Windows PowerShellでコマンドレット操作ができる方
- 何らかのプログラミング経験があればなお良い
必要環境
- Windows PowerShell
デバッグメッセージの出力
PowerShellではデバッグ用のメッセージを表示しながら開発が行えるように、Write-Debugという専用のコマンドレットを備えています。
コンソールにメッセージを表示するコマンドレットとしてはWrite-Hostコマンドレットがありますが、両者には次のような違いがあります。
- Write-Hostコマンドレットは、実行すれば必ず表示を行う。
- Write-Debugコマンドレットは、
$DebugPreference
シェル変数によって表示制御が行われる
$DebugPreference
シェル変数はデバッグ時の振る舞いを変更する特殊な変数であり、下記の4つの値を指定することが可能です。
値 | 説明 |
"Continue" | Write-Debugに指定されたメッセージを出力 |
"SilentlyContinue" | Write-Debugに指定されたメッセージを出力しない |
"Stop" | Write-Debugに指定されたメッセージを出力した後、動作を停止 |
"Inquire" | Write-Debugに指定されたメッセージを出力後、続行するかを確認 |
下記スクリプトを準備して(ここでは「C:\Work\Debug.ps1」として保存)、$DebugPreference
シェル変数のそれぞれの値の挙動を確認してみたいと思います。
$a = 2 $b = 3 $c = $a + $b Write-Debug "Line4: $c" $a = 4 $b = 5 $c = $a + $b Write-Debug "Line8: $c"
Debug.ps1の各行の意味は下記の通りです。
- 1行目:$aに2を代入
- 2行目:$bに3を代入
- 3行目:$aと$bの和を$cに代入
- 4行目:Write-Debugコマンドレットによる文字列の出力。ここでは「Line4:」と変数$cに代入された値が連結した文字列を出力。
- 5行目:$aに4を代入
- 6行目:$bに5を代入
- 7行目:$aと$bの和を$cに代入
- 8行目:Write-Debugコマンドレットによる文字列の出力。ここでは「Line8:」と変数$cに代入された値が連結した文字列を出力。
Continue
$DebugPreference
に値Continue
を設定した場合の動作を見てみましょう。
まずは、下記のようにして $DebugPreference
の設定を変更します。
PS C:\Work> $DebugPreference = "Continue"
次に、作成したスクリプトを実行してみましょう。
PS C:\Work> ./Debug.ps1 デバッグ: Line4: 5 デバッグ: Line8: 9
Write-Debug
コマンドレットに指定したメッセージを出力することがわかります。
SilentlyContinue
$DebugPreference
に値SilentlyContinue
を設定した場合の動作を見てみましょう。
まずは、下記のようにして $DebugPreference
シェル変数の設定を変更します。
PS C:\Work> $DebugPreference = "SilentlyContinue"
スクリプトを実行します。
PS C:\Work> ./Debug.ps1 PS C:\Work>
スクリプト中の4行目と8行目にあるWrite-Debugに指定したメッセージは出力されずに終了することがわかります。
Stop
$DebugPreference
に値Stop
を設定した場合の動作を見てみましょう。
まずは、下記のようにして $DebugPreference
シェル変数の設定を変更します。
PS C:\Work> $DebugPreference = "Stop"
スクリプトを実行します。
PS C:\Work> ./Debug.ps1 デバッグ: Line4: 5 Write-Debug : シェル変数 "DebugPreference" が Stop に設定されているため、コマンドの実行が停止されました 発生場所 C:\Work\Debug.ps1:4 文字:12 + Write-Debug <<<< "Line4: $c"
1つめのWrite-Debugで指定されたメッセージを表示した後、エラーメッセージを表示して処理を中断することが分かります。
Inquire
$DebugPreference
に値Inquire
を設定した場合の動作を見てみましょう。
まずは、下記のようにして $DebugPreference
シェル変数の設定を変更します。
PS C:\Work> $DebugPreference = "Inquire"
スクリプトを実行します。
PS C:\Work> ./Debug.ps1 デバッグ: Line4: 5 確認 この操作を続行しますか? [Y] はい(Y) [A] すべて続行(A) [H] コマンドの中止(H) [S] 中断(S) [?] ヘルプ (既定値は "Y"):
1つめのWrite-Debug
で指定されたメッセージを表示した後に、スクリプトを実行するかを確認してくることがわかります。
ここで[Y]または[A]を押すと、スクリプトが続行されます。
確認 この操作を続行しますか?[Y] はい(Y) [A] すべて続行(A) [H] コマンドの中止(H) [S] 中断(S) [?] ヘルプ (既定値は "Y"): デバッグ: Line8: 9 確認 この操作を続行しますか? [Y] はい(Y) [A] すべて続行(A) [H] コマンドの中止(H) [S] 中断(S) [?] ヘルプ (既定値は "Y"):
このように、Write-Debugコマンドレットと$DebugPreference
変数を使用することで、デバッグメッセージの出力の振る舞いを制御することが可能です。
Set-PSDebugコマンドレットによるデバッグ
PowerShellには、スクリプトのデバッグを行うために、Set-PSDebug
というコマンドレットがあります。書式は大きく2つに分けることができます。
下記は、スクリプトのデバッグ機能の切り替え、トレース レベルの設定、および strict モードの切り替えを行います。
Set-PSDebug [-Trace 数値] [-Step] [-Strict]
一方、こちらはすべてのスクリプトデバッグ機能を無効にします。
Set-PSDebug -Off
-Traceパラメータ
-Traceパラメータに指定できる値には下記の3つがあります。
値 | 説明 |
0 | スクリプトのトレースを無効にする |
1 | 実行されるスクリプト行をトレースする |
2 | スクリプト行、変数の代入、関数呼び出し、およびスクリプトをトレースする |
では、さきほどのスクリプトファイル(Debug.ps1)を使用して実験してみましょう。
-Traceに0を指定した場合
まずはSet-PSDebug
コマンドレットによるスクリプトファイルのデバッグ方法ですが
PS C:\Work> Set-PSDebug -trace 0; ./Debug.ps1
のようにします。
-Trace
パラメータに0を指定した場合の実行結果は下記の通りで、値0はトレースが無効となっているために1行だけ表示して終わっています。
デバッグ出力の行には、先頭に「デバッグ:」と表示されることに注意してください。
PS C:\Work> Set-PSDebug -trace 0; ./Debug.ps1 デバッグ: 1+ Set-PSDebug -trace 0; ./Debug.ps1
-Trace
に1を指定した場合は行トレースとなりますので、すべての行がデバッグ表示されます。
-Traceに1を指定した場合
PS C:\Work> Set-PSDebug -trace 1; ./Debug.ps1 デバッグ: 1+ Set-PSDebug -trace 1; ./Debug.ps1 デバッグ: 1+ $a = 2 デバッグ: 2+ $b = 3 デバッグ: 3+ $c = $a + $b デバッグ: 4+ Write-Debug "Line4: $c" デバッグ: 5+ $a = 4 デバッグ: 6+ $b = 5 デバッグ: 7+ $c = $a + $b デバッグ: 8+ Write-Debug "Line8: $c"
-Traceに2を指定した場合
-Traceに2を指定した場合は変数の代入、関数呼び出しなど、各行で行われている詳細情報を見ることができます。
PS C:\Work> Set-PSDebug -trace 2; ./Debug.ps1 デバッグ: 1+ Set-PSDebug -trace 2; ./Debug.ps1 デバッグ: ! CALL script 'Debug.ps1' デバッグ: 1+ $a = 2 デバッグ: ! SET $a = '2'. デバッグ: 2+ $b = 3 デバッグ: ! SET $b = '3'. デバッグ: 3+ $c = $a + $b デバッグ: ! SET $c = '5'. デバッグ: 4+ Write-Debug "Line4: $c" デバッグ: 5+ $a = 4 デバッグ: ! SET $a = '4'. デバッグ: 6+ $b = 5 デバッグ: ! SET $b = '5'. デバッグ: 7+ $c = $a + $b デバッグ: ! SET $c = '9'. デバッグ: 8+ Write-Debug "Line8: $c"
上記を見るとわかるように、一番最初にスクリプトファイルの実行を行っているので
! CALL script 'Debug.ps1'
と表示されています。
また、変数に値がセットされるときは
SET $a = '2'.
のように表示されていることが分かります。
上記をまとめると-Trace
は、どの行を通って来たかを確認するだけであれば「1」を、詳細情報(変数にセットされた情報、関数呼び出しなど)を得たい場合には「2」を指定すれば良いことが分かります。
未定義の変数を調査する
Set-PSDebug
にパラメータ-Strict
を指定することで、未定義の変数をエラーとして処理することができます。
下記のように、Set-PSDebugコマンドレットを-Strictパラメータを指定して実行し、値の代入されていない変数を参照しようとするとエラーになることが分かります。
PS > Set-PSDebug -Strict PS > $a 変数 $a は、設定されていないために取得できません。 発生場所 行:1 文字:2 + $a <<<<
また、下記スクリプト(「C:\Work\Strict.ps1」として保存)を準備し
$a = 3 Write-Host ($a + $b)
コマンドラインから実行すると
PS C:\Work> ./Strict.ps1 変数 $b は、設定されていないために取得できません。 発生場所 C:\Work\Strict.ps1:2 文字:20 + Write-Host ($a + $b) <<<<
スクリプトファイル中の変数$b
が値が設定されていないのに使用されたことをエラーとして報告します。
このように、-Strictパラメータを使用することで、未定義の変数を見つけることが可能です。
ステップ実行する
Set-PSDebug
コマンドレットに-Stepパラメータを指定すると、ステップ実行を行うことが可能となります。「ステップ実行」は、スクリプトを1行ずつ停止させながら実行することができるモードです。
最初の方で紹介したDebug.ps1を用いて確認してみましょう。
コマンドラインで
PS C:\Work> Set-PSDebug -step; ./Debug.ps1
と入力して実行してみると、1行実行されるごとにメッセージが表示されます。
PS C:\Work> Set-PSDebug -step; ./Debug.ps1 この操作を続行しますか?1+ Set-PSDebug -step; ./Debug.ps1 [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "Y"): デバッグ: 1+ Set-PSDebug -step; ./Debug.ps1
「規定値は"Y"」と表示されている箇所がありますが、これは[Enter]キーを押すと次の行が押されることを意味しており、[Y]キーを押すのと同操作となります。
次に[Enter]を2回続けて入力し
この操作を続行しますか?2+ $b = 3 [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "Y"): s
というメッセージが表示されたところで[S]を入力します。
この状態で[S]を入力した場合には、処理が一時中断され、プロンプトの表示が
PS C:\Work>>>
に変わります。
ここで、プロントに下記のように$aと入力すると
PS C:\Work>>> $a 2
ステップ実行を行っている地点での変数の値を確認することができます(この場合は変数$a
に2が代入されていることが分かります)。
プロンプトを終了して、デバッグを再会する場合には exit と入力します。
PS C:\Work>>> exit
ブレークポイントを使用する
ブレークポイントとは、プログラムの動作状態を確認するために、強制的に停止したい位置を設定する場所のことです。
ブレークポイントの設定は簡単で$host.EnterNestedPrompt()
をブレークポイントをかけたい場所に記述するだけです。
Debug.ps1を下記のように改善してスクリプトにブレークポイントを設定し、実験してみたいと思います(5行目に挿入しました。スクリプトは「C:\Work\Debug.ps1」として上書き保存します)。)
$a = 2 $b = 3 $c = $a + $b $host.EnterNestedPrompt() #ブレークポイントの設定 Write-Debug "Line4: $c" $a = 4 $b = 5 $c = $a + $b Write-Debug "Line8: $c"
上記を実行してみます。
PS C:\Work> ./Debug.ps1 デバッグ: Line4: 5 PS C:\Work>>>
上記のように、ブレークポイントを設定した位置までコードが実行されプロンプトが表示されます。
この状態は、「ステップ実行する」で説明した「中断処理」と同様で、変数の状態を確認することが可能です。試しに$a
、$b
、$c
がどうなっているかみてみましょう。
PS C:\Work> ./Debug.ps1 デバッグ: Line4: 5 PS C:\Work>>> $a 2 PS C:\Work>>> $b 3 PS C:\Work>>> $c 5 PS C:\Work>>>
このようにブレークポイントを設定すると、ブレークポイントが設定された場所まで一気にコードが実行され、その時点での変数の値を確認することができます。プロンプトを終了するには exitと入力して[Enter]キーを押します。
PS C:\Work>>> exit デバッグ: Line8: 9 PS C:\Work>
まとめ
今回は、PowerShellでのスクリプト開発におけるデバッグ機能について説明しました。
PowerShell自体にはVB.NETやC#のようにグラフィカルなデバッグ環境を持ち備えていません。しかし、今回紹介したデバッグ機能を用いることで、1行ずつステップ実行したり、変数の途中経過をウォッチすることが可能となります。
ぜひ、このデバッグ機能を有効に活用して、効率のよい開発を行っていただければ幸いです。
转载于:https://www.cnblogs.com/c-x-a/p/4488159.html
Windows PowerShell 入門(10)-デバッグ編相关推荐
- Windows PowerShell™ 用户手册(zz)
Windows PowerShell™ 用户手册 Microsoft Corporation 发布日期:2006 年 9 月 摘要 Windows PowerShell™ 是专为系统管理员设计的新 W ...
- Windows PowerShell™ 用户手册
Windows PowerShell™ 用户手册 Microsoft Corporation 发布日期:2006 年 9 月 摘要 Windows PowerShell™ 是专为系统管理员设计的新 W ...
- Proxool - 快速入門
在資料庫應用程式中,資料庫連線的取得是一個耗費時間的動作,為了避免花費時間在連線的取得與關閉上,我們會將連線資源放置在一個池中,有需要連線時就從池中取得,不需要連線時就將之放回池中,以求重複利用連線, ...
- (轉貼) LCD入門常識
Abstract一些TFT-LCD的入門常識,雖然有些過時,對於選購LCD時,應該還是有幫助. Introduction LCD 相關知識 顯示器這種東西是比較級的,在某一家店看完一款顯示器,過條馬路 ...
- 易學易用的 Windows PowerShell
易學易用的 Windows PowerShell 原文地址: http://www.microsoft.com/taiwan/technet/columns/profwin/28-monad.msp ...
- (轉貼) 善用Google從入門到精通 (Misc)
善用GOOGLE -- 從入門到精通 (DOC 簡體字版由網站下載,原作者不詳) 修正版:方煒 台大生機系 一 GOOGLE簡介... 2 二 GOOGLE特色... 2 ...
- Windows PowerShell ISE
导语:对于电脑高手来说,华丽的图形界面往往并不实用,快捷的键盘命令才是王道.Win7集成的PowerShell2.0,更是其中的王中王,让你直接掌控你的电脑命脉. Win7中集成了PowerShell ...
- 不一样的命令行 – Windows PowerShell简介
引子 一直很羡慕Linux的命令提示符(当然他们叫Shell).正则表达式,管道,各种神奇的命令,组合起来就能高效完成很多复杂的任务.效率实在是高.流了n年的哈喇子以后,终于有幸用上了Win7,邂逅了 ...
- powershell提取html字段,Windows PowerShell:PowerShell 中的 HTML 报告
Windows PowerShell:PowerShell 中的 HTML 报告 08/17/2016 本文内容 事实上,您可以使用 Microsoft Windows PowerShell Cmdl ...
最新文章
- “国家使命”图书第一批权威发布
- python_ 学习笔记(hello world)
- Silverlight专题(15) - 你自己的视频播放器之自定义MoveToPointSlider
- linux的find命令满屏权限不够提示
- 3.3 神策数据分析平台
- Layui表单验证lay-verify属性:自定义校验
- 用html如何做发帖的页面,如何用html发帖
- day23 三升序列
- linux 串口 延迟,linux串口操作及设置详解
- Unity接入苹果内购(IAP)
- javah命令详解与idea使用javah一键编译JNI的.头文件
- day54-网络安全
- Cocos2dx 3.x创建Layer的步骤
- 软件测试怎么保证数据的准确性,在MT4软件EA测试过程中,如何获得99.9%的数据质量,提高EA测试的准确性 -...
- 使用html2canvas.min.js将网页生成图片并打印(笔记记录)
- 必看!决定蓝领薪酬高低的因素
- ESP32蓝牙Bluetooth Controller API介绍
- PHP常用系统函数帅哥特供版
- 信息系统项目管理师必背核心考点(二十二)项目变更请求
- 自学软件测试多久出师,零基础要怎么学好室内设计?一般学多久才出师?