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

如何将多台服务器的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:45:33