我正在创建一个脚本,我希望2个参数是可选的(并提供-param val -param2 val2),然后是未知数量的文件路径。我遇到的问题是,当我不提供可选参数时,powershell假定最初作为文件路径给出的前2个参数是我通常用-param命令传递的参数。
例如,如果我运行
。\ script.ps1 test test2
然后
$args.Count == 0
我能以某种方式解决这个问题吗?我希望参数是可选的并强制执行它,以便它们只能在值之前用连字符和名称传递。
答案 0 :(得分:0)
声明param()
阻止后,$args
无法再使用,因此$args.Count
将为空。它基本上是不存在的。之后必须是命名参数,或者必须在ValueFromRemainingArguments
中的声明参数中使用param()
。您可以将路径作为数组传递或使用ValueFromRemainingArguments
:
#I realize this isn't what you really want, but just a suggestion
Param(
[Parameter(Mandatory=$False)][String]$Param1,
[Parameter(Mandatory=$False)][String]$Param2,
[Parameter(Mandatory=$True, Position=0)][Array]$Path
)
.\script.ps1 C:\Users, C:\Windows
# or
Param(
[Parameter(Mandatory=$False)][String]$Param1,
[Parameter(Mandatory=$False)][String]$Param2,
[Parameter(Position=0, ValueFromRemainingArguments=$True)][String[]]$Path
)
.\script.ps1 C:\Users C:\Windows
答案 1 :(得分:0)
function Test-Params {
[CmdletBinding(DefaultParameterSetName='FilesOnly')]
param(
[Parameter(
ParameterSetName='Optionals',
Mandatory=$true
)]
[String]
$Optional1 ,
[Parameter(
ParameterSetName='Optionals',
Mandatory=$true
)]
[String]
$Optional2 ,
[Parameter(
ParameterSetName='FilesOnly',
Mandatory=$true,
ValueFromRemainingArguments=$true,,
Position=0
)]
[Parameter(
ParameterSetName='Optionals',
Mandatory=$true,
ValueFromRemainingArguments=$true,
Position=2
)]
[String[]]
$Files
)
"Op1: $Optional1"
"Op2: $Optional2"
"Files: $Files"
"File Count: $($Files.Count)"
}
Get-Help Test-Params
Test-Params 'C:\Windows','C:\Temp'
Test-Params -Optional1 'a' -Optional2 'b' 'C:\Users','C:\eclipse'
Test-Params C:\Windows C:\users C:\temp
Test-Params -Optional1 'a' -Optional2 'b' C:\Windows C:\users C:\temp
试着运行它,它应该说明如何使用参数集来实现这一点。
我不清楚是否需要一起指定可选参数,所以我假设是。
如果没有,那么它仍然可以实现,但代码会更长。让我知道!
添加了ValueFromRemainingArguments
属性,这样您就不必将文件格式化为数组,因为这似乎是您在示例中调用它的方式。