2009-10-28 236 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 } 

但所有导致奇怪的格式时输出到控制台,并有三个方块字每行后,当输出到文件中。我试过Format-List,Format-TableFormat-Wide,但没有运气。原来我以为像这样的工作:

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

但是,这只是给了我一个错误。

回答

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 

谨防使用`而不是'。在我的键盘上(US-English Qwerty布局),它位于1的左边。(感谢Koen Zomers)

+1

这实际上工作。但是,如果添加了任何其他值,即$ _。GetValue('InstallDate'),那么它会混乱。尽管如此感谢您的帮助,但它完成了原来的问题。 – mike 2009-10-29 12:53:48

+0

我在下面添加了一个替代答案,我认为它可能更好:) – Jaykul 2009-10-29 13:24:45

+7

工程很棒。谨防使用'而不是'。在我的键盘上(US-English Qwerty布局),它位于1. – 2010-07-09 11:41:56

64

这给一试:

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( “显示名称”)返回null一些条目,所以我过滤出来。顺便说一句,你很接近这一点:

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

除了在字符串中,如果你需要访问一个变量的属性,那就是“计算表达式”,那么你需要使用的子表达式的语法像这样:

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

基本上是一个双引号的字符串在PowerShell将扩大变量,如$_,但不会计算表达式除非您使用此语法把一个子表达式中的表达式:

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

我尝试了上述两种建议,格式仍然不是100%。在记事本中,每个换行符都显示为一个小方块(unicode也许?)。在写字板中一切似乎都很好,但Word抱怨编码。 使用Foreach {“$($ _。GetValue('DisplayName'))'n”}仍然在任何文件中输出错误的格式。 – mike 2009-10-28 19:23:03

+0

Powershell的默认输出是Unicode。我将修改该示例以显示如何以ascii格式保存。 – 2009-10-28 20:31:41

+0

我试过每个编码选项的out-file,他们都没有给我正确的结果。我检查了环境变量$ OutputEncoding,并且一切都产生了US-ASCII。我想我会尝试一种不同的方法,可能是用python。 – mike 2009-10-29 12:47:42

4

我认为你对你的最后一个例子有了正确的想法。你只有一个错误,因为你试图把引号放在已经引用的字符串中。这将修复它:

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

编辑:基思的$()操作符实际上创建一个更好的语法(我总是忘记这一个)。您也可以逃脱引号内引用像这样:

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

这是问题的正确答案。这应该是被接受的答案。 – 2015-07-12 22:51:47

6

最终,你试图做的与每个之间的EXTRA空白行是有点令人困惑:)

我认为你真正想要做的是使用Get-ItemProperty。缺失值时会出错,但您可以用-ErrorAction 0将它们禁用或仅将它们留作提醒。由于注册表提供程序返回了额外的属性,因此您需要使用与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 
+0

左侧是的!我应该从一开始就这样做,而不是用新的线条搞乱。谢谢您的帮助!真的很感激它。 – mike 2009-10-29 15:24:59

+0

@mike,你应该把这个作为答案,对吧? – Jaykul 2012-06-13 04:42:16

4

,我倾向于使用,主要是因为它的简单,我没有多想,作为下面使用Write-Output选项。写输出将在您的字符串中放入一个EOL标记,您可以简单地输出完成的字符串。

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

或者,你也可以只用写输出生成整个字符串,然后推完串入Out-File

相关问题