VB脚本格式化AD数据问题:多属性列错位修正需求
解决AD计算机属性导出与CSV转换错位问题
第一步:确保批处理导出的文本格式正确
先确认批处理命令导出的属性用制表符分隔(dsget默认行为),正确命令如下:
dsquery * domainroot -filter "(objectCategory=computer)" -attr Name distinguishedName operatingSystem operatingSystemVersion whenChanged whenCreated > fullq.txt
该命令会导出所有计算机对象的指定属性,属性间用制表符分隔,避免因空格导致字段错位。
第二步:修正VB脚本实现正确转换
以下是修正后的VB脚本,可解决字段错位问题,同时将distinguishedName中的逗号替换为/:
Dim objFSO, objInputFile, objOutputFile Dim strLine, arrFields, strDistinguishedName ' 创建文件系统对象 Set objFSO = CreateObject("Scripting.FileSystemObject") ' 打开输入文件和输出CSV文件 Set objInputFile = objFSO.OpenTextFile("fullq.txt", 1) ' 1=只读模式 Set objOutputFile = objFSO.CreateTextFile("computers.csv", True) ' True=覆盖现有文件 ' 写入CSV表头 objOutputFile.WriteLine "Name,distinguishedName,operatingSystem,operatingSystemVersion,whenChanged,whenCreated" ' 逐行读取输入文件 Do Until objInputFile.AtEndOfStream strLine = objInputFile.ReadLine ' 跳过空行和表头行 If Trim(strLine) <> "" And Left(strLine, 4) <> "Name" Then ' 按制表符分割字段(核心修正:避免空格分割导致的错位) arrFields = Split(strLine, vbTab) ' 替换distinguishedName中的逗号为/ If UBound(arrFields) >= 1 Then strDistinguishedName = Replace(arrFields(1), ",", "/") Else strDistinguishedName = "" End If ' 按CSV格式写入字段,用双引号包裹防止格式混乱 objOutputFile.WriteLine """" & arrFields(0) & """,""" & strDistinguishedName & """,""" & _ arrFields(2) & """,""" & arrFields(3) & """,""" & arrFields(4) & """,""" & arrFields(5) & """" End If Loop ' 关闭文件 objInputFile.Close objOutputFile.Close Set objFSO = Nothing WScript.Echo "转换完成,已生成computers.csv"
关键修正说明
- 按制表符分割字段:原脚本错误使用空格分割,而
distinguishedName和operatingSystem本身包含空格,会导致字段错位。改用vbTab分割,匹配dsquery导出的原生分隔符,确保属性对应正确列。 - 替换逗号为斜杠:通过
Replace函数处理distinguishedName中的逗号,避免CSV将其识别为列分隔符。 - 字段加双引号:所有字段用双引号包裹,防止空格或特殊字符破坏CSV格式。
使用方法
- 运行批处理命令生成
fullq.txt。 - 将上述VB脚本保存为
ConvertToCSV.vbs。 - 双击运行脚本,生成
computers.csv文件。
内容的提问来源于stack exchange,提问作者Josh123
相关产品推荐
相关产品推荐

