如何将输出行格式化为字符串或对象字段?

时间:2016-09-29 22:45:34

标签: powershell

目标是运行一个脚本,将PowerShell远程检查检查到主机列表。我希望每个作业的状态显示在一行而不是主机和状态在不同的行上。我想看看:

server1 Completed
server2 Completed
server3 Failed
server4 Completed

我尝试使用{"$_.Location, $_.State"}作为最后一行,但这似乎是发出类型而不是值。

我是否需要创建一个New-Object来包含这两个字段才能输出?

是的,在如此微小的请求上使用-AsJob是过分的。下一个目标是建立一些能够开始长期工作的东西。

有关格式化输出的任何建议吗?或者,这里的任何其他东西都不是PowerShell-ic。

$server_list = @(
    'server1'
    ,'server2'
    ,'server3'
    ,'server4'
)

$outfile = ".\get-psversions.csv"

$server_list |
    ForEach-Object {
        $thishost = $_

        Try {
            $current_host = $_
            $v = Invoke-Command -ComputerName $current_host {$PSVersionTable.PSVersion} -ErrorAction Stop -AsJob
        }
        Catch
        {
            $v = New-Object -TypeName "System.Version"
            $v | Add-Member -MemberType NoteProperty -Name PSComputerName -Value "$thishost connect failed"
        }
        $v
    }
Get-Job | Wait-Job | ForEach-Object {$_.Location, $_.State}
PS X:\Scripts\PSAutomation> .\get-v2.ps1

Id     Name      PSJobTypeName   State     HasMoreData   Location      Command
--     ----      -------------   -----     -----------   --------      -------
390    Job390    RemoteJob       Running   True          server1       $PSVersionTable.PSVersion
392    Job392    RemoteJob       Running   True          server2       $PSVersionTable.PSVersion
394    Job394    RemoteJob       Running   True          server3       $PSVersionTable.PSVersion
396    Job396    RemoteJob       Running   True          server4       $PSVersionTable.PSVersion
server1
Completed
server2
Completed
server3
Failed
server4
Completed

2 个答案:

答案 0 :(得分:0)

将您的代码更改为ForEach-Object,如:

ForEach-Object {"$($_.Location) $($_.State)"}

答案 1 :(得分:0)

要选择对象的属性,请使用Select-Object

Get-Job | Wait-Job | Select-Object Location, State

如果需要强制执行表格输出,则将结果传递到Format-Table(默认情况下,如果显示的属性数量超出PowerShell切换到列表格式,则表格形式最多显示4个属性)。

Get-Job | Wait-Job | Select-Object Location, State | Format-Table -AutoSize

当然,如果您需要具有特定格式的输出字符串,也可以使用format operator

Get-Job | Wait-Job | ForEach-Object { "{0}:`t{1}" -f $_.Location, $_.State }