2014-05-16 34 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语法(由正则表达式匹配的字符串)