Powershell管道到交换机语句以格式化电话号码
我正在尝试查询广告以获取用户的电话号码,然后将其格式化为标准格式(###-###)。我使用Switch语句是因为我已经看到了一些不同格式的数字。按照我设置代码的方式,尽管我遇到了一个错误:“术语开关不能识别为cmdlet、函数、脚本文件的名称…” 代码如下:Powershell管道到交换机语句以格式化电话号码,powershell,switch-statement,Powershell,Switch Statement,我正在尝试查询广告以获取用户的电话号码,然后将其格式化为标准格式(###-###)。我使用Switch语句是因为我已经看到了一些不同格式的数字。按照我设置代码的方式,尽管我遇到了一个错误:“术语开关不能识别为cmdlet、函数、脚本文件的名称…” 代码如下: $ADInfo = Get-ADUser $User.Email.split("@")[0] -Properties * -Server $DC $User.'Phone Number' = $ADInfo.telephoneNumber
$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
大小写,因为它是空的。@在这种情况下,madtechnologybreak
不会影响每个对象的ForEach
,只适用于switch
语句。您应该添加一个显示带有数组输入的switch
语句的答案:-)注意break
在这里没有任何函数。更简单的是,switch
可以迭代和循环,所以它只是变成$User.'Phone Number'=switch-regex($ADInfo.telephoneNumber){…}
。此外,由于<代码>中断< /代码>可能会混淆各种循环,您可能需要考虑用<代码>替换<代码>中断<代码> >继续< /代码>。最后,由于您的正则表达式匹配非常具体,您可以完全删除break/continue行,以及default
大小写,因为它是空的。@在这种情况下,madtechnologybreak
不会影响每个对象的ForEach
,只适用于switch
语句。您应该添加一个答案,显示带有数组输入的switch
语句:-),根据您在Mathias答案中的评论,这就是我的答案。无论出于何种原因,我必须将.telephoneNumber转换为整数,但我认为这可能是因为其中一些电话号码的格式正确,PowerShell将其解释为字符串。根据您在Mathias回答中的评论,这就是我的答案。无论出于何种原因,我必须将.telephoneNumber转换为整数,但我认为这可能是因为其中一些电话号码的格式正确,PowerShell将其解释为字符串。