我正在编写一个函数来从各种计算机中收集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...
这就是我想要的。
非常感谢任何帮助。
答案 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
}
}
}