PowerShell Memo

このサイトはPowerShell(MSH/Monad)奮闘記です

管理人「newpops吉岡洋」が
「PowerShell(旧名:MSH/Monad)」の研究結果を日々綴っていきます。

【お知らせ】
この日記からPowerShellのTipsを抽出し「PowerShell FAQ」として整理しました。


2006-05-21

[][]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") 
  • Windowsフォーム用のアセンブリをロードしています。
  • フォーム、ボタン、各種コントロールを利用するために必要です。

以下は、ロード済みのアセンブリ情報を表示するスクリプトですが、アセンブリのロード後、実行すると、読み込まれている事が確認できます。

[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  }