如何在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-List
, Format-Table
和Format-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 。