6

这是演示问题的代码。如果提供程序是 ,则cmdletSet-Location具有动态开关。ReadOnlyFileSystem

# provider that does not have the dynamic -ReadOnly
Set-Location env:

# case 1: works because we explicitly specify FileSystem
Get-ChildItem C:\ -ReadOnly

# case 2: fails even though we explicitly specify FileSystem
Get-ChildItem -ReadOnly C:\

通常,开关参数在命令中的位置无关紧要。这不是动态切换的情况。案例 2 失败并出现以下错误:

Get-ChildItem : A parameter cannot be found that matches parameter name 'ReadOnly'.

发生什么了?我认为在创建动态参数的那一刻,尚不知道这ReadOnly是开关。因此,PowerShell 将其视为带有参数的常规参数C:\C:\因此不被视为位置参数。结果,Get-ChildItem认为未指定位置并使用当前的env:. 提供者Environment不提供动态开关ReadOnly,因此最终命令由于语法不正确而失败,即使它有些正确(如果当前提供者是,则相同的命令有效FileSystem)。

问题:

  • 我对问题的理解正确吗?
  • 此功能是否记录在某处?
  • 有什么解决方法吗?

最后一个问题更多的是关于使用动态参数开发的用户命令。该问题最初被注意到并描述为Invoke-Build Issue #4。目前这个问题只是记录在案。但我仍然对解决方法感兴趣。


结论

  • 存在所描述的问题。
  • 它没有这样记录。
  • 解决方法,每种都解决了问题:
    • 在位置参数参数之后指定动态开关
    • 明确指定动态开关参数:-ReadOnly:$true
    • 不要将位置参数与动态开关一起使用,即指定参数名称。

打开错误:960194

4

1 回答 1

4

你的理解完全正确。

参数绑定器没有很好地记录,因为它非常复杂。语言规范(http://www.microsoft.com/en-us/download/details.aspx?id=36389)可能是我们拥有的最好的文档,但它不完整,我不认为涵盖这种情况.

我能想到的唯一解决方法是指定 switch 参数的参数,例如

Get-ChildItem -ReadOnly:$true C:\

随意打开一个错误。它可能不会得到修复,但它至少让团队有机会讨论它。

我想修复将类似于“如果参数绑定失败并且存在动态参数,请返回并假设未知参数是开关参数并重试”。这可以一次完成一个未知参数,或者一次完成,无论哪种方式,如果有许多未知参数,参数绑定可能会非常慢。

于 2014-08-30T16:57:55.090 回答