Powershell中的Param - 我可以强制执行-name传递吗?

时间:2014-08-06 09:28:05

标签: powershell

我正在创建一个脚本,我希望2个参数是可选的(并提供-param val -param2 val2),然后是未知数量的文件路径。我遇到的问题是,当我不提供可选参数时,powershell假定最初作为文件路径给出的前2个参数是我通常用-param命令传递的参数。

例如,如果我运行

  

。\ script.ps1 test test2

然后

$args.Count == 0

我能以某种方式解决这个问题吗?我希望参数是可选的并强制执行它,以便它们只能在值之前用连字符和名称传递。

2 个答案:

答案 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属性,这样您就不必将文件格式化为数组,因为这似乎是您在示例中调用它的方式。