也许在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命令将写入流,并且我可以根据需要重定向或查看它。 “冗长的”不是!我必须启用在输出中显示它才能重定向它?难道我做错了什么?这有什么意义?
我必须启用冗长的首选项以重定向输出吗?如果是这样,我可以在该方法内部执行此操作,还是可以在整个会话范围内全局更改它?
答案 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
)的消息时。