删除powershell输出中的空行

问题描述 投票:0回答:5

我试图删除输出前后的空白行,但它不起作用。我尝试在第一个 Write-Host 之后添加 -NoNewLine,但到目前为止仅删除一个空白行。

代码:

  $tag1 = "c91638"

    Write-Host "Operating System Information"


    $OSInfo = get-wmiobject -class win32_operatingsystem -computername $tag1 

    $OSInfo `
        | Format-List `
            @{Name="OS Name";Expression={$_.Caption}}, 
            @{Name="OS Boot Time";Expression={$_.ConvertToDateTime($_.LastBootUpTime)}}, 
            @{Name="OS Install Date";Expression={$_.ConvertToDateTime($_.InstallDate)}}; 

    Write-Host "Line test.."

输出:

Operating System Information


OS Name         : Microsoft Windows 7 Enterprise 
OS Boot Time    : 8/27/2015 2:05:35 AM
OS Install Date : 4/4/2014 11:39:15 AM



Line test..

我想做的事:

Operating System Information

OS Name         : Microsoft Windows 7 Enterprise 
OS Boot Time    : 8/27/2015 2:05:35 AM
OS Install Date : 4/4/2014 11:39:15 AM

Line test..
powershell output
5个回答
30
投票

试试这个:

($OSInfo `
    | Format-List `
        @{Name="OS Name";Expression={$_.Caption}}, 
        @{Name="OS Boot Time";Expression={$_.ConvertToDateTime($_.LastBootUpTime)}}, 
        @{Name="OS Install Date";Expression={$_.ConvertToDateTime($_.InstallDate)}}  `
    | Out-String).Trim()

这将清除

Format-List
产生的所有无关空白行。您可能需要插入一些您自己可以控制的。


7
投票

只是添加一条评论,因为我看到这种情况一直在进行,即使是现在 -

Format-List
Format-Table
应该 only 用于在控制台中输出文本。

如果您要将对象输出为文本文件、CSV 等,那么您只需

Select-Object
即可获取所需的对象,而不是
ft
fl
。然后,如果需要文本格式,您可以应用
Out-String

上面的例子应该是:

($OSInfo `
| Select-Object `
    @{Name="OS Name";Expression={$_.Caption}}, 
    ... `
| Out-String).Trim()

2
投票

使用

.Trim()
太过分了,它会删除前导和尾随空格以及空行。如果您只想删除空白行,请尝试此操作,在任何生成字符串的代码之后,执行以下操作:

$result.Trim("`r","`n")

或者对于许多字符串,例如在

Format-Table
或类似内容之后:

$results | Format-Table | Out-String | ForEach-Object { $_.Trim("`r","`n") } 


2
投票

你也可以这样做:

$result=yourCommandHere | Out-String
$result.Trim()

或者在一行中不使用变量:

(yourCommandHere | Out-String).Trim()

0
投票

这是一个一体化函数,可以轻松写入数组项(作为输出结果),删除空行,可以通过管道传输。 2个使用示例如下所示 希望这有帮助

function Write-Array {
    Param(
        [Parameter(Mandatory, ValueFromPipeline)][array] $Array,
        [string]$Prefixe,
        [bool]$Numbering = $False
    )
    if ($Numbering) { 
        $Index = 0
        $NumberOfDigit = $($Array.Count).ToString().Length

        $Array | Format-List | Out-String -Stream | ForEach-Object -Process {
            if (-not [string]::IsNullOrWhiteSpace($_)) {
                "# {0,$NumberOfDigit}$Prefixe{1}" -f ($Index += 1), $_
            }
        }
    } else {
        $Array | Format-List | Out-String -Stream | ForEach-Object -Process {
            if (-not [string]::IsNullOrWhiteSpace($_)) {
                "$Prefixe{0}" -f $_
            }
        }
    }
}

示例#1:

Write-Array @("titi", "toto", "tata", "titi", "toto", "tata", "titi", "toto", "tata", "titi", "toto", "tata") -Prefixe " : " -Numbering $True
#  1 : titi
#  2 : toto
#  3 : tata
#  4 : titi
#  5 : toto
#  6 : tata
#  7 : titi
#  8 : toto
#  9 : tata
# 10 : titi
# 11 : toto
# 12 : tata

示例#2:

Get-Service -Name "*openvpn*" | Select-Object DisplayName,Name,Status,StartType | Write-Array -Prefixe " - "
 - DisplayName : OpenVPN Interactive Service
 - Name        : OpenVPNServiceInteractive
 - Status      : Running
 - StartType   : Automatic
© www.soinside.com 2019 - 2024. All rights reserved.