2017-04-10 19 views
2

私はコンピュータのリストを持つファイルを持っています。私はそのリストをループし、空きがあるかどうかを報告する必要があります。Foreach try catch

$list = get-content "pathtofile.txt" 

foreach ($computer in $list) { 
    try { 
    quser /server:$computer 
    } catch [System.Management.Automation.RemoteException] { 
    Write-Host "$computer is free" 
    } 
} 

これでうまくいきますが、エラーメッセージを取得してコンピュータ名の混乱に変更することは無料です。

現時点ではまだ空いているコンピュータでは

 
quser : No User exists for * 
At line:5 char:5 
+  quser /server:$computer 
+  ~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (No User exists for *:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

を返しています。

私が知っているコンピュータに対してquserのコマンドを実行してSystem.Management.Automation.RemoteExceptionを得ることができたは無料で、その後、$Error[0] | fl * -Forceを実行している:私の例外コードを与えた

 
writeErrorStream  : True 
PSMessageDetails  : 
Exception    : System.Management.Automation.RemoteException: No User exists for * 
TargetObject   : No User exists for * 
CategoryInfo   : NotSpecified: (No User exists for *:String) [], RemoteException 
FullyQualifiedErrorId : NativeCommandError 
ErrorDetails   : 
InvocationInfo  : System.Management.Automation.InvocationInfo 
ScriptStackTrace  : at , : line 1 
PipelineIterationInfo : {0, 0} 

今私はForeach error handling in Powershellを見て、私のコードが正しいと思われるので、なぜキャッチが機能していないのかわかりません。

答えて

3
try { 
    $savePreference = $ErrorActionPreference 
    $ErrorActionPreference = 'Stop' 
    quser /server:$computer 2>&1 
} 

catch [System.Management.Automation.RemoteException] { 
    Write-Host "$computer is free" 
} 

finally 
{ 
    $ErrorActionPreference = $savePreference 
} 
+0

おかげで、チームメイトを、このコードは御馳走を働きました。 –

2

私は通常これを行う:

$list = get-content "pathtofile.txt" 

foreach ($computer in $list) 
{ 
    try 
{ 
    quser /server:$computer 
} 
catch 
{ 
    if ($Error.Exception -eq "System.Management.Automation.RemoteException: No User exists for *") 
    { 
     Write-Host "$computer is free" 
    } 
    else 
    { 
     throw $error 
    } 
} 

}