位置参数之前的动态切换可能无法按预期工作

时间:2014-08-29 00:39:46

标签: powershell invoke-build

以下是演示此问题的代码。 cmdlet Set-Location具有 如果提供者为ReadOnly,则动态切换FileSystem

# 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:\

命令中的switch参数的正常位置无关紧要。这不是 动态切换的情况。案例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

1 个答案:

答案 0 :(得分:4)

您的理解是完全正确的。

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

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

Get-ChildItem -ReadOnly:$true C:\

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

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

相关问题