PowerShellを使用して次のコードを実行し、レジストリから追加/削除プログラムのリストを取得します。
Get-ChildItem -path hklm:\software\Microsoft\windows\currentversion\uninstall `
| ForEach-Object -Process { Write-Output $_.GetValue("DisplayName") } `
| Out-File addrem.txt
リストをプログラムごとに改行で区切ってほしい。私はもう試した:
Get-ChildItem -path hklm:\software\Microsoft\windows\currentversion\uninstall `
| ForEach-Object -Process { Write-Output $_.GetValue("DisplayName") `n } `
| out-file test.txt
Get-ChildItem -path hklm:\software\Microsoft\windows\currentversion\uninstall `
| ForEach-Object {$_.GetValue("DisplayName") } `
| Write-Host -Separator `n
Get-ChildItem -path hklm:\software\Microsoft\windows\currentversion\uninstall `
| ForEach-Object -Process { $_.GetValue("DisplayName") } `
| foreach($_) { echo $_ `n }
しかし、コンソールに出力するときはすべて奇妙なフォーマットになり、ファイルに出力するときは各行の後に3つの四角い文字が付きます。 Format-List
、Format-Table
、Format-Wide
を試してみましたが、うまくいきませんでした。もともと、私はこのような何かがうまくいくと思った:
Get-ChildItem -path hklm:\software\Microsoft\windows\currentversion\uninstall `
| ForEach-Object -Process { "$_.GetValue("DisplayName") `n" }
しかし、それはちょうど私にエラーを与えました。
または、 output field separator (OFS)を改行を2つに設定し、ファイルに送信するときに文字列を取得するようにします。
$OFS = "`r`n`r`n"
"$( gci -path hklm:\software\Microsoft\windows\currentversion\uninstall |
ForEach-Object -Process { write-output $_.GetValue('DisplayName') } )" |
out-file addrem.txt
使用することに注意してください ` ではなく '。キーボード(US-English Qwertyレイアウト)の左側にあります 1。
(コメントから削除-ありがとうKoen Zomers)
これを試してください:
PS> $nl = [Environment]::NewLine
PS> gci hklm:\software\Microsoft\windows\currentversion\uninstall |
ForEach { $_.GetValue("DisplayName") } | Where {$_} | Sort |
Foreach {"$_$nl"} | Out-File addrem.txt -Enc ascii
Addrem.txtファイルに次のテキストが生成されます。
Adobe AIR
Adobe Flash Player 10 ActiveX
...
注:私のシステムでは、GetValue( "DisplayName")が一部のエントリに対してnullを返すため、それらを除外します。ところで、あなたはこれに近かった:
ForEach-Object -Process { "$_.GetValue("DisplayName") `n" }
文字列内を除き、変数のプロパティにアクセスする必要がある場合、つまり「式を評価する」場合、次のような部分式構文を使用する必要があります。
Foreach-Object -Process { "$($_.GetValue('DisplayName'))`r`n" }
本質的に二重引用符で囲まれた文字列内で、PowerShellは$_
のような変数を展開しますが、式を評価しませんただしこの構文を使用して部分式内に式を配置します。
$(`<Multiple statements can go in here`>).
最終的に、各行の間の余分な空白行でやろうとしていることは少し混乱する:)
あなたが本当にやりたいことは Get-ItemProperty を使用することだと思います。値が欠落している場合はエラーが発生しますが、-ErrorAction 0
を使用してそれらを非表示にしたり、リマインダーとして残すことができます。レジストリプロバイダーは追加のプロパティを返すため、Get-Propertiesと同じプロパティを使用する Select-Object を使用する必要があります。
次に、空白行のある行の各プロパティが必要な場合は、 Format-List を使用します(それ以外の場合は、 Format-Table を使用して行ごとに1つを取得します)。
gci -path hklm:\software\Microsoft\windows\currentversion\uninstall |
gp -Name DisplayName, InstallDate |
select DisplayName, InstallDate |
fl | out-file addrem.txt
最後の例で正しい考えがあったと思います。すでに引用された文字列内に引用符を入れようとしたため、エラーが発生しました。これで修正されます:
gci -path hklm:\software\Microsoft\windows\currentversion\uninstall | ForEach-Object -Process { write-output ($_.GetValue("DisplayName") + "`n") }
編集:Keithの$()演算子は、実際により良い構文を作成します(このことはいつも忘れています)。また、引用符内の引用符をエスケープすることもできます。
gci -path hklm:\software\Microsoft\windows\currentversion\uninstall | ForEach-Object -Process { write-output "$($_.GetValue(`"DisplayName`"))`n" }
私が使用する傾向があるオプションは、主に単純であり、考える必要がないため、以下のように Write-Output を使用しています。 Write-Outputは文字列にEOLマーカーを配置し、完成した文字列を単純に出力できます。
Write-Output $stringThatNeedsEOLMarker | Out-File -FilePath PathToFile -Append
または、Write-Outputを使用して文字列全体を構築し、完成した文字列を Out-File にプッシュすることもできます。