写入信息不显示在由 Start-Transcript 转录的文件中
Write-Information does not show in a file transcribed by Start-Transcript
我正在使用 PowerShell 5.1,我正在尝试确定为什么 Write-Information
消息不会显示在由 Start-Transcript
创建的转录日志中,除非我将 $InformationPreference
设置为 [=14] =].我想在控制台中显示消息 并且 将它们写入日志文件。
然后我决定创建这个脚本来测试什么时候写的。请参阅 Testing explicit behavior with transcripts -------------
正下方的首选项部分
Clear-Host
$ErrorActionPreference = "Stop"
try {
Write-Host "Starting transcript"
Start-Transcript -Force -Path "$PSScriptRoot\default.txt"
<#
In PowerShell 5.1 the default behavior is as follows:
$DebugPreference = SilentlyContinue
$InformationPreference = SilentlyContinue
$ProgressPreference = Continue
$VerbosePreference = SilentlyContinue
See the following for more information:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-5.1
#>
# I am not testing Write-Output as I am not worried about programmatic/pipeline stuff, just contextual messages for end-users or logging
Write-Host "`nTesting default behavior with transcripts --------------------------------`n"
# Setting these just in case I launch this script in a session where a previous script might have modified the preference variables
$DebugPreference = "SilentlyContinue"
$InformationPreference = "SilentlyContinue"
$ProgressPreference = "Continue"
$VerbosePreference = "SilentlyContinue"
Write-Host "Calling Write-Host"
Write-Debug "Calling Write-Debug"
Write-Error "Calling Write-Error" -ErrorAction "Continue"
Write-Information "Calling Write-Information"
Write-Progress "Calling Write-Progress"
Write-Verbose "Calling Write-Verbose"
Stop-Transcript
Start-Transcript -Force -Path "$PSScriptRoot\everything_continue.txt"
Write-Host "`nTesting explicit behavior with transcripts --------------------------------`n"
# Turn everything on
$DebugPreference = "Continue"
$InformationPreference = "Continue" # Setting this to SilentlyContinue makes it show up in the log but not the console. Setting this to 'Continue' makes it show up in the console but not the log.
$ProgressPreference = "Continue"
$VerbosePreference = "Continue"
Write-Host "Calling Write-Host"
Write-Debug "Calling Write-Debug"
Write-Error "Calling Write-Error" -ErrorAction "Continue"
Write-Information "Calling Write-Information"
Write-Progress "Calling Write-Progress"
Write-Verbose "Calling Write-Verbose"
Stop-Transcript
Write-Host "`nResults -------------------------------------------------------------------`n"
# See what actually gets captured and written by the transcriber
$messageTypes = @("Write-Debug", "Write-Error", "Write-Host", "Write-Information", "Write-Verbose")
Write-Host "Default" -ForegroundColor Cyan
$lines = Get-Content "$PSScriptRoot\default.txt"
foreach ($message in $messageTypes) {
if ($lines -like "*Calling $message*") {
Write-Host " $message PRESENT" -ForegroundColor Green
}
else {
Write-Host " $message MISSING" -ForegroundColor Red
}
}
Write-Host "Everything Continue" -ForegroundColor Cyan
$lines = Get-Content "$PSScriptRoot\everything_continue.txt"
foreach ($message in $messageTypes) {
if ($lines -like "*Calling $message*") {
Write-Host " $message PRESENT" -ForegroundColor Green
}
else {
Write-Host " $message MISSING" -ForegroundColor Red
}
}
}
catch {
Write-Host "----------------------------------------------------------------------------------------------------"
Write-Host $_.Exception
Write-Host $_.ScriptStackTrace
Write-Host "----------------------------------------------------------------------------------------------------"
try { Stop-Transcript } catch { }
throw $_
}
您看到的是 Windows PowerShell 中的 bug (从 v5.1.17134.590 开始)已在 PowerShell Core 中 修复(至少从 v6.1.0 开始 - 虽然 other 与成绩单相关的问题仍然存在;请参阅 this GitHub issue)。
我鼓励您在 Windows PowerShell 中报告它 UserVoice forum (note that the PowerShell GitHub-repo issues forum 仅适用于 PowerShell Core) 中也存在的错误。
以下是如何验证错误是否存在于您的 PowerShell 版本:
使用以下代码创建一个脚本,运行它:
'--- Direct output'
$null = Start-Transcript ($tempFile = [io.path]::GetTempFileName())
# Note that 'SilentlyContinue' is also the default value.
$InformationPreference = 'SilentlyContinue'
# Produces no output.
Write-Information '1-information'
# Prints '2-Information' to the console.
Write-Information '2-information' -InformationAction Continue
$null = Stop-Transcript
'--- Write-Information output transcribed:'
Select-String '-information' $tempFile | Select-Object -ExpandProperty Line
Remove-Item $tempFile
随着错误 存在 (Windows PowerShell),您将看到:
--- Direct output
2-information
--- Write-Information output transcribed:
INFO: 1-information
也就是说,发生了预期行为的相反:记录记录了它不应该有的调用(因为它产生了没有输出),也没有记录它应该有的记录。
此外,记录的输出带有前缀 INFO:
,这是一个不一致的问题,已在 PowerShell Core 中修复。
没有完整的解决方法,除了您可以在 的情况下使用 Write-Host
调用do 您希望在记录中记录输出 - 但此类调用 将被记录 无条件地 ,而不管首选项变量的值如何$InformationPreference
(虽然Write-Host
正式提供了一个-InformationAction
公共参数,被忽略)。
修复了错误 (PowerShell Core),您将看到:
--- Direct output
2-information
--- Write-Information output transcribed:
2-information
成绩单现在与直接输出一致。
我正在使用 PowerShell 5.1,我正在尝试确定为什么 Write-Information
消息不会显示在由 Start-Transcript
创建的转录日志中,除非我将 $InformationPreference
设置为 [=14] =].我想在控制台中显示消息 并且 将它们写入日志文件。
然后我决定创建这个脚本来测试什么时候写的。请参阅 Testing explicit behavior with transcripts -------------
Clear-Host
$ErrorActionPreference = "Stop"
try {
Write-Host "Starting transcript"
Start-Transcript -Force -Path "$PSScriptRoot\default.txt"
<#
In PowerShell 5.1 the default behavior is as follows:
$DebugPreference = SilentlyContinue
$InformationPreference = SilentlyContinue
$ProgressPreference = Continue
$VerbosePreference = SilentlyContinue
See the following for more information:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-5.1
#>
# I am not testing Write-Output as I am not worried about programmatic/pipeline stuff, just contextual messages for end-users or logging
Write-Host "`nTesting default behavior with transcripts --------------------------------`n"
# Setting these just in case I launch this script in a session where a previous script might have modified the preference variables
$DebugPreference = "SilentlyContinue"
$InformationPreference = "SilentlyContinue"
$ProgressPreference = "Continue"
$VerbosePreference = "SilentlyContinue"
Write-Host "Calling Write-Host"
Write-Debug "Calling Write-Debug"
Write-Error "Calling Write-Error" -ErrorAction "Continue"
Write-Information "Calling Write-Information"
Write-Progress "Calling Write-Progress"
Write-Verbose "Calling Write-Verbose"
Stop-Transcript
Start-Transcript -Force -Path "$PSScriptRoot\everything_continue.txt"
Write-Host "`nTesting explicit behavior with transcripts --------------------------------`n"
# Turn everything on
$DebugPreference = "Continue"
$InformationPreference = "Continue" # Setting this to SilentlyContinue makes it show up in the log but not the console. Setting this to 'Continue' makes it show up in the console but not the log.
$ProgressPreference = "Continue"
$VerbosePreference = "Continue"
Write-Host "Calling Write-Host"
Write-Debug "Calling Write-Debug"
Write-Error "Calling Write-Error" -ErrorAction "Continue"
Write-Information "Calling Write-Information"
Write-Progress "Calling Write-Progress"
Write-Verbose "Calling Write-Verbose"
Stop-Transcript
Write-Host "`nResults -------------------------------------------------------------------`n"
# See what actually gets captured and written by the transcriber
$messageTypes = @("Write-Debug", "Write-Error", "Write-Host", "Write-Information", "Write-Verbose")
Write-Host "Default" -ForegroundColor Cyan
$lines = Get-Content "$PSScriptRoot\default.txt"
foreach ($message in $messageTypes) {
if ($lines -like "*Calling $message*") {
Write-Host " $message PRESENT" -ForegroundColor Green
}
else {
Write-Host " $message MISSING" -ForegroundColor Red
}
}
Write-Host "Everything Continue" -ForegroundColor Cyan
$lines = Get-Content "$PSScriptRoot\everything_continue.txt"
foreach ($message in $messageTypes) {
if ($lines -like "*Calling $message*") {
Write-Host " $message PRESENT" -ForegroundColor Green
}
else {
Write-Host " $message MISSING" -ForegroundColor Red
}
}
}
catch {
Write-Host "----------------------------------------------------------------------------------------------------"
Write-Host $_.Exception
Write-Host $_.ScriptStackTrace
Write-Host "----------------------------------------------------------------------------------------------------"
try { Stop-Transcript } catch { }
throw $_
}
您看到的是 Windows PowerShell 中的 bug (从 v5.1.17134.590 开始)已在 PowerShell Core 中 修复(至少从 v6.1.0 开始 - 虽然 other 与成绩单相关的问题仍然存在;请参阅 this GitHub issue)。
我鼓励您在 Windows PowerShell 中报告它 UserVoice forum (note that the PowerShell GitHub-repo issues forum 仅适用于 PowerShell Core) 中也存在的错误。
以下是如何验证错误是否存在于您的 PowerShell 版本:
使用以下代码创建一个脚本,运行它:
'--- Direct output'
$null = Start-Transcript ($tempFile = [io.path]::GetTempFileName())
# Note that 'SilentlyContinue' is also the default value.
$InformationPreference = 'SilentlyContinue'
# Produces no output.
Write-Information '1-information'
# Prints '2-Information' to the console.
Write-Information '2-information' -InformationAction Continue
$null = Stop-Transcript
'--- Write-Information output transcribed:'
Select-String '-information' $tempFile | Select-Object -ExpandProperty Line
Remove-Item $tempFile
随着错误 存在 (Windows PowerShell),您将看到:
--- Direct output
2-information
--- Write-Information output transcribed:
INFO: 1-information
也就是说,发生了预期行为的相反:记录记录了它不应该有的调用(因为它产生了没有输出),也没有记录它应该有的记录。
此外,记录的输出带有前缀 INFO:
,这是一个不一致的问题,已在 PowerShell Core 中修复。
没有完整的解决方法,除了您可以在 的情况下使用 Write-Host
调用do 您希望在记录中记录输出 - 但此类调用 将被记录 无条件地 ,而不管首选项变量的值如何$InformationPreference
(虽然Write-Host
正式提供了一个-InformationAction
公共参数,被忽略)。
修复了错误 (PowerShell Core),您将看到:
--- Direct output
2-information
--- Write-Information output transcribed:
2-information
成绩单现在与直接输出一致。