我试图查询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语句,但这似乎是一种使用管道的有效方法。
无论如何,任何帮助表示赞赏!谢谢!
正如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 = @('[email protected]','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
的情况。输出结果如下:
[email protected] is an email address.
JDoe is unknown.
(555)867-5309 is a phone number.
Taco Tuesday is unknown.
我误解了管道是如何工作的吗?
是。
管道只能管理命令 - 而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
语句是多余的(并且不是必需的),因为您的测试用例是互斥的