我一直在使用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
}
}
答案 0 :(得分:3)
我最终通过将我的工作流程的大部分逻辑包含在InlineScript块中来解决这个问题。这样,工作流的每个循环仍然并行运行(我想要),但我可以在工作流中自由使用普通的PowerShell cmdlet,参数和变量(包括$ 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
}
}
}
答案 1 :(得分:1)
您可以尝试像在V2中那样(未在V3中测试,但我认为它有效)
Catch {
$errorMessage = $_ }
}
catch中返回Get-Member
的{{1}}:
$_
答案 2 :(得分:1)
在Powershell工作流程中,您无法使用$ error变量。你必须使用以下方法,至少根据我的经验:
Try {
Throw "This is an error exception."
}
Catch {
$errorMessage = $_
}
$errorMessage