PowerShell中写入输出之前的错误

时间:2015-01-06 16:32:33

标签: powershell output

我正在编写一个函数来从各种计算机中收集WMI信息。我做的第一件事是检查我是否可以访问当前的计算机,如果不是,我写错误并继续。我的问题是,如何将错误写入屏幕然后成功调用的结果? (删节代码:)

Function Get-Info
{
    Param([Parameter(ValueFromPipeline=$true)]
    [string[]] $computerName = "." )
    Process
    {
        foreach ($Computer in $ComputerName)
        {
            if (-Not $(test-connection $computer -Count 2 -ErrorAction SilentlyContinue) )
            {
                Write-Error "Unable to access $computer"
                continue
            }
            $Info = get-WMIObject -Class <someClass> -ComputerName $Computer
            $result = New-Object PSObject -Property @{
                 Prop1 = $Info.Property
                 <# ... #> }
            Write-Output $Result
       }
   }
}

当我查询系统集合时,我得到info, <error>, info, <error>而不是<error>,<error>,info...这就是我想要的。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

只需将结果累积到变量中,然后在完成后输出并写入所有错误:

$Result = $computers | Get-Info
$Result

答案 1 :(得分:0)

在这里,我只是将所有错误收集到$ errorComputers中,并将所有成功的计算机收集到$ validComputers中,然后在代码末尾显示它们。请注意,方法不能很好地利用PowerShell管道(完全没有!),但它实现了您正在寻找的目标,在有效条目之前列出错误。

Function Get-Info
{
Param([Parameter(ValueFromPipeline=$true)]
[string[]] $computerName = "." )
Process
{
    foreach ($Computer in $ComputerName)
    {
        if (-Not $(test-connection $computer -Count 2 -ErrorAction SilentlyContinue) )
        {
            $errorcomputers += $computer
            continue
        }
        $Info = get-WMIObject -Class <someClass> -ComputerName $Computer
        $result = New-Object PSObject -Property @{
             Prop1 = $Info.Property
             <# ... #> }
        $validComputers += $Result
   }
}
$errorcomputers | ForEach-Object {
   Write-Warning "Unable to contact $PSitem"
   }
$validComputers
}

现在,在第二个例子中,我使用了Try / Catch而不是之前的逻辑。这应确保首先显示您的错误,并保持过程块的功能以提高速度。

Function Get-Info
{
Param([Parameter(ValueFromPipeline=$true)]
[string[]] $computerName = "." )
Process
{
    foreach ($Computer in $ComputerName)
    {

    try {test-connection $computer -Count 1 -ErrorAction Stop}
   catch{Write-Error "Unable to access $computer"
                Continue}
        $Info = get-WMIObject -Class <someClass> -ComputerName $Computer
        $result = New-Object PSObject -Property @{
             Prop1 = $Info.Property
             <# ... #> }
        Write-Output $Result
   }
  }
}