如何让PowerShell将AD查询错误信息导出至CSV文件?
修复PowerShell脚本:将AD中不存在的计算机信息写入CSV
问题根源
你的脚本存在两个核心问题:
- 自定义对象创建语法错误:将
[PSCustomObject]与哈希表分开写,导致$NoComputer被初始化为空对象,后续哈希表未关联到该对象,最终导出时属性与CSV列不匹配,触发错误。 - AD查询效率冗余:使用
Properties *加载AD计算机的所有属性,完全没必要,仅需加载需要的o(对应Division)和CanonicalName即可。
修正方案
- 修正自定义对象创建语法:将哈希表直接紧跟在
[PSCustomObject]后,确保对象被正确初始化。 - 优化AD查询逻辑:指定所需属性,减少资源消耗;直接用查询结果判断对象是否存在,替代低效的计数判断。
- 统一收集结果后导出:先将所有结果(存在/不存在的计算机)存入数组,最后一次性导出CSV,避免多次追加的IO开销与属性匹配问题。
修正后的完整脚本
$ComputerList = Get-Content "File Path" $Date = Get-Date -Format dd-MM-yyyy $Results = @() # 初始化数组存储所有结果 foreach ($Computer in $ComputerList) { # 查询AD计算机,仅加载需要的属性 $adComputer = Get-ADComputer -Identity $Computer -Properties o, CanonicalName -ErrorAction SilentlyContinue if ($adComputer) { # 处理存在的计算机,构造对应对象 $resultObj = [PSCustomObject]@{ Name = $adComputer.Name Division = [string]$adComputer.o CanonicalName = $adComputer.CanonicalName } } else { # 处理不存在的计算机,标记错误信息 $resultObj = [PSCustomObject]@{ Name = $Computer Division = "Object Not Found" CanonicalName = "" # 用空字符串替代空格,更符合CSV规范 } } $Results += $resultObj # 将对象加入结果数组 } # 一次性导出所有结果到CSV $Results | Export-Csv "File Path" -NoTypeInformation
额外说明
- 用
$adComputer直接判断对象是否存在,比@(...).Count更高效,因为Get-ADComputer找到对象时返回实例,找不到返回$null。 - 不存在的计算机的
CanonicalName使用空字符串,避免不必要的空格字符,符合CSV空值规范。 - 统一收集结果后导出,彻底解决了循环追加时的属性匹配问题,同时提升脚本执行效率。
内容的提问来源于stack exchange,提问作者RustyAndroid
相关产品推荐
相关产品推荐

