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

25 浏览
0 Comments

如何在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-Table`和`Format-Wide`,但没有成功。最初,我以为像这样的写法会起作用:

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

但是这只给我报错。

0
0 Comments

问题原因:在PowerShell中,将命令输出添加到新行的问题。

解决方法:使用以下代码来添加新行:

$nl = [Environment]::NewLine
gci hklm:\software\microsoft\windows\currentversion\uninstall | 
        ForEach { $_.GetValue("DisplayName") } | Where {$_} | Sort |
        Foreach {"$_$nl"} | Out-File addrem.txt -Enc ascii

该代码将从注册表中获取软件的显示名称,并将其按字母顺序排序,然后将每个名称添加到新行,并输出到名为addrem.txt的文本文件中。

注意:在某些系统中,GetValue("DisplayName")返回null值,因此需要将其过滤掉。

另外,可以尝试以下代码:

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

在双引号字符串中,如果需要访问变量的属性,即"评估表达式",则需要使用子表达式语法"$()"。这样在PowerShell中的双引号字符串中,PowerShell将展开变量,但不会评估表达式,除非使用子表达式语法。

尝试了上述两种建议后,仍然无法完全解决格式问题。每个新行在记事本中显示为小方块(可能是Unicode字符?)。在Wordpad中一切正常,但Word则会提示编码错误。

Powershell的默认输出格式是Unicode。可以修改示例来显示如何以ascii格式保存。

尝试了out-file的所有编码选项,但没有给出正确的结果。检查了环境变量$OutputEncoding,发现它是US-ASCII。计划尝试使用其他方法,比如Python。

0
0 Comments

问题的原因是在PowerShell中如何在命令输出中添加换行符。解决方法是使用`write-output`命令以及双引号和转义字符来实现。

以下是解决方法的代码示例:

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

以上代码是问题的正确答案,并且应该被接受为解决方案。

0
0 Comments

这个问题的出现是因为希望在PowerShell命令输出中添加换行符。解决方法是设置输出字段分隔符(OFS)为双重换行符,并确保在发送到文件时得到一个字符串。具体代码如下:

$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)

这个解决方法确实有效。但是,如果添加了其他值,比如`$_.GetValue('InstallDate')`,那么可能会出现问题。尽管如此,它仍然满足了最初的问题,感谢提供帮助。

我在下面添加了一个我认为可能更好的替代答案 🙂

0