You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让PowerShell将AD查询错误信息导出至CSV文件?

修复PowerShell脚本:将AD中不存在的计算机信息写入CSV

问题根源

你的脚本存在两个核心问题:

  • 自定义对象创建语法错误:将[PSCustomObject]与哈希表分开写,导致$NoComputer被初始化为空对象,后续哈希表未关联到该对象,最终导出时属性与CSV列不匹配,触发错误。
  • AD查询效率冗余:使用Properties *加载AD计算机的所有属性,完全没必要,仅需加载需要的o(对应Division)和CanonicalName即可。

修正方案

  1. 修正自定义对象创建语法:将哈希表直接紧跟在[PSCustomObject]后,确保对象被正确初始化。
  2. 优化AD查询逻辑:指定所需属性,减少资源消耗;直接用查询结果判断对象是否存在,替代低效的计数判断。
  3. 统一收集结果后导出:先将所有结果(存在/不存在的计算机)存入数组,最后一次性导出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:21:05