web-dev-qa-db-ja.com

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" }

しかし、それはちょうど私にエラーを与えました。

65
mike

または、 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)

84
Jaykul

これを試してください:

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`>).
75
Keith Hill

最終的に、各行の間の余分な空白行でやろうとしていることは少し混乱する:)

あなたが本当にやりたいことは 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
6
Jaykul

最後の例で正しい考えがあったと思います。すでに引用された文字列内に引用符を入れようとしたため、エラーが発生しました。これで修正されます:

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" }
5
Ludovic Chabant

私が使用する傾向があるオプションは、主に単純であり、考える必要がないため、以下のように Write-Output を使用しています。 Write-Outputは文字列にEOLマーカーを配置し、完成した文字列を単純に出力できます。

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

または、Write-Outputを使用して文字列全体を構築し、完成した文字列を Out-File にプッシュすることもできます。

4
InfoSponge