这是来自System.Management.Automation.MshCommandRuntime
的方法。
internal void WriteVerbose(VerboseRecord record)
{
if ((this.Host == null) || (this.Host.UI == null))
{
tracer.TraceError("No host in CommandBase.WriteVerbose()", new object[0]);
throw tracer.NewInvalidOperationException();
}
ActionPreference verbosePreference = this.VerbosePreference;
if (this.WriteHelper_ShouldWrite(verbosePreference, this.lastVerboseContinueStatus))
{
if (record.InvocationInfo == null)
{
record.SetInvocationInfo(this.MyInvocation);
}
this.CBhost.InternalUI.WriteVerboseRecord(record);
}
this.lastVerboseContinueStatus = this.WriteHelper(null, null, verbosePreference, this.lastVerboseContinueStatus, "VerbosePreference");
}
MshCommandRuntime
实现了接口 ICommandRuntime
,这个接口并不知道什么是详细程度 :| (通过反射发现)。MshCommandRuntime
的实例应该在 Cmdlet
中可用 (public ICommandRuntime CommandRuntime { get; set; }
)。
因此,将属性 CommandRuntime
强制转换为 MshCommandRuntime
并检查详细程度应该是可行的。不管怎样,这真的很丑陋。
我完全同意应该有一种简单的方法来找出它。而且除此之外(做梦),编译器应该足够聪明,在这种情况下不评估某些字符串:
$DebugPreference = 'SilentlyContinue'
$array = 1..1000
Write-Debug "my array is $array"
Write-Debug
的输入将永远不会被使用,因此不应该在传递的字符串中评估$array
。(可以测试它是否真的像这样评估:Write-Debug "my array is $($array|%{write-host $_; $_})"
)