PowerShell中如何移除Get-ADUser返回结果的前X个字符并二次查询
问题根因
- 导出TXT报错的原因:
Out-File会将PowerShell对象的格式化输出(包括表头、对齐填充空格、多余空行)写入文件,你读取到的$User不是纯SAMAccount值,而是带格式的字符串,裁剪后自然携带多余空格或无效字符。 - 导出CSV报错的原因:你读取CSV时直接按普通文本读取,没有使用
Import-Csv正确提取SAMAccountName属性值,导致读到的是带双引号、逗号分隔的整行文本。
最优解决方案(无中间文件,避免格式问题)
直接在内存处理第一次的查询结果,完全不需要导出再导入,不会产生任何格式异常:
# 第一次查询指定OU下的带前缀用户 $prefixUsers = Get-ADUser -Filter * -SearchBase 'OU=SomeOU' -SearchScope 2 $StandardUsers = foreach ($user in $prefixUsers) { # 裁剪前缀的同时清除首尾多余空白字符 $cleanSam = $user.SAMAccountName.Substring(7).Trim() Write-Host "Now checking $cleanSam" Get-ADUser $cleanSam -Properties DisplayName, UserPrincipalName, Mail, Manager, EmployeeID | Select-Object DisplayName, UserPrincipalName, Mail, Manager, EmployeeID } # 导出结果,用Export-Csv格式更规范,后续读取不会有格式问题 $StandardUsers | Export-Csv -Path C:\Temp\StandardUserList.csv -NoTypeInformation -Encoding UTF8 # 如果需要TXT格式可以用下面的命令 # $StandardUsers | Format-Table -AutoSize | Out-File -FilePath C:\Temp\StandardUserList.txt -Encoding UTF8
保留中间导出文件的处理方案
如果你有留存中间文件的需求,可按照以下正确写法处理对应格式:
TXT作为中间文件的正确写法
# 导出时直接输出纯SAMAccount值,不要带格式 Get-ADUser -Filter * -SearchBase 'OU=SomeOU' -SearchScope 2 | Select-Object -ExpandProperty SAMAccountName | Out-File C:\Temp\UserList.txt -Encoding UTF8 # 读取时跳过空行,清除每一行的首尾空白 $UserList = Get-Content C:\Temp\UserList.txt | Where-Object { $_ -notmatch '^\s*$' } | ForEach-Object { $_.Trim() } $StandardUsers = foreach ($User in $UserList) { $cleanSam = $User.Substring(7).Trim() Write-Host "Now checking $cleanSam" Get-ADUser $cleanSam -Properties DisplayName, UserPrincipalName, Mail, Manager, EmployeeID | Select-Object DisplayName, UserPrincipalName, Mail, Manager, EmployeeID } $StandardUsers | Export-Csv -Path C:\Temp\StandardUserList.csv -NoTypeInformation -Encoding UTF8
CSV作为中间文件的正确写法
# 导出CSV Get-ADUser -Filter * -SearchBase 'OU=SomeOU' -SearchScope 2 | Select-Object SAMAccountName | Export-Csv C:\Temp\UserList.csv -NoTypeInformation -Encoding UTF8 # 用Import-Csv读取,直接取SAMAccountName属性,自动处理引号 $UserList = Import-Csv C:\Temp\UserList.csv | Select-Object -ExpandProperty SAMAccountName $StandardUsers = foreach ($User in $UserList) { $cleanSam = $User.Substring(7).Trim() Write-Host "Now checking $cleanSam" Get-ADUser $cleanSam -Properties DisplayName, UserPrincipalName, Mail, Manager, EmployeeID | Select-Object DisplayName, UserPrincipalName, Mail, Manager, EmployeeID } $StandardUsers | Export-Csv -Path C:\Temp\StandardUserList.csv -NoTypeInformation -Encoding UTF8
额外优化点
- 不要用
-Properties *查询所有属性,只指定你需要的属性即可,可大幅提升查询效率 - 字符串裁剪后加
.Trim()方法,自动清除首尾不可见的空白、制表符等异常字符 - 读写文件时指定
-Encoding UTF8避免编码问题导致的乱码或异常字符
内容的提问来源于stack exchange,提问作者Ursa201
相关产品推荐
相关产品推荐

