Powershell Pipe to Switch Statement格式化电话号码

时间:2017-02-07 20:53:39

标签: powershell switch-statement

我正在尝试查询AD以获取用户的电话号码,然后将其格式化为标准格式(### - ####)。我使用的是Switch语句,因为我已经看到了少数不同格式的数字。我设置代码的方式虽然我收到错误:"术语Switch不被识别为cmdlet,函数,脚本文件的名称......"

以下是代码:

$ADInfo = Get-ADUser $User.Email.split("@")[0] -Properties * -Server $DC
$User.'Phone Number' = $ADInfo.telephoneNumber | Switch -regex ($_) {
    '^\d{5}$'                     
    {                        
        "{0:38#-####}" -f $_
        break
    }
    '^\d{7}$' 
    {
        "{0:###-####}" -f $_
        break
    }
    default
    {
        break
    } 

}

我误解了管道是如何工作的吗?我想我可以将此信息保存到临时变量然后输入一个Switch语句,但这似乎是一种使用管道的有效方法。

无论如何,任何帮助表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:6)

  

我误解了管道是如何工作的吗?

管道只能将内容传递给命令 - switch不是命令,它是语言关键字。

您可以将switch语句包装在ForEach-Object块中,并将输入传递给它:

$User.'Phone Number' = $ADInfo.telephoneNumber | ForEach-Object {
    Switch -regex ($_) {
        '^\d{5}$'                     
        {                        
            "{0:38#-####}" -f $_
        }
        '^\d{7}$' 
        {
            "{0:###-####}" -f $_
        }
    }
}

作为Ansgar points out,这里的break语句是多余的(并非必需),因为您的测试用例是互斥的

答案 1 :(得分:2)

正如Mathias R. Jessen所建议的那样,这是一个如何使用Switch而不必使用ForEach循环遍历事物或将任何内容传递给它的示例。

Switch将自己迭代一个数组,因此不需要将它嵌套在循环中,甚至在这种情况下管道任何东西。它可以这样做:

$ADInfo = Get-ADUser $User.Email.split("@")[0] -Properties * -Server $DC
    $User.'Phone Number' = Switch -regex ($ADInfo.telephoneNumber) {
        '^\d{5}$'                     
        {                        
            "{0:38#-####}" -f $_
        }
        '^\d{7}$' 
        {
            "{0:###-####}" -f $_
        }
    }

除此之外,我建议使用Continue代替Break。在continue scriptblock中使用Switch时的进一步示例:

$TestData = @('John.Doe@Company.Com','JDoe','(555)867-5309','Taco Tuesday')
Switch -regex ($TestData){
    '@' {"$_ is an email address.";continue}
    '^[+()\-\d\s]+$' {"$_ is a phone number.";continue}
    default {"$_ is unknown."}
}

这里我们在default块中做了一些事情,所以我们想在前面的例子中包含一个continue语句,这样如果找到匹配,它就会移动到数组中的下一个项目,并且不执行default案例。输出结果如下:

John.Doe@Company.com is an email address.
JDoe is unknown.
(555)867-5309 is a phone number.
Taco Tuesday is unknown.