在使用参数集名称的同时使用$ args

时间:2018-02-06 15:20:15

标签: powershell parameters arguments parameter-passing optional-parameters

考虑以下玩具示例脚本test.ps1

Param(
    [Parameter(ParameterSetName='readfile',Position=0,Mandatory=$True)]
    [string] $FileName,

    [Parameter(ParameterSetName='arg_pass',Mandatory=$True)]
    [switch] $Ping
)

if ($Ping.isPresent) {
    &$env:ComSpec /c ping $args
} else {
    Get-Content $FileName 
}

期望的效果是

.\test.ps1 FILE.TXT

显示FILE.TXT

的内容
.\test.ps1 -Ping -n 5 127.0.0.1

ping localhost 5次。

不幸的是,后者失败并出现错误

A parameter cannot be found that matches parameter name 'n'.
At line:1 char:18
+ .\test.ps1 -Ping -n 5 127.0.0.1
+                  ~~
    + CategoryInfo          : InvalidArgument: (:) [test.ps1], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,test.ps1

当然,这只是一个很小的例子。

一般情况下,我正在寻找一种方法来向我的脚本中引入[switch]参数,该脚本位于其自己的参数集中,当该切换存在时,我想从命令行中使用所有剩余的参数并传递他们到另一个命令行应用程序。在PowerShell中执行此操作的方法是什么?

1 个答案:

答案 0 :(得分:4)

您可以使用ValueFromRemainingArguments参数属性。我还建议在CmdletBinding中指定默认参数集名称。例如:

[CmdletBinding(DefaultParameterSetName="readfile")]
param(
  [parameter(ParameterSetName="readfile",Position=0,Mandatory=$true)]
    [String] $FileName,
  [parameter(ParameterSetName="arg_pass",Mandatory=$true)]
    [Switch] $Ping,
  [parameter(ParameterSetName="arg_pass",ValueFromRemainingArguments=$true)]
    $RemainingArgs
)
if ( $Ping ) {
  ping $RemainingArgs
}
else {
  Get-Content $FileName 
}

(旁白:我认为不需要& $env:ComSpec /c。您可以在PowerShell中运行命令而不会生成cmd.exe的副本。)