枚举类似于PowerShell中的switch参数

时间:2010-09-17 14:26:08

标签: powershell

我以这种方式在PowerShell脚本中使用切换参数。

param(
    [switch] $Word,
    [switch] $Excel,
    [switch] $powerpoint,
    [switch] $v2007,
    [switch] $v2010,
    [switch] $x86,
    [switch] $x64,
)

我试图弄清楚任何简洁的方式让它更加枚举风格。 正如任何人可能猜到的那样,我希望用户在word,excel和powerpoint之间进行选择。 在x2007和v2010之间。

是否有一种简洁的方法来获取输入参数枚举样式?

我是PowerShell的新手。所以,如果这听起来像我不知道一些明显的东西,那么请指出我可以阅读的一些链接。

4 个答案:

答案 0 :(得分:92)

我会使用ValidateSet参数属性。

来自:about_Functions_Advanced_Parameters

  

ValidateSet属性为a指定一组有效值   参数或变量。如果是,Windows PowerShell会生成错误   参数或变量值与集合中的值不匹配。

示例功能:

function test-value
{
    param(
        [Parameter(Position=0)]
        [ValidateSet('word','excel','powerpoint')]
        [System.String]$Application,

        [Parameter(Position=1)]
        [ValidateSet('v2007','v2010')]
        [System.String]$Version
    )


    write-host "Application: $Application"
    write-host "Version: $Version"
}   


PS > test-value -application foo

输出:

test-value : Cannot validate argument on parameter 'Application'. The argument "foo" does not belong to the set "word,excel,powerpoint" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the command again.

答案 1 :(得分:11)

您可以使用ValidateSet属性:

function My-Func
{
    param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Word', 'Excel', 'PowerPoint', 'v2007', 'v2010', 'x86', 'x64')]
        [String]$MyParam
    )

    Write-Host "Performing action for $MyParam"
}

My-Func -MyParam 'Word'
My-Func -MyParam 'v2007'
My-Func -MyParam 'SomeVal'

输出:

Performing action for Word
Performing action for v2007
My-Func : Cannot validate argument on parameter 'MyParam'. The argument "SomeVal" does not belong to the set "Word,Excel,PowerPoint,v2007,v2010,x86,x64" specified by the ValidateSet attribute. Supply an argument that is in the
 set and then try the command again.
At C:\Users\George\Documents\PowerShell V2\ValidateSetTest.ps1:15 char:17
+ My-Func -MyParam <<<<  'SomeVal'
    + CategoryInfo          : InvalidData: (:) [My-Func], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,My-Func

答案 2 :(得分:10)

blog post by the PowerShell team定义了如何在PowerShell 1.0中执行此操作。在PowerShell 2.0中,您可以像这样使用Add-Type:

C:\PS> Add-Type -TypeDefinition @'
>> public enum MyEnum {
>> A,
>> B,
>> C,
>> D
>> }
>> '@
>>

更新:以下是使用枚举的方法:

C:\PS> function foo([MyEnum]$enum) { $enum }
C:\PS> foo ([MyEnum]::A)
A

您需要围绕参数的括号将参数解析为Type。这是必需的,因为参数被或多或少地视为字符串。知道了这一点,你也可以用一个简单的字符串形式传递它们,并且PowerShell会弄清楚:

C:\PS> foo A
A
C:\PS> $arg = "B"
C:\PS> foo $arg
B
C:\PS> foo F
error*

错误 - F不是枚举值之一 - 有效值包括A,B,C,D *

答案 3 :(得分:0)

自PowerShell 5起,您实际上可以本地使用/创建一个ShowDialogBox("test", "testing dialog box behaviour", DialogBoxButtons.YES_NO_CANCEL, HandleResponse); private void HandleResponse(DialogResponse response) { if(response == DialogResponse.YES) { // Do something } }

Enum

然后它的类型也将可见。

enum OS {
    Windows
    Linux
    iOS
}

Series.view可能是有用的链接。