您在ForEach-Object -Parallel
/中看到了一个错误Start-ThreadJob
,至少存在 PowerShell Core 7.0:
您的Write-Information
输出应该会显示,因为您曾经-InformationAction Continue
打开过它;虽然您的Write-Verbose
输出未显示是意料之中的,因为您没有使用 将其打开,但由于该错误,-Verbose
如果您确实使用了它也不会显示。-Verbose
请参阅GitHub 问题 #13816。
解决方法是在调用之前还设置首选项变量 $InformationPreference
以打开信息流ForEach-Object -Parallel
(见下文)。
另外,您的代码存在概念问题:
您将-Verbose
公共参数传递给您的write-Test
函数,但此函数未声明为高级函数(它需要块[CmdletBinding()]
上方的属性param(...)
和/或至少一个具有[Parameter(...)]
属性的参数 - 请参阅about_Functions_Advanced),因此该参数将具有没有效果。
即使它确实生效了,这意味着 PowerShell 将其转换为$VerbosePreference
具有 value 的函数局部变量'Continue'
,该ForEach-Object -Parallel
块也不会看到该变量,因为$using:
需要范围来引用调用者范围中的变量值;看到这个答案。
把它们放在一起。
function Write-Test {
# Mark the function as an advanced one, so that it accepts
# common parameters such as -Verbose
[CmdletBinding()]
param()
# WORKAROUND: Turn the information stream on
# via its *preference variable* AS WELL:
$InformationPreference = 'Continue'
1..1 | ForEach-Object -Parallel {
Write-Host "host"
Write-Output "Output"
Write-Information "information" -InformationAction Continue
Write-Verbose "verbose" -Verbose:($using:VerbosePreference -eq 'Continue')
Write-Warning "Warning"
Write-Error "error"
}
}
Write-Test -Verbose
注意传递给开关的表达式,必须用-与开关名称-Verbose
分开来自外部的函数(由于 PowerShell 的动态作用域,如果设置为调用者的范围内也会发生这种情况;请参阅此答案)。:
-Verbose:($using:VerbosePreference -eq 'Continue')
$VerbosePreference
$using:
'Continue'
-Verbose
$VerbosePreference
'Continue'
有关 PowerShell 输出流的一般信息:
请参阅about_Redirection、about_CommonParameters和about_Preference_Variables