The Write-*
cmdlet 允许您以结构化方式引导 PowerShell 代码的输出,因此您可以轻松地区分不同严重性的消息。
-
Write-Host
:在控制台上向交互式用户显示消息。与其他不同Write-*
这个 cmdlet 既不适合也不适合用于自动化/重定向目的。不是邪恶,只是不同。
-
Write-Output
:将代码的“正常”输出写入默认(成功)输出流(“STDOUT”)。
-
Write-Error
:将错误信息写入单独的流(“STDERR”)。
-
Write-Warning
:将您认为是警告的消息(即不是失败的事情,而是用户应该关注的事情)写入单独的流。
-
Write-Verbose
:将您认为比“正常”输出更详细的信息写入单独的流。
-
Write-Debug
:将您认为与调试代码相关的信息写入单独的流。
Write-Information
只是这种方法的延续。它允许您在输出中实现日志级别(Debug
, Verbose
, Information
, Warning
, Error
)并且仍然有可用于常规输出的成功输出流。
至于为什么Write-Host
成为了周围的包装Write-Information
:我不知道这个决定的真正原因,但我怀疑这是因为大多数人不明白如何Write-Host
实际上有效,即它可以用于什么以及不应该用于什么。
据我所知,目前还没有普遍接受或推荐的 PowerShell 登录方法。例如,您可以实现单个日志记录功能,例如@杰里米蒙哥马利 https://stackoverflow.com/a/38537613/1630171他在回答中建议:
function Write-Log {
Param(
[Parameter(Mandatory=$true, Position=0)]
[ValidateNotNullOrEmpty()]
[string]$Message,
[Parameter(Mandatory=$false, Position=1)]
[ValidateSet('Error', 'Warning', 'Information', 'Verbose', 'Debug')]
[string]$LogLevel = 'Information'
)
switch ($LogLevel) {
'Error' { ... }
'Warning' { ... }
'Information' { ... }
'Verbose' { ... }
'Debug' { ... }
default { throw "Invalid log level: $_" }
}
}
Write-Log 'foo' # default log level: Information
Write-Log 'foo' 'Information' # explicit log level: Information
Write-Log 'bar' 'Debug'
或一组日志记录功能(每个日志级别一个):
function Write-LogInformation {
Param(
[Parameter(Mandatory=$true, Position=0)]
[ValidateNotNullOrEmpty()]
[string]$Message
)
...
}
function Write-LogDebug {
Param(
[Parameter(Mandatory=$true, Position=0)]
[ValidateNotNullOrEmpty()]
[string]$Message
)
...
}
...
Write-LogInformation 'foo'
Write-LogDebug 'bar'
另一种选择是创建自定义记录器对象:
$logger = New-Object -Type PSObject -Property @{
Filename = ''
Console = $true
}
$logger | Add-Member -Type ScriptMethod -Name Log -Value {
Param(
[Parameter(Mandatory=$true, Position=0)]
[ValidateNotNullOrEmpty()]
[string]$Message,
[Parameter(Mandatory=$false, Position=1)]
[ValidateSet('Error', 'Warning', 'Information', 'Verbose', 'Debug')]
[string]$LogLevel = 'Information'
)
switch ($LogLevel) {
'Error' { ... }
'Warning' { ... }
'Information' { ... }
'Verbose' { ... }
'Debug' { ... }
default { throw "Invalid log level: $_" }
}
}
$logger | Add-Member -Type ScriptMethod -Name LogDebug -Value {
Param([Parameter(Mandatory=$true)][string]$Message)
$this.Log($Message, 'Debug')
}
$logger | Add-Member -Type ScriptMethod -Name LogInfo -Value {
Param([Parameter(Mandatory=$true)][string]$Message)
$this.Log($Message, 'Information')
}
...
Write-Log 'foo' # default log level: Information
$logger.Log('foo') # default log level: Information
$logger.Log('foo', 'Information') # explicit log level: Information
$logger.LogInfo('foo') # (convenience) wrapper method
$logger.LogDebug('bar')
无论哪种方式,您都可以通过以下方式外部化日志记录代码
-
将其放入单独的脚本文件中并点源 https://technet.microsoft.com/en-us/library/hh847841.aspx该文件:
. 'C:\path\to\logger.ps1'
-
把它放入一个module https://msdn.microsoft.com/en-us/library/dd878340%28v=vs.85%29.aspx并导入该模块:
Import-Module Logger