Powershell cmdlet如何通过管道将信息或错误写入事件日志 [英] powershell cmdlet how to pipe information or error to write-eventlog
问题描述
我试图根据从我的cmdlet发出的流,将事件日志输出到正确的条目类型(信息,警告,错误),如下所示:
i'm trying to output to eventlog to the correct Entry Type (Information,Warning,Error) based on the stream that is coming out of my cmdlet, something like this:
function myfunction {
Param(
[switch]$stream1,
[switch]$stream2
)
if ($stream1) {write-output 'stream 1 msg'}
if ($stream2) {write-error 'stream 2 msg'}
}
$eventlogparams = @{'logname'='application';'source'='myapp';'eventid'='1'}
myfunction -stream1 -stream2 `
1> write-eventlog @eventlogparams -entrytype information -message $_ `
2> write-eventlog @eventlogparams -entrytype error -message $_
有人知道如何做到这一点吗?
does anyone have an idea of how to accomplish this?
推荐答案
您可以 合并错误流和其他错误流到成功流并根据每个管道对象的数据类型 在源流之间进行区分:
You can merge the error stream and others into the success stream and distinguish between the origin streams by the data type of each pipeline object:
myfunction -channel1 -channel2 *>&1 | ForEach-Object {
$entryType = switch ($_.GetType().FullName) {
'System.Management.Automation.ErrorRecord' { 'error'; break }
'System.Management.Automation.WarningRecord' { 'warning'; break }
default { 'information'}
}
write-eventlog @eventlogparams -entrytype $entryType -message $_
}
重定向*>&1
将所有所有(*
)流的输出发送到(&
)成功流(1
),以便所有输出,而不管它是什么流来自,是通过管道发送的.
Redirection *>&1
sends the output from all (*
) streams to (&
) the success stream (1
), so that all output, irrespective of what stream it came from, is sent through the pipeline.
以上内容仅专门处理错误和警告,并将其他信息(包括成功输出)报告为信息,但是扩展方法很容易-请参见底部.
The above only deals with errors and warnings specifically, and reports everything else, including the success output, as information, but it's easy to extend the approach - see bottom.
请参阅 about_Redirections (自v6起)PowerShell中所有6个输出流的概述.
See about_Redirections for an overview of all 6 output streams available in PowerShell (as of v6).
通过一个更简单的示例来说明该技术:
To illustrate the technique with a simpler example:
& { Write-Output good; Write-Error bad; Write-Warning problematic } *>&1 | ForEach-Object {
$entryType = switch ($_.GetType().FullName) {
'System.Management.Automation.ErrorRecord' { 'error'; break }
'System.Management.Automation.WarningRecord' { 'warning'; break }
default { 'information'}
}
'[{0}] {1}' -f $entryType, $_
}
上面的结果:
[information] good
[error] bad
[warning] problematic
各种流输出的数据类型列表:
Stream Type
------ ----
#1 (Success) (whatever input type is provided).
#2 (Error) [System.Management.Automation.ErrorRecord]
#3 (Warning) [System.Management.Automation.WarningRecord]
#4 (Verbose) [System.Management.Automation.VerboseRecord]
#5 (Debug) [System.Management.Automation.DebugRecord]
#6 (Information) [System.Management.Automation.InformationRecord]
以下代码用于产生以上列表(第一个数据行除外):
The following code was used to produce the above list (except for the first data row):
& {
$VerbosePreference = $DebugPreference = $InformationPreference = 'Continue'
$ndx = 2
"Write-Error", "Write-Warning", "Write-Verbose", "Write-Debug", "Write-Information" | % {
& $_ ($_ -split '-')[-1] *>&1
++$ndx
} | Select-Object @{n='Stream'; e={"#$ndx ($_)"} }, @{n='Type'; e={"[$($_.GetType().FullName)]"} }
}
这篇关于Powershell cmdlet如何通过管道将信息或错误写入事件日志的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!