以下是演示此问题的代码。 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
答案 0 :(得分:4)
您的理解是完全正确的。
参数活页夹没有很好地记录,因为它非常复杂。语言规范(http://www.microsoft.com/en-us/download/details.aspx?id=36389)可能是我们所拥有的最好的文档,但它不完整,我不认为涵盖了这种情况。
我能想到的唯一解决方法是指定switch参数的参数,例如
Get-ChildItem -ReadOnly:$true C:\
随意打开一个错误。它可能不会得到修复,但它至少让团队有机会讨论它。
我认为修复将类似于“如果参数绑定失败并且存在动态参数,请返回并假设未知参数是切换参数并再次尝试”。这可以一次完成一个未知参数,或者一次完成,无论哪种方式,如果有许多未知参数,参数绑定可能会非常慢。