PowerShell中的Enum Like开关参数

6kkfgxo0  于 2022-11-10  发布在  Shell
关注(0)|答案(4)|浏览(113)

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

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

我正在试着想办法让它更有枚举风格。正如任何人可能猜测的那样,我希望用户在Word、Excel和PowerPoint之间进行选择。以及2007年第2007年和第2010年版之间。
有没有一种巧妙的方法来获得输入参数枚举样式?
我是PowerShell的新手。因此,如果这听起来像是我不知道一些显而易见的事情,那么请给我一些链接,我可以在那里读到它。

axkjgtzd

axkjgtzd1#

我将改用ValidateSet参数属性。
发信人:about_Functions_Advanced_Parameters
ValiateSet属性为参数或变量指定一组有效的值。如果参数或变量值与集合中的值不匹配,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.

qni6mghb

qni6mghb2#

您可以使用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
axkjgtzd

axkjgtzd3#

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

您需要将参数括在圆括号中才能将参数解析为类型。这是必需的,因为参数或多或少被视为字符串。了解了这一点后,您还可以以简单的字符串形式向它们传递枚举,PowerShell会解决这个问题:

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

Error-F不是枚举值之一-有效值包括A、B、C、D*

u3r8eeie

u3r8eeie4#

从PowerShell5开始,您实际上可以在本地使用/创建Enum

enum OS {
    Windows
    Linux
    iOS
}

然后,这也将显示为其类型。

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     OS                                       System.Enum

也许4sysops提供了一个有用的链接。
要在函数中使用它,我会创建一个单独的.psm1文件并添加您需要的所有枚举--请参阅我的注解,其中引用了一个类似的问题--或者您可以将此枚举设置在.psm1文件的顶部并在同一文件中使用。
例如,我创建了文件test.psm1并添加了以下代码:

enum OS {
    Windows
    Linux
    iOS
}

function Get-OS {
    param (
        [Parameter(Mandatory)]
        [OS]$os
    )

    Write-Host -Object "The operating system is $os."

}

我导入文件Import-Module .\test.psm1并运行它:

PS > Get-OS -os Linux
The operating system is Linux.

相关问题