【发布时间】:2016-02-09 13:50:31
【问题描述】:
当省略必需参数时,交互式 PowerShell 会话会提示用户。 Shay Levy offers a workaround 这个问题。问题是当您使用管道绑定参数时,解决方法不起作用。
考虑这个例子:
function f {
[CmdletBinding()]
param
(
[Parameter(ValueFromPipeLineByPropertyName=$true)]
[ValidateNotNullOrEmpty()]
[string]$a=$(throw "a is mandatory, please provide a value.")
)
process{}
}
$o = New-Object psobject -Property @{a=1}
$o | f
尽管$o.a 是绑定到f -a 的完美值,但这会引发异常。出于某种原因,即使 $a 的值注定要从管道绑定,PowerShell 也会评估参数 $a 的默认值。
在交互式运行时缺少强制参数时,是否有其他方法可以强制 PowerShell 抛出异常?
为什么这很重要?它浪费了程序员的时间。方法如下:
堆栈跟踪深度为 20 次调用是很正常的。当调用堆栈深处的调用因为没有接收到强制参数而阻塞时,调试变得非常低效。没有堆栈跟踪,没有错误消息,也没有上下文。您所看到的只是参数值的提示。祝你好运,准确地猜出发生这种情况的原因。您始终可以通过调试方式找到解决方案,只是需要的时间比应有的要多得多,因为您无法从抛出的异常中获得通常会得到的信息。
假设您正在运行一系列配置测试用例,而 1000 个中的一个 存在此问题。平均而言,这些测试用例中有 500 个没有运行。因此,在此测试运行中,您只能从一半的案例中获得测试结果。如果这些测试运行在一夜之间运行,您可能需要再等 24 小时才能获得结果。所以现在你的迭代速度变慢了。
【问题讨论】:
-
感谢您发布您的解释。我确实想指出,如果您使用
[Parameter(HelpMessage="I am function-whatever, I need this parameter")],该消息将与提示一起显示(默认情况下它不会显示在帮助中,因此实际上这就是它的全部好处)。 -
????提示:
$o = [pscustomobject]@{a=1}和$o = New-Object psobject -Property @{a=1}做同样的事情
标签: powershell parameters pipeline interactive