在不启用-Verbose的情况下捕获详细流

时间:2019-06-27 20:24:08

标签: powershell verbose

也许在PowerShell中无法做到这一点。

如果我有文件verboseTest.ps1

[CmdletBinding()]    # CmdletBinding attribute enables -verbose flag
Param()
Write-Verbose 'verbose test'

如果我拨打.\verboseTest.ps1,则没有看到预期的结果。

如果我打电话给.\verboseTest.ps1 -Verbose,我会看到输出。

  

详细:外部详细测试

符合预期。

但是如果我打电话给.\verboseTest.ps1 4>&1,我不会。详细的信息流丢失了。

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

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

[CmdletBinding()]    # Add CmdletBinding attribute
Param()
Write-Information 'info test outer'

如果我拨打.\infoTest.ps1,则没有看到预期的结果。

如果我调用.\infoTest.ps1 -InformationAction 'Continue'(类似于-Verbose标志),它将成功并将info test outer输出到控制台。

如果我叫.\infoTest.ps1 6>&1,它还要info test outer输出到控制台!因此,“信息”流的行为与“详细”流的行为完全不同。

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

必须启用冗长的首选项以重定向输出吗?如果是这样,我可以在该方法内部执行此操作,还是可以在整个会话范围内全局更改它?

1 个答案:

答案 0 :(得分:4)

不幸的是,冗长的流(流号4)在没有显式打开的情况下不仅是 silent ,而且没有任何数据写入 em>。

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


PowerShell的默认默认输出流-详细(Continue),调试(4)和信息(5)-信息流是唯一的例外:6条语句总是写入,不管它是否被静音。


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

模块中实现的

高级功能在从中调用时仅看到Continue global 实例。剧本;相反,二进制 cmdlet 不受 的影响。 this GitHub issue中讨论了这种严重问题的行为。

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

$VerbosePreference

[1]但是,该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. 调用仍然可行具有副作用,例如在传递可扩展字符串作为包含带有副作用的子表达式(Write-Verbose)的消息时。