是否可以控制脚本参数绑定的顺序?

时间:2016-12-07 16:18:04

标签: powershell

我无法弄清楚以下是否可行。看起来不是,但我想我会问社区。

我们说我对脚本参数进行了简单的处理,如下所示:

[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。

3 个答案:

答案 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