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

基于服务器名匹配两个Excel并补充指定列的PowerShell实现求助

解决方案

步骤说明

  1. 先读取File_1的完整数据,用Server列作为键,把需要的System、Sub-System V2.0、DRP三个字段存入哈希表,后续匹配时可快速查找对应数据。
  2. 打开File_2,添加对应三个列的表头,再逐行匹配VM名称,填充对应的数据。
  3. 最后保存修改并清理Excel COM对象,避免进程残留。

完整代码

# ---------------------- 读取File_1并构建哈希表 ----------------------
$file1Path = "C:\March 2023 V1-2.xlsx"
$xl = New-Object -ComObject Excel.Application
$xl.Visible = $false # 后台运行,不弹出Excel窗口
$wb1 = $xl.Workbooks.Open($file1Path)
$ws1 = $wb1.Worksheets['Servers']
$usedRange1 = $ws1.UsedRange
$rowCount1 = $usedRange1.Rows.Count

# 构建哈希表:键=Server名称,值=包含目标字段的对象
$serverData = @{}
for ($i=2; $i -le $rowCount1; $i++) { # 从第2行开始,跳过表头
    $serverName = $ws1.Cells.Item($i, 1).Value2 # 第1列是Server
    if (-not [string]::IsNullOrEmpty($serverName)) {
        $serverData[$serverName] = [PSCustomObject]@{
            System = $ws1.Cells.Item($i, 2).Value2 # 第2列是System
            SubSystem = $ws1.Cells.Item($i, 3).Value2 # 第3列是Sub-System V2.0
            DRP = $ws1.Cells.Item($i, 8).Value2 # 第8列是DRP(按File_1实际列顺序调整)
        }
    }
}

$wb1.Close()
$xl.Quit()
# 清理COM对象,避免内存泄漏
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws1) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb1) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl) | Out-Null
Remove-Variable xl, wb1, ws1

# ---------------------- 处理File_2,填充匹配数据 ----------------------
$file2Path = "C:\Raw.xlsx"
$xl2 = New-Object -ComObject Excel.Application
$xl2.Visible = $false
$wb2 = $xl2.Workbooks.Open($file2Path)
$ws2 = $wb2.Worksheets['Sheet1']
$usedRange2 = $ws2.UsedRange
$rowCount2 = $usedRange2.Rows.Count
$currentColCount = $usedRange2.Columns.Count

# 添加新列的表头(接在原有列之后)
$ws2.Cells.Item(1, $currentColCount + 1).Value2 = "System"
$ws2.Cells.Item(1, $currentColCount + 2).Value2 = "Sub-System V2.0"
$ws2.Cells.Item(1, $currentColCount + 3).Value2 = "DRP"

# 遍历File_2的每一行(从第2行开始)
for ($i=2; $i -le $rowCount2; $i++) {
    $vmName = $ws2.Cells.Item($i, 1).Value2 # 第1列是VM
    if ($serverData.ContainsKey($vmName)) {
        # 填充对应列的数据
        $ws2.Cells.Item($i, $currentColCount + 1).Value2 = $serverData[$vmName].System
        $ws2.Cells.Item($i, $currentColCount + 2).Value2 = $serverData[$vmName].SubSystem
        $ws2.Cells.Item($i, $currentColCount + 3).Value2 = $serverData[$vmName].DRP
    }
}

# 保存修改并关闭
$wb2.Save()
$wb2.Close()
$xl2.Quit()
# 清理COM对象
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws2) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb2) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl2) | Out-Null
Remove-Variable xl2, wb2, ws2

Write-Host "处理完成,结果已保存到 $file2Path"

关键注意点

  • 列索引需对应:要根据实际Excel的列顺序调整代码中的列号(比如示例中DRP是第8列,需和你的File_1列位置一致)。
  • 哈希表优势:相比嵌套循环,哈希表的查找效率更高,数据量大时更明显。
  • COM对象清理:必须手动释放Excel相关的COM对象,否则会有Excel进程残留占用系统资源。

内容的提问来源于stack exchange,提问作者snehasish nandy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:33:14