Powershell 捕获详细流而不启用-verbose

Powershell 捕获详细流而不启用-verbose,powershell,verbose,Powershell,Verbose,也许在PowerShell中没有办法做到这一点 如果我有文件verboseTest.ps1 [CmdletBinding()]#CmdletBinding属性启用-详细标志 Param() 编写详细的“详细测试” 如果我调用\verboseTest.ps1,我看不到预期的结果 如果我调用\verboseTest.ps1-Verbose,我会看到输出 详细的:详细的测试 正如所料 但是如果我调用\verboseTest.ps1 4>&1我不会。详细流丢失 现在,信息的行为完全不同了 我有文件in

也许在PowerShell中没有办法做到这一点

如果我有文件
verboseTest.ps1

[CmdletBinding()]#CmdletBinding属性启用-详细标志
Param()
编写详细的“详细测试”
如果我调用
\verboseTest.ps1
,我看不到预期的结果

如果我调用
\verboseTest.ps1-Verbose
,我会看到输出

详细的:详细的测试

正如所料

但是如果我调用
\verboseTest.ps1 4>&1
我不会。详细流丢失

现在,信息的行为完全不同了

我有文件
infoTest.ps1
,它运行正常

[CmdletBinding()]#添加CmdletBinding属性
Param()
写入信息“信息测试外部”
如果我调用
\infoTest.ps1
,我看不到预期的结果

如果我调用
\infoTest.ps1-InformationAction“Continue”
,这类似于
-Verbose
标志,它将成功并将
信息测试输出到控制台

如果我调用
\infoTest.ps1 6>&1
,它也会将
信息测试外部
输出到控制台!因此,不知何故,“信息”流的行为与“详细”流完全不同

信息流的行为是有意义的。write information命令写入流,我可以根据自己的需要重定向或查看它。“冗长”并没有!我必须在输出中显示它才能重定向它?我做错什么了吗?这有什么意义


我是否必须启用详细首选项才能重定向输出?如果是这样,我可以在方法内部这样做,还是在整个会话范围内对其进行全局更改?

不幸的是,详细流(流编号
4
)不仅在未显式打开时是静默的,而且没有向其写入数据。

也就是说,
Write Verbose
语句是无效的no-ops[1],除非传递了
-Verbose
,或者首选项变量
$VerbosePreference
设置为
Continue


在PowerShell默认无提示的输出流(详细(
4
)、调试(
5
)和信息(
6
中,信息流是唯一的例外:
Write information
语句始终向其写入信息,无论它是否碰巧被无提示。


将首选项变量
$VerbosePreference
设置为
Continue
将打开当前作用域和任何子作用域中所有命令的详细输出
-但有一个重要异常

当从脚本调用时,模块中实现的高级函数只能看到
$VerbosePreference
的全局实例;相比之下,二进制cmdlet不受影响。 中讨论了这种问题严重的行为

您可以解决该问题,如下所示:

# Create a script-local copy of the global parameter-defaults
# hashtable.
# Note: If you want to clear the global presets, call .Clear()
#       after cloning.
$PSDefaultParameterValues = $PSDefaultParameterValues.Clone()

# Preset the -Verbose switch for all commands that support it.
$PSDefaultParameterValues['*:Verbose'] = $true

# ... call commands, which will behave as if -Verbose had been passed.


[1] 但是,cmdlet仍会被调用,这意味着您传递给它的参数会被计算,因此假设静默的
Write Verbose
调用仍有可能产生副作用,例如将可扩展字符串作为包含子表达式的消息传递(
$(…)
)有副作用。

不幸的是,详细流(流编号
4
)在未显式打开时不仅是无声的,而且没有数据写入。

也就是说,
Write Verbose
语句是无效的no-ops[1],除非传递了
-Verbose
,或者首选项变量
$VerbosePreference
设置为
Continue


在PowerShell默认无提示的输出流(详细(
4
)、调试(
5
)和信息(
6
中,信息流是唯一的例外:
Write information
语句始终向其写入信息,无论它是否碰巧被无提示。


将首选项变量
$VerbosePreference
设置为
Continue
将打开当前作用域和任何子作用域中所有命令的详细输出
-但有一个重要异常

当从脚本调用时,模块中实现的高级函数只能看到
$VerbosePreference
的全局实例;相比之下,二进制cmdlet不受影响。 中讨论了这种问题严重的行为

您可以解决该问题,如下所示:

# Create a script-local copy of the global parameter-defaults
# hashtable.
# Note: If you want to clear the global presets, call .Clear()
#       after cloning.
$PSDefaultParameterValues = $PSDefaultParameterValues.Clone()

# Preset the -Verbose switch for all commands that support it.
$PSDefaultParameterValues['*:Verbose'] = $true

# ... call commands, which will behave as if -Verbose had been passed.

[1] 但是,cmdlet仍会被调用,这意味着您传递给它的参数会被计算,因此假设静默的
Write Verbose
调用仍有可能产生副作用,例如,将可扩展字符串作为包含有副作用的子表达式(
$(…)
)的消息传递时