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

Tch*_*hke 0 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
    } 

}
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*sen 6

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

是.

管道只能管理命令 - 而switch不是命令,它是语言关键字.

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

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

正如Ansgar所指出的,break这里的陈述是多余的(并且不是必需的),因为您的测试用例是互斥的

  • 请注意,`break`在这里没有任何功能. (2认同)
  • 甚至更简单,`Switch`可以迭代和循环,所以这只是`$ User.'Phone Number'= Switch -regex($ ADInfo.telephoneNumber){...}`.另外,由于`break`的方式可以搞乱各种循环,你可能要考虑用`continue`替换`break`.最后,由于你的正则表达式匹配是如此具体,你可以完全删除break/continue行,以及`default` case,因为它是空的. (2认同)