2014-05-16 46 views
3

嗨號碼的所有我想要使用PowerShellPowerShell的獲取從字符串

我們使用的是第一個名字的第一個字母的格式,最後一個名字的前四個字母,以得到一個用戶ID的數量和studentid等等如果用戶的名字少於4個字母,那麼名爲John Smith的Id#123456的學生將成爲jsmit123456 問題。 所以使用子將給與錯誤的ID的

我試圖選擇串,-match,修剪,trimstart,trimend

這裏是我到目前爲止的代碼

$name = Get-ADUser -SearchBase "OU=A,DC=B,DC=C,DC=edu" 
-Filter {Created -ge $checktime}  
|Select-Object SAMAccountName 

foreach($object in $name){ 
$object 
$studentid = $object.SAMAccountName.Substring(5,6) 
$studentid 
} 
+0

您確定Id不存在作爲您的目錄(uid)中的另一個屬性。使用像dirctory這樣的工具將兩個數據存儲在相同的屬性中並不那麼幹淨。 – JPBlanc

+0

你在國防工業工作不是嗎? –

回答

9

這是簡單的使用正則表達式:

('jsmit123456') -replace '\D+(\d+)','$1' 

123456 

\ D + =所有非數字,\ d + =後面的所有數字。

$studentid = $object.SAMAccountName -replace '\D+(\d+)','$1' 
+0

只是爲了好玩:'-join(「jsmit123456」)[ - 6 ..- 1]'(如果ID總是六位數) –

+6

在這種情況下'-replace'\ D +''應該就足夠了。 – Joey

+0

非常感謝幫助 –

1

你應該使用一個更通用的正則表達式。 例如,覆蓋值之後的AND之前的非數字字符。例如:?? XXXX12345YYYY **

你應該使用:

('??XXXX12345YYYY**') -replace '\D+(\d+)\D+','$1' 

$studentid = $object.SAMAccountName -replace '\D+(\d+)\D+','$1' 
0
Function ExtractNumbers ([string]$InStr){ 
    $Out = $InStr -replace("[^\d]") 
    try{return [int]$Out} 
     catch{} 
    try{return [uint64]$Out} 
     catch{return 0}} 

使用:

$a = "a18афпа4sgsafd4r6!74y40:7-375+0(95)" 

ExtractNumbers $a

(ExtractNumbers $a).gettype() 
1

可讀性原因(我有時發現很難用正則表達式),我寧願這樣的解決方案:

'john123456smith' -replace "[^0-9]" , '' 

123456 

取代一切是不是一個數字,[^ 0-9],什麼也沒有,「」。這不涉及$ 1語法(由正則表達式匹配的字符串)