【发布时间】: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,但要么我做错了,要么它没有按我想象的方式工作。
【问题讨论】:
-
看看Require and test for named arguments only 看看是否有帮助。您基本上需要以
[CmdletBinding(PositionalBinding=$false)]开始您的脚本。
标签: powershell