レジストリのデータを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 } }