PowerShell ObjectViewer(2)
ソースコードの解説
PowerShell ObjectViewer(1) - PowerShell Memoで紹介した「PowerShell ObjectViewer」のソースコード解説です。
対象ソースコード
1 # コマンドを実行する 2 function runCommand 3 { 4 $resultObj = Invoke-Expression $txtObject.Text 5 return $resultObj 6 } 7 8 # プロパティグリッドにオブジェクトを設定する 9 function setObject 10 { 11 PARAM($setObj) 12 if($setObj -ne $null) 13 { 14 $pgObject.selectedobject=$setObj.PSObject.BaseObject 15 $title = $setObj.toString() 16 $frmMain.Text = $title 17 Write-Host $title 18 } 19 } 20 21 # テキストボックス上で押されたキーをチェックする 22 function keyCheck 23 { 24 PARAM($keyEventArgs) 25 switch($keyEventArgs.KeyCode) 26 { 27 ([System.windows.forms.Keys]::Enter) {setObject(runCommand)} 28 default{} 29 } 30 } 31 32 # 初期処理 33 [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") 34 35 # フォーム設定 36 $frmMain = new-object system.windows.forms.form 37 $frmMain.Size = new-object System.Drawing.Size(600, 600) 38 39 # テキストボックス 40 $txtObject = new-object System.Windows.Forms.TextBox 41 $txtObject.AutoSize = $false 42 $txtObject.Size = new-object System.Drawing.Size(600, 25) 43 $txtObject.Dock = [System.Windows.Forms.DockStyle]::Top 44 $txtObject.Font = ` 45 new-object System.Drawing.Font($txtObject.Font.SystemFontName, 14) 46 $txtObject.Add_KeyDown({keyCheck($_)}) 47 48 # プロパティグリッド 49 $pgObject = new-object system.windows.forms.propertygrid 50 $pgObject.Dock = [System.Windows.Forms.DockStyle]::Fill 51 52 # コントロール追加 53 $frmMain.Controls.Add($txtObject) 54 $frmMain.Controls.add($pgObject) 55 56 # フォーム表示 57 $frmMain.showdialog()
アセンブリのロード
32 # 初期処理 33 [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
以下は、ロード済みのアセンブリ情報を表示するスクリプトですが、アセンブリのロード後、実行すると、読み込まれている事が確認できます。
[System.AppDomain]::CurrentDomain.GetAssemblies()
フォームの生成
35 # フォーム設定 36 $frmMain = new-object system.windows.forms.form 37 $frmMain.Size = new-object System.Drawing.Size(600, 600)
- 36行目:Formオブジェクトを生成し、37行目でサイズを決定しています。
- 37行目:Seizeプロパティには「System.Drawing.Size」を代入します。
テキストボックスの生成
39 # テキストボックス 40 $txtObject = new-object System.Windows.Forms.TextBox 41 $txtObject.AutoSize = $false 42 $txtObject.Size = new-object System.Drawing.Size(600, 25) 43 $txtObject.Dock = [System.Windows.Forms.DockStyle]::Top 44 $txtObject.Font = ` 45 new-object System.Drawing.Font($txtObject.Font.SystemFontName, 14) 46 $txtObject.Add_KeyDown({keyCheck($_)})
- コマンド入力欄用のテキストボックスを設定しています。
- 41行目:AutoSizeプロパティをfalseにしています。
AutoSizeプロパティはデフォルトがtrueですが、trueだと高さの変更ができません。 - 42行目:はサイズの設定です。
- 43行目:DockをTOPにすることで、フォームサイズを変更した際にテキストボックスの幅が自動でフィットするようになります。
- 44〜45行目:フォントサイズの指定です。
- 46行目:テキストボックスのKeyDownイベントのイベントハンドラを「keyCheck」ファンクションに設定しています。
- 46行目:「keyCheck」ファンクションの引数に渡している「$_」には「KeyEventArgs」オブジェクトが格納されます。
このオブジェクトを利用し、入力キーのチェックを行います。
プロパティグリッドの生成
48 # プロパティグリッド 49 $pgObject = new-object system.windows.forms.propertygrid 50 $pgObject.Dock = [System.Windows.Forms.DockStyle]::Fill
- 50行目:DockをFillに指定し、フォームいっぱいに広がるように設定しています。
フォームへコントロールを追加、フォームの表示
52 # コントロール追加 53 $frmMain.Controls.Add($txtObject) 54 $frmMain.Controls.add($pgObject) 55 56 # フォーム表示 57 $frmMain.showdialog()
- 53〜54行目:コントロールをフォームへ追加しています。
- 57行目:フォームの表示です。
入力キーのチェック
21 # テキストボックス上で押されたキーをチェックする 22 function keyCheck 23 { 24 PARAM($keyEventArgs) 25 switch($keyEventArgs.KeyCode) 26 { 27 ([System.windows.forms.Keys]::Enter) {setObject(runCommand)} 28 default{} 29 } 30 }
- テキストボックスの入力キーをチェックし、Enterキーを押された際にコマンドを実行します。
- 25行目〜:入力キーは引数で渡された$keyEventArgs(KeyEventArgsオブジェクト)のKeyCodeプロパティに格納されています。
- 27行目:入力キーの判定には[System.windows.forms.Keys]列挙体を利用します。
コマンドの実行
1 # コマンドを実行する 2 function runCommand 3 { 4 $resultObj = Invoke-Expression $txtObject.Text 5 return $resultObj 6 }
- 4行目:テキストボックスに入力されたコマンドを「Invoke-Expression」コマンドレットで実行しています。
- 5行目:コマンドの実行結果を戻り値にしています。この戻り値をプロパティグリッドに設定します。
プロパティグリッドにオブジェクトを設定
8 # プロパティグリッドにオブジェクトを設定する 9 function setObject 10 { 11 PARAM($setObj) 12 if($setObj -ne $null) 13 { 14 $pgObject.selectedobject=$setObj.PSObject.BaseObject 15 $title = $setObj.toString() 16 $frmMain.Text = $title 17 Write-Host $title 18 } 19 }
- 14行目:引数に渡したオブジェクトをプロパティグリッドに設定しています。
- 15〜16行目:オブジェクトの文字列表現をフォームのタイトルに表示。
- 17行目:フォームのタイトルに表示する文字列をコンソールにも出力。