很简单,如何初始化我的Powershell脚本的params
部分,以便我可以使用命令行参数,如
Get-Foo [-foo1] <foo1Arg> [-foo2 <foo2Arg> [-bar <barArg>]]
所以我唯一可以使用-bar
的时候是foo2
已定义。
如果-bar
不依赖于-foo2
我可以做
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[string]$foo1,
[string]$foo2,
[string]$bar
)
但是我不知道如何做出这个依赖参数。
答案 0 :(得分:10)
我对原始问题的解读与C.B.的略有不同。从
Get-Foo [-foo1] <foo1Arg> [-foo2 <foo2Arg> [-bar <barArg>]]
第一个参数$ foo1始终是强制性的,而如果指定$ bar,则必须指定$ foo2。
所以我的编码就是将$ foo1放在两个参数集中。
function Get-Foo
{
[CmdletBinding(DefaultParameterSetName="set1")]
param (
[Parameter(ParameterSetName="set1", Mandatory=$true, Position=0)]
[Parameter(ParameterSetName="set2", Mandatory=$true, Position=0) ]
[string]$foo1,
[Parameter(ParameterSetName="set2", Mandatory=$true)]
[string]$foo2,
[Parameter(ParameterSetName="set2", Mandatory=$false)]
[string]$bar
)
switch ($PSCmdlet.ParameterSetName)
{
"set1"
{
$Output= "Foo is $foo1"
}
"set2"
{
if ($bar) { $Output= "Foo is $foo1, Foo2 is $foo2. Bar is $Bar" }
else { $Output= "Foo is $foo1, Foo2 is $foo2"}
}
}
Write-Host $Output
}
Get-Foo -foo1 "Hello"
Get-Foo "Hello with no argument switch"
Get-Foo "Hello" -foo2 "There is no bar here"
Get-Foo "Hello" -foo2 "There" -bar "Three"
Write-Host "This Stops for input as foo2 is not specified"
Get-Foo -foo1 "Hello" -bar "No foo2"
运行上述内容后,您将获得以下输出。
Foo is Hello
Foo is Hello with no argument switch
Foo is Hello, Foo2 is There is no bar here
Foo is Hello, Foo2 is There. Bar is Three
This Stops for input as foo2 is not specified
cmdlet Get-Foo at command pipeline position 1
Supply values for the following parameters:
foo2: Typedfoo2
Foo is Hello, Foo2 is Typedfoo2. Bar is No foo2
答案 1 :(得分:6)
您需要参数集,请阅读此处以了解更多信息:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd878348(v=vs.85).aspx
您的代码示例:
[CmdletBinding(DefaultParameterSetName="set1")]
param (
[Parameter(ParameterSetName="set1", Mandatory=$true)]
[string]$foo1,
[Parameter(ParameterSetName="set2", Mandatory=$true)]
[string]$foo2,
[Parameter(ParameterSetName="set2")]
[string]$bar
)