PowerShell自定义对象导出CSV显示System.Object问题解决
解决PowerShell脚本导出CSV显示System.Object的问题
嘿,我懂你碰到的这个糟心问题——脚本在PowerShell控制台里输出明明正常,可一导出成CSV就全是System.Object。这其实是因为你返回的对象里藏着嵌套的复杂属性,CSV格式只能处理扁平的键值对,没法解析嵌套对象,所以就直接显示对象的类型名了。
我帮你把代码改了改,把解析结果拆成了完全扁平的属性,这样导出CSV就正常了:
function Resolve-IPDNS { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string[]]$IPDNS, [string]$DNSServer = "1.1.1.1" ) Process { foreach ($addrs in $IPDNS ) { # 判断输入是IP还是域名 if ($addrs -as [ipaddress]) { # 反向解析IP $resolveResult = Resolve-DnsName -Name $addrs -Server $DNSServer -Type PTR -ErrorAction SilentlyContinue if ($resolveResult) { # 构造扁平输出对象 [PSCustomObject]@{ InputAddress = $addrs ResolvedName = $resolveResult.NameHost DNSServerUsed = $DNSServer RecordType = "PTR" } } else { # 解析失败时返回明确信息 [PSCustomObject]@{ InputAddress = $addrs ResolvedName = "解析失败" DNSServerUsed = $DNSServer RecordType = "PTR" } } } else { # 正向解析域名 $resolveResult = Resolve-DnsName -Name $addrs -Server $DNSServer -Type A -ErrorAction SilentlyContinue if ($resolveResult) { # 遍历所有A记录(一个域名可能对应多个IP) foreach ($record in $resolveResult) { [PSCustomObject]@{ InputAddress = $addrs ResolvedIP = $record.IPAddress DNSServerUsed = $DNSServer RecordType = "A" } } } else { [PSCustomObject]@{ InputAddress = $addrs ResolvedIP = "解析失败" DNSServerUsed = $DNSServer RecordType = "A" } } } } } }
关键改动说明:
- 不再直接返回
Resolve-DnsName的原始结果(里面有嵌套属性),而是用[PSCustomObject]构造完全扁平的自定义对象,每个属性都是简单字符串/值类型 - 处理了一个域名对应多个IP的情况,会逐条输出每个解析结果
- 增加了解析失败的友好提示,避免输出空值
使用示例:
运行脚本后,用以下命令导出CSV:
Resolve-IPDNS -IPDNS "8.8.8.8","google.com","invalid.example" | Export-Csv -Path "DNS解析结果.csv" -NoTypeInformation -Encoding UTF8
这样导出的CSV里就不会再出现System.Object,而是清晰的解析内容了。
内容的提问来源于stack exchange,提问作者Kamil Procyszyn
相关产品推荐
相关产品推荐

