Powershell管道到交换机语句以格式化电话号码

Powershell管道到交换机语句以格式化电话号码,powershell,switch-statement,Powershell,Switch Statement,我正在尝试查询广告以获取用户的电话号码,然后将其格式化为标准格式(###-###)。我使用Switch语句是因为我已经看到了一些不同格式的数字。按照我设置代码的方式,尽管我遇到了一个错误:“术语开关不能识别为cmdlet、函数、脚本文件的名称…” 代码如下: $ADInfo = Get-ADUser $User.Email.split("@")[0] -Properties * -Server $DC $User.'Phone Number' = $ADInfo.telephoneNumber

我正在尝试查询广告以获取用户的电话号码,然后将其格式化为标准格式(###-###)。我使用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语句,但这似乎是使用管道的一种有效方法

无论如何,任何帮助都是感激的!谢谢

我是否误解了管道的工作原理

管道只能将内容输送到命令,而
switch
不是命令,而是语言关键字

您可以将
开关
语句包装在
ForEach对象
块中,并通过管道将输入传输到该块:

$User.'Phone Number' = $ADInfo.telephoneNumber | ForEach-Object {
    Switch -regex ($_) {
        '^\d{5}$'                     
        {                        
            "{0:38#-####}" -f $_
        }
        '^\d{7}$' 
        {
            "{0:###-####}" -f $_
        }
    }
}
同样,这里的
break
语句是多余的(不是必需的),因为您的测试用例是互斥的

我是否误解了管道的工作原理

管道只能将内容输送到命令,而
switch
不是命令,而是语言关键字

您可以将
开关
语句包装在
ForEach对象
块中,并通过管道将输入传输到该块:

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

由于这里的
break
语句是多余的(并且不是必需的),因为您的测试用例是互斥的

,正如Mathias R.Jessen所建议的,这里有一个示例,说明如何使用
开关
,而不必使用
ForEach
循环进行迭代,也不必向它输送任何内容

开关将自己迭代一个数组,所以在这种情况下,不需要将它嵌套在循环中,甚至不需要管道。可以这样做:

$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
。在
开关
脚本块中使用
继续
的进一步示例:

$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.

正如Mathias R.Jessen所建议的,下面是一个如何使用
开关
的示例,而不必使用
ForEach
循环进行迭代,也不必向它输送任何东西

开关将自己迭代一个数组,所以在这种情况下,不需要将它嵌套在循环中,甚至不需要管道。可以这样做:

$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
。在
开关
脚本块中使用
继续
的进一步示例:

$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.

请注意,
break
在这里没有任何函数。更简单的是,
Switch
可以迭代和循环,因此这就变成了
$User.Phone Number'=Switch-regex($ADInfo.telephoneNumber){…}
。此外,由于<代码>中断< /代码>可能会混淆各种循环,您可能需要考虑用<代码>替换<代码>中断<代码> >继续< /代码>。最后,由于您的正则表达式匹配非常具体,您可以完全删除break/continue行,以及
default
大小写,因为它是空的。@在这种情况下,madtechnology
break
不会影响每个对象的
ForEach
,只适用于
switch
语句。您应该添加一个显示带有数组输入的
switch
语句的答案:-)注意
break
在这里没有任何函数。更简单的是,
switch
可以迭代和循环,所以它只是变成
$User.'Phone Number'=switch-regex($ADInfo.telephoneNumber){…}
。此外,由于<代码>中断< /代码>可能会混淆各种循环,您可能需要考虑用<代码>替换<代码>中断<代码> >继续< /代码>。最后,由于您的正则表达式匹配非常具体,您可以完全删除break/continue行,以及
default
大小写,因为它是空的。@在这种情况下,madtechnology
break
不会影响每个对象的
ForEach
,只适用于
switch
语句。您应该添加一个答案,显示带有数组输入的
switch
语句:-),根据您在Mathias答案中的评论,这就是我的答案。无论出于何种原因,我必须将.telephoneNumber转换为整数,但我认为这可能是因为其中一些电话号码的格式正确,PowerShell将其解释为字符串。根据您在Mathias回答中的评论,这就是我的答案。无论出于何种原因,我必须将.telephoneNumber转换为整数,但我认为这可能是因为其中一些电话号码的格式正确,PowerShell将其解释为字符串。