レジストリのデータをString型で取得

名前がdisplaynameのレジストリデータは以下のように取得できます。

get-ItemProperty -path registry::"<レジストリのディレクトリ>" | select-Object -property displayname

しかし、これはPSCustomObject型でかえされます。また、これを無理やりString型キャストすると以下のようになってしまいます。

(Bonjourだけほしいのに他のものも付いてきます)
そこで、取得したPSCustomObjectのプロパティを詳しく見てみます。レジストリディレクトリを変数aに代入し、変数aのプロパティを変数bに代入します。

次に、変数bのメソッドやプロパティを参照してみます。

すると、PSCustomObjectの中のレジストリデータはString型で取得できることがわかります。そのため、次のようにするとString型で取得できます。

以上を使ってプログラムを書き直しました。プログラム名の他にバージョンとインストール日も追加しました。個々のデータは:で区切っています。結果はテキストファイルに出力するようにしました。

set-PSDebug -strict
# ----------------------------------------------------
# プログラムのアンインストールまたは変更のプログラム名を取得する-パート2-
# 出力先:C:\Users\sinpay\Documents\work\powershell
# \20091206_shell\program_file.txt
# ----------------------------------------------------

# 出力ファイル
$out_file = "C:\Users\sinpay\Documents\work\powershell\20091206_shell\program_file.txt"
# レジストリディレクトリ
$reg_parent_dir = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
# カウンタ
[long]$count = 1

# レジストリディレクトリのサブディレクトリ分ループ
foreach ($reg_child_dir in get-ChildItem -path registry::$reg_parent_dir){
    # レジストリのプロパティを取得
    [pscustomobject]$program_object = get-ItemProperty -path registry::$reg_child_dir
    # プログラム名を取得
    [string]$program_name = $program_object.displayname
    # バージョンを取得
    [string]$program_version = $program_object.DisplayVersion
    # インストール日を取得
    [string]$install_date = $program_object.InstallDate
    # プログラム名が空白でなかった場合
    if ($program_name -ne ""){
        # 出力行を編集
        $line_str = [string]$count + ":" + $program_name + ":" + $program_version + ":" + $install_date
        # 行出力
        $line_str >> $out_file
        # カウンタアップ
        [long]$count = [long]$count + 1
    }
}