2017-02-07 35 views
0

我試圖查詢AD以獲取用戶的電話號碼,然後將其格式化爲標準格式(### - ####)。我使用了一個Switch語句,因爲我已經看到了少數不同格式的數字。隨着我有我的代碼設置雖然我得到一個錯誤的方式:「術語開關未被識別爲cmdlet,函數,腳本文件的名字......」PowerShell管道切換聲明格式化電話號碼

下面的代碼:

$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

正如Mathias R. Jessen所建議的,這裏是一個如何使用Switch的例子,而不必用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。當continue將在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. 
+0

根據你在Mathias的回答中的評論,這就是我所使用的。無論出於什麼原因,我都必須將其轉換。telephoneNumber爲一個整數,但我認爲這可能是因爲其中一些電話號碼格式正確,PowerShell將它們解釋爲字符串。 – Tchotchke

6

Am I misunderstanding how the pipeline works?

是的。

管道只能管道到命令 - 和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語句是多餘的(而不是必需的),因爲你的測試用例是互斥

+2

請注意,'break'在這裏沒有功能。 –

+2

更簡單,'Switch'可以迭代和循環,所以這就變成'$ User.'Phone Number'= Switch -regex($ ADInfo.telephoneNumber){...}'。另外,由於'break'可能會混淆各種循環,所以您可能需要考慮用'continue'替換'break'。最後,由於你的正則表達式匹配如此特殊,你可以完全移除break/continue行,以及'default'的情況,因爲它是空的。 – TheMadTechnician

+0

@TheMadTechnician'break'在這種情況下不會影響'ForEach-Object',只適用於'switch'語句。你應該添加一個答案,顯示一個帶有數組輸入的'switch'語句:-) –