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

PowerShell屏幕输出与CSV输出不一致问题求助

PowerShell脚本CSV输出异常问题解决记录

问题现象

PowerShell脚本出现输出异常:CSV文件仅显示OS为N/A的服务器,但屏幕输出包含所有Windows服务器的OS信息。

初始代码

$servers = Get-Content "ServerList.txt"

$results = foreach ($server in $servers) {
   $result1 = Test-Connection "$server.domain1.com" -Count 1 -Quiet

   if ($result1) {
       $osInfo = Get-WmiObject -ComputerName $server -Class Win32_OperatingSystem -ErrorAction SilentlyContinue
       $ipAddress = (Resolve-DnsName $server -ErrorAction SilentlyContinue | Select-Object -First 1).IPAddress
       $output = [PSCustomObject]@{
           Server = $server
           Domain = "domain1.com"
           Status = "Up"
           OS = if ($osInfo) { ($osInfo.Name -replace '^Microsoft\s+Windows\s+', '') -replace '\|.*$' } else { "N/A" }
           IP = if ($ipAddress) { $ipAddress } else { "N/A" }
       }
       Write-Host "`t${server}: $($output.Status) - $($output.OS) - $($output.IP)"
       $output
   }
   else {
       Write-Host "`t${server}: Down"
   }
}

$results | Sort-Object Domain | Export-Csv "ServerList.csv" -NoTypeInformation 

当时无法定位并修复该问题。

问题解决

添加日志功能与try/catch异常处理后,问题已解决,同时生成的错误日志也便于排查问题。感谢@mclayton的建议。

更新后的代码

$servers = Get-Content "ServerList2.txt"
$logFile = "ServerList2.log"
$csvFile = "ServerList2.csv"

$results = foreach ($server in $servers) {
   Write-Host "`nTesting server: $server"
   $output = [PSCustomObject]@{
       Server = $server
       Domain = "domain1.com"
       Status = "Down"
       OS = "N/A"
       IP = "N/A"
   }

   # Test connection
   $result1 = Test-Connection "$server.domain1.com" -Count 1 -Quiet
   if ($result1) {
       $output.Status = "Up"

       # Resolve DNS name
       try {
           $dnsResult = Resolve-DnsName $server -ErrorAction Stop | Select-Object -First 1
           $output.IP = $dnsResult.IPAddress
       }
       catch {
           Write-Warning "Failed to resolve DNS name for server ${server}: $_"
           Add-Content $logFile "$(Get-Date) - Failed to resolve DNS name for server ${server}: $_"
       }

       # Get OS info
       try {
           $osInfo = Get-WmiObject -ComputerName $server -Class Win32_OperatingSystem -ErrorAction Stop
           $output.OS = ($osInfo.Name -replace '^Microsoft\s+Windows\s+', '') -replace '\|.*$'
       }
       catch {
           Write-Warning "Failed to get OS info for server ${server}: $_"
           Add-Content $logFile "$(Get-Date) - Failed to get OS info for server ${server}: $_"
       }

       Write-Host "`t$($output.Server): $($output.Status) - $($output.OS) - $($output.IP)"
   }
   else {
       Write-Host "`t$($output.Server): $($output.Status)"
   }

   $output
}

$results | Export-Csv $csvFile -NoTypeInformation -Encoding UTF8 -Append -Force -Delimiter ','

Write-Host "`nResults written to $csvFile"

内容的提问来源于stack exchange,提问作者Red Boy33

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:22:08