如何在对多台计算机使用invoke-command时获取返回码?

时间:2012-11-13 10:59:31

标签: powershell powershell-remoting

我正在尝试知道在使用这样的invoke-command时我的scipt是​​否在所有远程主机上有效执行:

Invoke-Command -ComputerName "test1","test2" -ScriptBlock {$env:computername}

当它以交互方式运行时,我可以看到如下错误消息:

  
      
  • CategoryInfo:OpenError:(test1:String)[],PSRemotingTransportException
  •   
  • FullyQualifiedErrorId:NetworkPathNotFound,PSSessionStateBroken
  •   

但是在“批处理模式”下运行脚本时怎么办?

我尝试了try {} catch {}语句,但它似乎无法正常工作,

然后我尝试在变量中处理结果,也没有工作:

PS>$result=Invoke-Command -ComputerName "test1","test2","rodc1" -ScriptBlock {$env:computername}

PS>$result
rodc1

我最终为每个主机使用new-pssession并像这样测试

$computers=@("test1","test2","rodc1")
$computers|%{
    $s=new-PSSession -ComputerName $_
    if($s -eq $null){
        $errs +="$_ : cant connect to host `n<br/>"
    }
    else{
        $sess+=$s
    }
}

invoke-Command  -Session $sess -ScriptBlock {$env:computername} -asJob -jobName "test"

现在,我可以使用$ errs来了解哪些计算机失败

有更好/更简单的方法吗? 谢谢

2 个答案:

答案 0 :(得分:0)

这里仍然没有抓住一些错误是要修改的部分:

$computers=@("test1","test2","rodc1")
$computers|%{
    try{
    $s=new-PSSession -ComputerName $_
    if($s -eq $null){
        $rapport+="$_ : cant connect to host`n<br/>"
    }
    else{
        $sess+=$s
    }
    }
    catch{
        $rapport+="$_ : cant connect to host`n<br/>"
    }
 }

答案 1 :(得分:0)

您只需比较输入列表和输出列表:

Compare-Object $computers $result

InputObject SideIndicator
----------- -------------
test1     <=
test2     <=

或直接

(Compare-Object $computers $result).InputObject