PowerShell ObjectViewer(1)

Powershell Analyzer」にインスパイア

PowerShellの開発環境 - PowerShell Memoで紹介した「Powershell Analyzer」では、
PowerShellの実行結果をPropertyGridに表示することで、実行結果を可視化してます。
PropertyGridってオブジェクトの全体像が簡単に把握できて良いですね。
特に、PowerShellに初めて触れるユーザにとって、取っ付き易いでしょう。


さて、PropertyGridを利用したサンプルを作ろうと考えたのですが、
Powershell Analyzer」と同様、コマンド実行結果を可視化するのが最も有用・・・、
という安易な結論に達しました。(^^;

初心者向けPowerShell ObjectViewer


この「PowerShell ObjectViewer」は、テキストボックスにコマンドを入力して「Enter」を押すと、
実行結果をPropertyGridに表示するツールです。

「winlogonプロセス」の表示


上の図は、

get-process | ?{$_.name -eq "winlogon"}

というコマンドを実行した結果です。


「get-process」で実行中の全てのプロセスをパイプで繋げて、「winlogon」という名前のプロセスだけにフィルタリングしています。
そして、PropertyGridに「winlogon.exe」のプロセスオブジェクト(System.Diagnostics.Process)を表示しています。

「new-objectコマンドレット」の表示


上の図は、

get-command new-object

というコマンドを実行した結果で、
「new-object」コマンドレットオブジェクト(System.Management.Automation.CmdletInfo)を表示しています。


ちなみに、「ParameterSets」の右にある「(コレクション)」というカラムの一番右をクリックすると、
以下のダイアログが表示され、コレクションの要素を確認することができます。



う〜ん・・・・。便利ですねえ。

ソースコード

ObjectViewer.ps1
# コマンドを実行する
function runCommand
{
    $resultObj =  Invoke-Expression $txtObject.Text
    return $resultObj
}

# プロパティグリッドにオブジェクトを設定する
function setObject
{
    PARAM($setObj)
    if($setObj -ne $null)
    {
        $pgObject.selectedobject=$setObj.PSObject.BaseObject
        $title = $setObj.toString()
        $frmMain.Text = $title
        Write-Host $title
    }
}

# テキストボックス上で押されたキーをチェックする
function keyCheck
{
    PARAM($keyEventArgs)
    switch($keyEventArgs.KeyCode) 
    {
        ([System.windows.forms.Keys]::Enter) {setObject(runCommand)}
        default{}
    }
}

# 初期処理
[void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") 

# フォーム設定
$frmMain = new-object system.windows.forms.form
$frmMain.Size = new-object System.Drawing.Size(600, 600)

# テキストボックス
$txtObject = new-object System.Windows.Forms.TextBox
$txtObject.AutoSize = $false
$txtObject.Size = new-object System.Drawing.Size(600, 25)
$txtObject.Dock = [System.Windows.Forms.DockStyle]::Top 
$txtObject.Font = `
    new-object System.Drawing.Font($txtObject.Font.SystemFontName, 14)  
$txtObject.Add_KeyDown({keyCheck($_)})

# プロパティグリッド
$pgObject = new-object system.windows.forms.propertygrid
$pgObject.Dock = [System.Windows.Forms.DockStyle]::Fill

# コントロール追加
$frmMain.Controls.Add($txtObject)
$frmMain.Controls.add($pgObject)

# フォーム表示
$frmMain.showdialog()