如何将多台服务器的PowerShell输出合并至单个CSV文件
解决方案:批量收集ADSync服务器运行历史并合并输出
没问题,完全可以实现你的需求,下面分点解决你的疑问并提供完整的PowerShell脚本:
关键问题解答
1. 在哪里定义服务器名称?
直接在脚本开头用数组存储所有需要查询的ADSync服务器名称,示例:
# 替换为你的实际服务器列表 $servers = @("ADSyncServer01", "ADSyncServer02", "ADSyncServer03")
2. 如何在每条输出中显示服务器名称?
在Select-Object中添加自定义属性ServerName,将当前执行的服务器名注入到每条结果里,确保后续能区分不同服务器的数据。
3. 如何合并输出得到单个结果?
通过循环遍历服务器列表,使用Invoke-Command远程执行查询逻辑,将所有服务器的结果统一收集到一个变量中,最后导出为CSV或发送邮件。
4. 能否合并到单个CSV或直接发送邮箱?
两者都支持:
- 合并到CSV:用
Export-Csv将收集到的所有结果导出为单个文件 - 发送邮箱:用
Send-MailMessage将CSV作为附件发送,也可以将结果转为HTML嵌入邮件正文
完整脚本示例
# 1. 定义目标服务器列表 $servers = @("ADSyncServer01", "ADSyncServer02") # 2. 初始化变量存储所有结果 $allResults = @() # 3. 遍历服务器执行查询 foreach ($server in $servers) { Write-Host "正在查询服务器: $server" $serverResults = Invoke-Command -ComputerName $server -ScriptBlock { # Delta Import 历史 Get-ADSyncToolsRunHistory | Where-Object {$_.RunProfileName -match "Delta Import"} | Select-Object -Index 0,1 | Select-Object @{Name='ServerName'; Expression={$using:server}}, StartDate, EndDate, ConnectorName, RunProfileName, Result # Delta Synchronization 历史 Get-ADSyncToolsRunHistory | Where-Object {$_.RunProfileName -match "Delta Synchronization"} | Select-Object -Index 0,1 | Select-Object @{Name='ServerName'; Expression={$using:server}}, StartDate, EndDate, ConnectorName, RunProfileName, Result # Full Import 历史 Get-ADSyncToolsRunStepHistory | Where-Object {$_.RunProfileName -match "Full Import"} | Select-Object -Index 0,1 | Select-Object @{Name='ServerName'; Expression={$using:server}}, StartDate, EndDate, ConnectorName, RunProfileName, @{Name='Result'; Expression={$_.StepResult}} # Full Synchronization 历史 Get-ADSyncToolsRunStepHistory | Where-Object {$_.RunProfileName -match "Full Synchronization"} | Select-Object -Index 0,1 | Select-Object @{Name='ServerName'; Expression={$using:server}}, StartDate, EndDate, ConnectorName, RunProfileName, @{Name='Result'; Expression={$_.StepResult}} } # 将当前服务器结果添加到总结果 $allResults += $serverResults } # 4. 导出为单个CSV文件 $outputPath = "C:\Reports\ADSync_Run_History.csv" $allResults | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8 Write-Host "报告已导出到: $outputPath" # 5. 可选:发送邮件(替换为你的邮箱配置) $mailParams = @{ From = "reports@yourdomain.com" To = "your.email@yourdomain.com" Subject = "ADSync服务器运行历史报告" Body = "附件为所有ADSync服务器的最新运行历史报告" SmtpServer = "smtp.yourdomain.com" Attachments = $outputPath } Send-MailMessage @mailParams Write-Host "报告已发送到指定邮箱"
注意事项
- 确保执行脚本的账号拥有所有目标服务器的管理员权限,且目标服务器已开启PowerShell远程(执行
Enable-PSRemoting -Force开启) - 原脚本中的
Format-Table已替换为Select-Object,因为Format-Table会破坏原始对象结构,无法用于后续的合并和导出 - 如果不需要远程执行(比如在管理服务器本地运行),可以去掉
Invoke-Command部分,直接在本地执行查询逻辑
内容的提问来源于stack exchange,提问作者hacrks
相关产品推荐
相关产品推荐

