这是演示问题的代码。如果提供程序是 ,则cmdletSet-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:\
通常,开关参数在命令中的位置无关紧要。这不是动态切换的情况。案例 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