考虑以下玩具示例脚本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中执行此操作的方法是什么?
答案 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的副本。)