【问题标题】:assign powershell params by name only仅按名称分配 powershell 参数
【发布时间】:2019-08-03 03:05:30
【问题描述】:

我正在编写一个具有多个参数的 powershell 脚本

param(
  [Parameter(Mandatory=$true, Position=0)]
  [ValidateSet('a', 'b', 'c', 'd')]
  [string] $abcd,

  [Parameter(Mandatory=$true)] [string] $mandatory1,
  [Parameter(Mandatory=$true)] [string] $mandatory2,
  [Parameter()] $optional1=$false,
  [Parameter()] $optional2=$false,
  [Parameter()] $defaulted1=256,
  [Parameter()] $defaulted2=30,
  [Parameter()] [string] $defaulted3='defaulted3',
  [Parameter(ValueFromRemainingArguments=$true)] [string[]] $rest
)

但是,当我尝试调用它时,一些参数被分配给可选/默认值而不是 $rest。

.\my-script `
  -abcd a `
  -mandatory1 value1 `
  -mandatory2 value2 `
  -optional1 value3 `
  -optional2 value4 `
  -rest `
    foo `
    bar `
    baz

我的脚本打印

optional1 is value3
optional2 is value4
defaulted1 is bar
defaulted2 is baz
rest is foo

所以看起来 Powershell 更喜欢将事物 按位置 分配给参数,即使它们具有默认值,而不是将它们分配给 ValueFromRemainingArguments 参数。

有没有办法改变这种行为并仅按名称设置可选参数的值?

我尝试使用 How to specify a non-positional parameter in a PowerShell script?Powershell non-positional, optional params,但要么我做错了,要么它没有按我想象的方式工作。

【问题讨论】:

标签: powershell


【解决方案1】:

在脚本顶部的param 关键字之前添加[CmdletBinding(PositionalBinding=$false)]。见Require and test for named arguments only

以下是应用于代码的参数属性示例:

function test {
[cmdletbinding(PositionalBinding=$false)]
param(
[Parameter(Mandatory=$true)]
[ValidateSet('a', 'b', 'c', 'd')]
[string] $abcd,
[Parameter(Mandatory=$true)] [string] $mandatory1,
[Parameter(Mandatory=$true)] [string] $mandatory2,
[Parameter()] $optional1=$false,
[Parameter()] $optional2=$false,
[Parameter()] $defaulted1=256,
[Parameter()] $defaulted2=30,
[Parameter()] [string] $defaulted3='defaulted3',
[Parameter(ValueFromRemainingArguments=$true)] [string[]] $rest
)
$rest
}

test -abcd "a" -mandatory1 "hi" -mandatory2 "hi" "foo" "bar"
foo
bar
test -abcd "a" -mandatory1 "hi" -mandatory2 "hi" -rest foo,bar,baz
foo
bar
baz

【讨论】:

  • 在我试图传递给 $rest 的值之间添加逗号似乎有效!谢谢!一直是对数组语法的误解
  • 您也可以考虑不让命令的“Position=0”部分专门告诉它查找位置参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2017-07-31
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2011-02-12
相关资源
最近更新 更多