3

私は PS 3.0 RC で PowerShell ワークフローをいじっており、今のところ気に入っています。ただし、ワークフロー内で使用できるものと使用できないものには多くの制限があります。私が現在ハングアップしているのは $Error 変数です。ワークフローを呼び出すと、次のエラーが表示されます。

The variable 'Error' cannot be used in a script workflow.

ワークフロー内のエラーのテキストをキャッチする方法、またはワークフローに慣れていない場合にエラーをキャッチする代替方法に関する提案を知っている人はいますか? いろいろと調べてみましたが、ワークフローの詳細に関する情報はほとんど見つかりません。ありがとう!

私はこのようなことをしようとしています:

workflow Get-LoggedOnUser{
    param([array]$computers,[System.Management.Automation.PSCredential]$credential)

    foreach -parallel($computer in $computers) {
        $response = $null
        $errorMessage = $null
        If (Test-Connection -ComputerName $computer -count 1 -quiet) {
            Try {
                $ErrorActionPreference = "Stop"
                $response = Get-WMIObject -PSCredential $credential -PSComputername $computer -query "Select UserName from Win32_ComputerSystem"
                $Error
            }
            Catch {
                $errorMessage = $Error[0].exception
            }
            Finally {
                $errorActionPreference = "Continue"
            }
        }
        Else {
            $errorMessage = "No response"
        }   
        $output = [PSCustomObject]@{
            Name = $computer
            User = $response.UserName
            Error = $errorMessage
        }
        $output
    }
}
4

3 に答える 3

5

ワークフローのロジックのほとんどをInlineScriptブロックで囲むことで、これを解決することになりました。このように、ワークフローの各ループは引き続き並行して実行されますが(私が望んでいたことです)、ワークフロー内で通常のPowerShellコマンドレット、パラメーター、および変数($ Errorを含む)を自由に使用できます。

workflow Get-LoggedOn {
param(
    [array]$computers,
    [System.Management.Automation.PSCredential]$Credential
    )
    ForEach -parallel ($computer in $computers) {
    InlineScript {
        Try {
            $ErrorActionPreference = "Stop"
            $response = Get-WMIObject -computername $using:computer -credential $using:Credential -query "select UserName from Win32_ComputerSystem"
        }
        Catch {
            $errorMessage = $Error[0].Exception
        }
        Finally {
            $ErrorActionPreference = "Continue"
        }
        $output = [PSCustomObject]@{
            Name = $using:computer
            User = $response.UserName
            Error = $errorMessage
        }
        $output
    }
}

}

于 2012-07-20T16:06:10.913 に答える
1

Powershell ワークフロー内では、$error 変数を使用できません。少なくとも私の経験では、次の方法を使用する必要があります。

Try {
     Throw "This is an error exception."
}
Catch {
     $errorMessage = $_
}

$errorMessage
于 2014-06-27T13:16:13.710 に答える
1

V2 のように試すことができます (V3 ではテストされていませんが、動作すると思います)。

Catch {
                $errorMessage = $_            }
}

キャッチリターン内Get-Memberの:$_

   TypeName: System.Management.Automation.ErrorRecord

Name                  MemberType     Definition
----                  ----------     ----------
Equals                Method         bool Equals(System.Object obj)
GetHashCode           Method         int GetHashCode()
GetObjectData         Method         System.Void GetObjectData(System.Runtime.Serialization.SerializationInfo info, 
                                     System.Runtime.Serialization.StreamingContext context)
GetType               Method         type GetType()                                        
ToString              Method         string ToString()                                     
CategoryInfo          Property       System.Management.Automation.ErrorCategoryInfo CategoryInfo {get;}
ErrorDetails          Property       System.Management.Automation.ErrorDetails ErrorDetails {get;set;} 
Exception             Property       System.Exception Exception {get;}                                 
FullyQualifiedErrorId Property       System.String FullyQualifiedErrorId {get;}                        
InvocationInfo        Property       System.Management.Automation.InvocationInfo InvocationInfo {get;} 
PipelineIterationInfo Property       System.Collections.ObjectModel.ReadOnlyCollection`1[[System.Int32, mscorlib, 
                                     Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 
                                     PipelineIterationInfo {get;}
TargetObject          Property       System.Object TargetObject {get;}                             
PSMessageDetails      ScriptProperty System.Object PSMessageDetails {get=& { Set-StrictMode -Version 1; 
                                     $this.Exception.InnerException.PSMessageDetails };}
于 2012-07-20T07:02:33.197 に答える