如何在PowerShell中添加换行符到命令输出?

我使用PowerShell运行以下代码以获取registry中添加/删除程序的列表:

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 } 

但是,输出到控制台时都会导致奇怪的格式化,并且在输出到文件时每行之后会有三个方块字符。 我尝试了Format-ListFormat-TableFormat-Wide ,没有运气。 最初,我认为这样的事情会起作用:

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

但那只是给了我一个错误。

或者,只需将输出字段分隔符设置为双换行符,然后确保在将其发送到文件时获得一个string:

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

除了在一个string中,如果你需要访问一个variables的属性,即“求值expression式”,那么你需要使用如下所示的子expression式语法:

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

本质上,在一个双引号string中,PowerShell将像$_这样扩展variables,但是它不会计算expression式, 除非您使用以下语法将expression式放在子expression式中:

 $(`<Multiple statements can go in here`>). 

最后,你正在试图做与每个之间的额外空白行有点混乱:)

我想你真正想要做的就是使用Get-ItemProperty 。 缺less值时会发生错误,但可以使用-ErrorAction 0来禁止它们,或者将它们-ErrorAction 0提醒。 由于registry提供程序返回了额外的属性,因此您需要将其保存在与Get-Properties使用相同属性的Select-Object中。

然后,如果你想要在每一行之间有一个空行的属性,使用Format-List (否则,使用Format-Table来获得每行一个)。

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

我想你最后一个例子的想法是正确的。 你只有一个错误,因为你试图把引号放在一个已经引用的string中。 这将解决它:

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

编辑:Keith的$()操作符实际上创build了一个更好的语法(我总是忘记这个)。 你也可以在引号里面引用引号,如下所示:

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

我倾向于使用的选项,主要是因为它很简单,我不必考虑,正在使用写输出如下。 写输出将在您的string放EOL标记,你可以简单地输出完成的string。

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

或者,也可以使用Write-Output构build整个string,然后将完成的string推送到Out-File 。