我正在尝试创建一个 PowerShell (2.0) 脚本,该脚本将接受遵循此基本模式的参数:
.\{script name} [options] PATH
其中选项是任意数量的可选参数,类似于详细模式的'-v'。PATH参数将简单地是最后传入的任何参数,并且是强制性的。可以使用不带任何选项且仅有一个参数的方式调用脚本,那个参数将被假定为路径。我无法设置仅包含可选参数但又非位置参数的参数列表。
这个简短的脚本演示了我所遇到的问题:
#param test script
Param(
$firstArg,
$secondArg,
[switch]$thirdArg,
[Parameter(ValueFromRemainingArguments = $true)]
$remainingArgs)
write-host "first arg is $firstArg"
write-host "second arg is $secondArg"
write-host "third arg is $thirdArg"
write-host "remaining: $remainingArgs"
当像这样调用时:
.\param-test.ps1 firstValue secondValue
脚本输出:first arg is firstValue
second arg is secondValue
third arg is False
remaining:
我想要实现的行为是,两个参数都可以通过可选参数传递,并最终进入remainingArgs变量。
这个问题/答案 给出了一个有用的方法来实现所需的行为,但它似乎只在至少有一个必需参数且该参数出现在所有其他参数之前时才起作用。
我可以通过将firstArg设为必需参数并指定位置0来演示这种行为:
#param test script
Param(
[Parameter(Mandatory=$true, Position = 0)]
$firstArg,
$secondArg,
[switch]$thirdArg,
[Parameter(ValueFromRemainingArguments = $true)]
$remainingArgs)
write-host "first arg is $firstArg"
write-host "second arg is $secondArg"
write-host "third arg is $thirdArg"
write-host "remaining: $remainingArgs"
使用与之前相同的输入运行:
.\param-test.ps1 firstValue secondValue
输出如下:
first arg is firstValue
second arg is
third arg is False
remaining: secondValue
第一个必要参数被分配,其余的所有参数都被全部忽略。
问题是:我如何设置参数列表,使得所有参数都是可选的,且没有参数是位置参数?