我无法弄清楚以下是否可行。看起来不是,但我想我会问社区。 p>
我们说我对脚本参数进行了简单的处理,如下所示:
[CmdletBinding()]
Param(
[parameter(Position=0)]
[string] version,
[parameter(Position=1)]
[ValidateScript( { SomeModule/Search(version, $_); $true # FIND THIS VERSION IN SOURCE. **VERSION MUST HAVE BEEN SET BY NOW** } )]
[string] source,
)
现在我们可以说' 版本'表示组件的版本和' 源'表示搜索该组件的一些源(位置)(可能是多个源)。我最早可以调用搜索(源代码,版本)的是 ValidateScript {} ,这很好。在搜索(...)中发生某些错误的情况下,它不会继续处理其他参数。它还消除了代码中稍后的一堆 if(...){} 语句,否则将需要检查参数是否已通过,然后对其执行某些操作。但是,提供的值的顺序很重要:
这很好。值按正确的顺序提供
MyScript.ps1 -version 12345ABC -source 'filesystem'
这很好。值按正确的顺序提供。定位绑定有效。
MyScript.ps1 12345ABC 'filesystem'
这是行不通的。值的提供是错误的(从脚本'逻辑的角度来看)命令
MyScript.ps1 -source 'filesystem' -version 12345ABC
我不想在使用参数名称时对需要特定订单的客户进行限制。
作为一种解决方法,我可以重新安排$ ARGS,但我不能在[CmdletBinding]之前拥有任何代码。我可以使用一个新脚本来改变$ ARGS中的顺序,然后调用MyScript.ps1。虽然这不是一个很好的解决方案。我正在使用PS 4.0。
答案 0 :(得分:0)
命名参数可以是任何顺序,因为它们不受Position
的约束。
在您的脚本中,这两个 可互换,因为它们是命名参数。
MyScript.ps1 -version 12345ABC -source 'filesystem'
MyScript.ps1 -source 'filesystem' -version 12345ABC
位置参数未明确命名,并且需要按照参数中Position
定义的正确顺序。
MyScript.ps1 12345ABC 'filesystem'
答案 1 :(得分:0)
我怀疑问题在于您尝试在另一个验证脚本中使用一个参数,并且PowerShell似乎在调用解析而不是实际执行时执行验证。如果将$ source的验证移动到函数体中,则可能不会有任何进一步的问题。我还没有尝试过这个,但是当我有机会的时候,我会在当时发表评论。
答案 2 :(得分:0)
如果我没记错的话,你可以完全省略Position声明,如果你没有在命令行中指定参数名(-name),powershell会按顺序处理它们。
[CmdletBinding()]
Param(
[string] version,
[ValidateScript( { SomeModule/Search(version, $_); $true # FIND THIS VERSION IN SOURCE. **VERSION MUST HAVE BEEN SET BY NOW** } )]
[string] source,
)
此时应该有以下几点:
MyScript.ps1 12345ABC 'filesystem'
这也应该有效:
MyScript.ps1 -source 'filesystem' -version 12345AB