2009-10-28 17 views
49

私は、レジストリから追加/削除プログラムのリストを取得するにはPowerShellを使用して次のコードを実行します。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-ListFormat-TableFormat-Wideを試してみました。もともと、私はこれがうまくいくと思った:

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object -Process { "$_.GetValue("DisplayName") `n" } 

しかし、それは私にエラーを与えた。

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 

... 

注:

答えて

65

それとも、単に二重改行を出力フィールドセパレータを設定し、あなたがファイルにそれを送信するときに文字列を取得してください:あなたはまたように引用符の内側に引用符をエスケープすることができます

$OFS = "`r`n`r`n" 
"$(gci -path hklm:\software\microsoft\windows\currentversion\uninstall | 
    ForEach-Object -Process { write-output $_.GetValue('DisplayName') })" | 
out-file addrem.txt 

`とnot the 'を使うことに注意してください。私のキーボード(US-English Qwertyレイアウト)は1の左側にあります。(コメントから移りました - ありがとうKoen Zomers)

+1

これは実際に働いた。しかし、他の値、つまり$ _。GetValue( 'InstallDate')が追加されている場合、それは崩れます。それは元の質問を成し遂げますが、助けに感謝します。 – mike

+0

私はおそらくもっと良いと思う以下の代替回答を追加しました:) – Jaykul

+7

素晴らしいです。 'とnot the 'を使用することに注意してください。私のキーボード(US-English Qwertyレイアウト)では、1の左側にあります。 –

64

これを試してみてください私のシステムで、GetValueメソッド( "DisplayNameには")のためにnullを返しますいくつかのエントリ、私はそれらをフィルタリングします。ところで、あなたはこれに接近していた:あなたは、変数のプロパティにアクセスする必要がある場合はその除き

ForEach-Object -Process { "$_.GetValue("DisplayName") `n" } 

文字列の中で、すなわち、「式を評価する」、あなたはそうのような部分式の構文を使用する必要があります:

Foreach-Object -Process { "$($_.GetValue('DisplayName'))`r`n" } 

基本的には、二重引用符で囲まれた文字列内のPowerShellは$_のような変数を拡大していきますが、それは式を評価しませんない限り、あなたはこの構文を使用して部分式内の式を置く:

+0

私は上記の両方の提案を試みましたが、フォーマットはまだ100%ではありません。それぞれの改行は、メモ帳で小さな正方形(多分ユニコードでしょうか?)として表示されます。ワードパッドではすべてうまく見えますが、Wordはエンコードについて不平を言います。 Foreach {"$($ _。GetValue( 'DisplayName'))' n)}を使用すると、どのファイルでも間違った形式が出力されます。 – mike

+0

Powershellのデフォルト出力はUnicodeです。この例を変更して、ASCII形式で保存する方法を示します。 –

+0

私はout-fileのすべてのエンコーディングオプションを試しましたが、どれも正しい結果を得ていませんでした。私は環境変数$ OutputEncodingをチェックし、すべてがUS-ASCIIになった。私は別のアプローチを試してみたいと思います。多分、Pythonで。 – mike

4

最後の例で正しい考えがあると思います。すでに引用されている文字列の中に引用符を入れようとしていたため、エラーが出ました。これは、それを修正します:

gci -path hklm:\software\microsoft\windows\currentversion\uninstall | ForEach-Object -Process { write-output ($_.GetValue("DisplayName") + "`n") } 

編集:キースの$()演算子は、実際に、より良い構文を作成します(私はいつもこの1忘れます)。

gci -path hklm:\software\microsoft\windows\currentversion\uninstall | ForEach-Object -Process { write-output "$($_.GetValue(`"DisplayName`"))`n" } 
+1

これは質問に対する正解です。これは受け入れられる答えでなければなりません。 –

6

最終的に、それぞれの間にEXTRAの空白行を使って何をしようとしていますか?ちょっと混乱します:)

あなたが本当にやりたかったのは、Get-ItemPropertyです。値がない場合はエラーが発生しますが、-ErrorAction 0を使用して値を抑制することも、リマインダとして残すこともできます。レジストリプロバイダは追加のプロパティを返すため、Get-Propertiesと同じプロパティを使用するSelect-Objectを使用します。

次に、空白行を含む行に各プロパティを挿入する場合は、Format-Listを使用します(それ以外の場合は、行ごとに1つずつ取得するにはFormat-Tableを使用します)。

gci -path hklm:\software\microsoft\windows\currentversion\uninstall | 
gp -Name DisplayName, InstallDate | 
select DisplayName, InstallDate | 
fl | out-file addrem.txt 
+0

はい!私は新しい線でぶちまくのではなく、最初からこのようにしていたはずです。助けてくれてありがとう!心から感謝する。 – mike

+0

@mike、これを答えとして設定する必要があります。 – Jaykul

4

私はそれが簡単だと私は、以下のようにWrite-Outputを使用していると思わする必要はありません主な理由は、使用する傾向があるオプション。 Write-Outputはあなたのために文字列にEOLマーカーを置き、完成した文字列を出力するだけです。また

Write-Output $stringThatNeedsEOLMarker | Out-File -FilePath PathToFile -Append 

、あなたはまた、単に書き込み出力を使用して文字列全体を構築し、Out-Fileに完成した文字列をプッシュすることができます。

関連する問題