script Param 允许可选参数和 ValueFromRemainingArguments

script Param allows optional argument and ValueFromRemainingArguments

提问人:JamesThomasMoon 提问时间:9/20/2023 更新时间:11/13/2023 访问量:23

问:

TL的;dr 一个允许可选参数后跟参数的 PowerShell 脚本部分?ParamValueFromRemainingArguments

我想要一个脚本,该脚本在传递时采用可选参数值,并且所有其他参数都附加到数组中。 将默认为 。int-argIntString[]argInt0

所以给定的文件与脚本主体my-args.ps1

Write-Host "argInt is $argInt"

foreach($arg in $argsRemaining) {
    Write-Host "arg is $arg"
}

通话将如下所示

PS> .\my-args.ps1 foo bar
argInt is 0
arg is foo
arg is bar

PS> .\my-args.ps1 -argInt 33 foo bar
argInt is 33
arg is foo
arg is bar

PS> .\my-args.ps1 -argInt foo
my-args.ps1: Cannot process argument transformation on parameter 'argInt'. Cannot convert value "foo" to type "System.Int32".

PS> .\my-args.ps1
my-args.ps1: Cannot validate argument on parameter 'argsRemaining'. The argument is null, empty, or an element of the argument collection contains a null value.

声明应该是什么样子的?Param

PowerShell 参数 参数传递

评论

0赞 jdweng 9/20/2023
查看 learn.microsoft.com/en-us/powershell/module/...

答:

0赞 Santiago Squarzon 9/20/2023 #1

这将完成您的要求,对于最后一次调用,我建议改为使用该参数,否则,您必须验证它在运行时是否为 null,如函数正文中所示。Mandatory

function Test-Param {
    param(
        [ValidateNotNullOrEmpty()]
        [Parameter()]
        [int] $argInt = 0,

        [ValidateNotNullOrEmpty()]
        [Parameter(ValueFromRemainingArguments, Position = 0)]
        [string[]] $argsRemaining
    )

    if (-not $argsRemaining) {
        $PSCmdlet.ThrowTerminatingError(
            [System.Management.Automation.ErrorRecord]::new(
                # Can add a custom message as 2nd Argument here:
                [System.ArgumentNullException]::new('argsRemaining'),
                'NullRemainingArgument',
                [System.Management.Automation.ErrorCategory]::InvalidArgument,
                $argsRemaining))
    }

    Write-Host "argInt is $argInt"

    foreach ($arg in $argsRemaining) {
        Write-Host "arg is $arg"
    }
}

Test-Param foo bar
Test-Param -argInt 33 foo bar
Test-Param -argInt foo
Test-Param
0赞 Jan 11/13/2023 #2

PositionalBinding 是可用于实现目标的另一种替代方法:

[CmdletBinding(PositionalBinding=$False)]
param(
  [Parameter(Mandatory=$false)][int] $argInt,
  [Parameter(ValueFromRemainingArguments=$true)][String[]]$argsRemaining
)

如果您希望某些参数保持位置 - 可以显式指定 - 例如:

[CmdletBinding(PositionalBinding=$False)]
param(
  [Parameter(Mandatory=$true, Position=0)][string] $operationName,
  [Parameter(Mandatory=$false)][int] $argInt,
  [Parameter(ValueFromRemainingArguments=$true)][String[]]$argsRemaining
)