代码之家  ›  专栏  ›  技术社区  ›  Paolo Tedesco

将枚举值传递给PowerShell中的函数

  •  8
  • Paolo Tedesco  · 技术社区  · 14 年前

    我有一个接受枚举值作为参数的函数。举个例子,可以考虑如下情况:

    (PS) > function IsItFriday([System.DayOfWeek] $dayOfWeek) { 
        if($dayOfWeek -eq [System.DayOfWeek]::Friday) {
            "yes"
        } else {
            "no"
        } 
    }
    

    现在,如果我这样调用它,一切都很好:

    (PS) > $m = [System.DayOfWeek]::Monday
    (PS) > IsItFriday $m
    no
    

    但是如果我调用直接传递枚举值的函数,我会得到一个相当神秘的错误:

    (PS) > IsItFriday [System.DayOfWeek]::Monday
    IsItFriday : Cannot convert value "[System.DayOfWeek]::Monday" to type "System.DayOfWeek" 
    due to invalid enumeration values. Specify one of the following enumeration values and 
    try again. The possible enumeration values are "Sunday, Monday, Tuesday, Wednesday, 
    Thursday, Friday, Saturday".
    At line:1 char:11
    + IsItFriday  <<<< [System.DayOfWeek]::Monday
    

    用枚举值初始化变量和直接传递枚举值有什么区别?

    4 回复  |  直到 14 年前
        1
  •  8
  •   George Howarth    14 年前

    Get-ChildItem -Path C:\
    

    注意这里没有引号 C:\ 因为,第一,它会被隐含地转换为字符串;第二,当您将路径作为参数传递给某个被调用方时,不必将不包含空格的路径括起来。

    让我们回到函数,稍微修改一下:

    function IsItFriday($dayOfWeek) 
    {
        $dayOfWeek.GetType()
    
        if ($dayOfWeek -eq [System.DayOfWeek]::Friday) 
        {
            "yes"
        } 
        else 
        {
            "no"
        }
    }
    
    IsItFriday [System.DayOkWeek]::Monday
    

    IsPublic IsSerial Name                                     BaseType                                                                                        
    -------- -------- ----                                     --------                                                                                        
    True     True     String                                   System.Object                                                                                   
    no
    

    看到发生什么了吗?PowerShell认为您传入的是字符串而不是枚举值,因此 Cannot convert value "[System.DayOfWeek]::Monday"

        2
  •  17
  •   stej    14 年前

    这有点出乎意料-您需要将其括在括号中,以便计算值:

    > IsItFriday ([System.DayOfWeek]::Monday)
    

    也可以只传递如下字符串:

    > IsItFriday Monday
    no
    > IsItFriday Friday
    yes
    

    PowerShell将其转换为枚举类型。汉迪,不是吗:)

        3
  •  9
  •   Rui Jarimba    4 年前

    要避免此错误,请将枚举值放在括号中:

    PS > IsItFriday ([System.DayOfWeek]::Monday)  
    no
    
    PS > IsItFriday ([System.DayOfWeek]::Friday)  
    yes
    
        4
  •  5
  •   JasonMArcher TWE    14 年前

    更方便的是,如果字符串有效,则会将其转换为枚举值:

    function IsItFriday([System.DayOfWeek] $dayOfWeek) {   
        if($dayOfWeek -eq [System.DayOfWeek]::Friday) {  
            "yes"  
        } else {  
            "no"  
        }   
    }
    
    PS 7> IsItFriday Monday
    no
    PS 8> IsItFriday Friday
    yes