验证任意数量的PowerShell脚本参数

时间:2018-11-22 18:41:22

标签: powershell

在PowerShell中可以验证传递给脚本的参数,还可以启用自动完成功能,如下所示:

myscript.ps1

param([Parameter(Mandatory=$false)][String][ValidateSet('abc',
                                                        'def',
                                                        'ghi')] $argument
     )

但这只会为第一个参数启用自动完成功能。我希望“自动完成”参数的数量可以是任意的。

因此,键入后:

  • PS C:\> .\myscript.ps1 def(末尾有空白)和
  • 按下标签,我希望可能的参数再次自动完成PS C:\> .\myscript.ps1 def abs

如何在param(...)部分进行编码?

1 个答案:

答案 0 :(得分:3)

如果您确实希望将值作为单个参数传递,并用空格分隔 ,请使用ValueFromRemainingArguments参数属性:

param(
  [Parameter(ValueFromRemainingArguments)]
  [ValidateSet('abc', 'def', 'ghi')]
  [string[]] $argument
 )

请注意,$argument现在是值的数组,PowerShell在其中为您收集所有位置参数。

潜在的不利之处在于,这会使所有个位置参数接受验证,因此,如果您还需要传递其他参数,则必须在参数前面加上参数名称(例如, -foo bar


因此,请考虑改用单个显式数组值参数:

param(
      [ValidateSet('abc', 'def', 'ghi')] 
      [string[]] $argument
     )

这样,$argument将以,作为分隔符传递时,将接收多个值 ,除了制表符补全第一个值外,键入后每个值都会另外一个,也可以完成制表符。

./myscript a<tab>  # -> ./myscript abc

./myscript abc, d<tab<  # -> ./myscript abc, def