我正在調查使用Runspaces進行並行運行。目前,我試圖從我可能運行的任何腳本中取回消息,以幫助我診斷問題,使用它們來源的相同流類型:詳細消息流中的詳細消息等等。到目前爲止,我可以得到Warning和詳細消息,但每當我嘗試使用寫入錯誤(甚至只是訪問ErrorRecord對象屬性),控制檯都會鎖定。爲什麼我無法從PowerShell.Streams.Error.add_DataAdded寫入錯誤?
這裏有一個示例來展示我所看到的內容。如果您取消註釋在$ps1.Streams.Error.add_DataAdded({})
腳本塊它在這一點上鎖定了評論中的任意一個
VERBOSE: This is a verbose message.
WARNING: This is a warning message.
System.Management.Automation.ErrorRecord
This is an error message.
:目前,腳本生成四條消息。任何人都可以解釋爲什麼和/或給我一個解決方法/修復?
我這樣的事情後,我:
VERBOSE: This is a verbose message.
WARNING: This is a warning message.
C:\Work\me\PowerShell\Test-ReadPSDataStreams.ps1 : This is an error message.
At line:1 char:1
+ .\Test-ReadPSDataStreams.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Test-ReadPSDataStreams.ps1
這是腳本:
$VerbosePreference = 'Continue'
$is1 = [InitialSessionState]::CreateDefault()
$rs1 = [RunspaceFactory]::CreateRunspace($is1)
$rs1.ApartmentState = 'STA'
$rs1.ThreadOptions = 'ReuseThread'
$rs1.Open()
$ps1 = [PowerShell]::Create()
$ps1.Runspace = $rs1
$ps1.Streams.Verbose.add_DataAdded({
Param (
[Object]$sender,
[System.Management.Automation.DataAddedEventArgs]$e
)
foreach ($item in $sender.ReadAll()) {
Write-Verbose $item.Message
}
})
$ps1.Streams.Warning.add_DataAdded({
Param (
[Object]$sender,
[System.Management.Automation.DataAddedEventArgs]$e
)
foreach ($item in $sender.ReadAll()) {
Write-Warning $item.Message
}
})
$ps1.Streams.Error.add_DataAdded({
Param (
[Object]$sender,
[System.Management.Automation.DataAddedEventArgs]$e
)
foreach ($item in $sender.ReadAll()) {
Write-Host $item.GetType()
Write-Host $item.ToString()
#Write-Host $item.ErrorDetails.Message
#Write-Error 'test'
#Write-Error $item.ToString()
}
})
[void]$ps1.AddScript({ $VerbosePreference = 'Continue' })
[void]$ps1.AddScript({ Write-Verbose 'This is a verbose message.' })
[void]$ps1.AddScript({ Write-Warning 'This is a warning message.' })
[void]$ps1.AddScript({ Write-Error 'This is an error message.' })
$ps1.Invoke()
如果有這樣做的另一種方式,我接受它!
真的不明白你在做什麼,或者這個就足夠了,但是'寫主機$ item.Exception.Message'內您的問題塊似乎工作 – arco444 2014-12-02 16:37:53
我這樣做,因爲否則這些消息沒有提交給開發者(即我)來幫助我調試。你所提供的工作,但我試圖讓它進入錯誤流,例如使用寫入錯誤。我會在問題中澄清這一點。 – user2871239 2014-12-02 16:57:29