我正在开发一个脚本,它将根据csv文件生成AD用户名。现在我有以下几行工作。
Select-Object @{n=’Username’;e={$_.FirstName.ToLower() + $_.LastName.ToLower() -replace "[^a-zA-Z]" }}
现在,它取名并将其组合成AD友好名称。但是我需要将其命名为短至不超过20个字符。我尝试了一些不同的方法来缩短用户名,但我没有运气。
关于如何缩短用户名的任何想法?
答案 0 :(得分:3)
可能最优雅的方法是在替换中使用积极的外观:
... -replace '(?<=^.{20}).*'
只有在字符串开头(^.{20}
)前面有20个字符时,此表达式才匹配字符串的其余部分。
另一个选项是替换前20个字符的捕获组:
... -replace '^(.{20}).*', '$1'
这会在字符串的开头捕获最多20个字符,并将整个字符串替换为仅捕获的组($1
)。
答案 1 :(得分:2)
$str[0..19] -join ''
e.g。
PS C:\> 'ab'[0..19]
ab
PS C:\> 'abcdefghijklmnopqrstuvwxyz'[0..19] -join ''
abcdefghijklmnopqrst
我会在你的行中尝试:
Select-Object @{n=’Username’;e={(($_.FirstName + $_.LastName) -replace "[^a-z]").ToLower()[0..19] -join '' }}
([a-z]因为PowerShell正则表达式匹配是非感性的,并且正在移动.ToLower()所以你只需要调用它一次。)
如果您使用的是严格模式,那么为什么不检查长度以避免超出数组的范围而令人愉快:
$str[0..[math]::Min($str.Length, 19)] -join ''
答案 2 :(得分:1)
要在PowerShell中截断字符串,可以使用.NET String::Substring
方法。以下行将返回$targetLength
的第一个$str
字符,如果$str
短于此字符,则返回整个字符串。
if ($str.Length -gt $targetLength) { $str.Substring(0, $targetLength) } else { $str }
如果您更喜欢正则表达式解决方案,以下工作(感谢@PetSerAl)
$str -replace "(?<=.{$targetLength}).*"
快速测量显示正则表达式方法比子串方法慢约70%(942ms与200,000行日志文件上的557ms相比)