找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 1161|回复: 2

[文件操作] BAT能不能查找多个Excel表格文件里的关键词?

[复制链接]
发表于 2026-6-21 20:58:35 | 显示全部楼层 |阅读模式
如何用BAT自动模糊查找多个Excel表格文件存在的指定的关键词?并输出该关键词所在哪个文件多少行里?
发表于 2026-6-22 15:43:53 | 显示全部楼层
试试ai吧,很强大。





BAT 自身没有读取 Excel 工作簿的命令。对于 .xlsx、.xlsm 等文件,不能直接用 findstr,因为 .xlsx 实际上是压缩后的 XML 文件。

在电脑已经安装 Microsoft Excel 的情况下,较可靠的方法是:

BAT 调用 PowerShell,再通过 Excel COM 接口搜索。

下面是一个完整的单文件 BAT,不会长期生成额外的 .ps1 文件。

可以把多个关键词用英文竖线 | 分隔,例如:

合同|**|付款

下面这个版本会逐个搜索关键词,只要单元格中包含其中任意一个关键词就输出,结果中还会增加“匹配关键词”一列。

代码保持为utf-8的bat文件。
  1. @echo off
  2. chcp 65001 >nul
  3. setlocal

  4. rem 搜索目录:BAT 所在目录
  5. set "SEARCH_DIR=%~dp0"

  6. set /p "SEARCH_KEYWORDS=请输入关键词,多个关键词用英文竖线 | 分隔:"

  7. if not defined SEARCH_KEYWORDS (
  8.     echo 没有输入关键词。
  9.     pause
  10.     exit /b 1
  11. )

  12. set "BAT_SELF=%~f0"

  13. powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^
  14. "$text=[IO.File]::ReadAllText($env:BAT_SELF);" ^
  15. "$mark=':'+'__POWERSHELL__';" ^
  16. "$pos=$text.IndexOf($mark);" ^
  17. "$code=$text.Substring($pos+$mark.Length);" ^
  18. "& ([ScriptBlock]::Create($code))"

  19. echo.
  20. pause
  21. exit /b


  22. :__POWERSHELL__

  23. $ErrorActionPreference = 'Stop'

  24. $folder = $env:SEARCH_DIR
  25. $output = Join-Path $folder 'Excel搜索结果.csv'

  26. $keywords = $env:SEARCH_KEYWORDS -split '\|' |
  27.     ForEach-Object { $_.Trim() } |
  28.     Where-Object { $_ -ne '' } |
  29.     Select-Object -Unique

  30. if (-not $keywords) {
  31.     Write-Host '没有有效关键词。'
  32.     return
  33. }

  34. $results = [System.Collections.Generic.List[object]]::new()
  35. $excel = $null

  36. try {
  37.     $excel = New-Object -ComObject Excel.Application
  38.     $excel.Visible = $false
  39.     $excel.DisplayAlerts = $false

  40.     $files = Get-ChildItem -LiteralPath $folder -Recurse -File |
  41.         Where-Object {
  42.             $_.Extension.ToLower() -in '.xls', '.xlsx', '.xlsm', '.xlsb' -and
  43.             $_.Name -notlike '~$*'
  44.         }

  45.     if (-not $files) {
  46.         Write-Host '没有找到 Excel 文件。'
  47.         return
  48.     }

  49.     foreach ($file in $files) {
  50.         $workbook = $null

  51.         Write-Host "正在搜索:$($file.FullName)"

  52.         try {
  53.             $workbook = $excel.Workbooks.Open(
  54.                 $file.FullName,
  55.                 0,
  56.                 $true
  57.             )

  58.             foreach ($sheet in @($workbook.Worksheets)) {
  59.                 $range = $null

  60.                 try {
  61.                     $range = $sheet.UsedRange

  62.                     foreach ($keyword in $keywords) {
  63.                         $cell = $null

  64.                         try {
  65.                             # -4163:按单元格显示值搜索
  66.                             # 2:部分匹配,即包含关键词
  67.                             # 1:按行搜索
  68.                             $cell = $range.Find(
  69.                                 $keyword,
  70.                                 [Type]::Missing,
  71.                                 -4163,
  72.                                 2,
  73.                                 1,
  74.                                 1,
  75.                                 $false,
  76.                                 $false,
  77.                                 $false
  78.                             )

  79.                             if ($null -ne $cell) {
  80.                                 $seen = [System.Collections.Generic.HashSet[string]]::new()

  81.                                 while ($null -ne $cell) {
  82.                                     $address = $cell.Address()

  83.                                     if (-not $seen.Add($address)) {
  84.                                         break
  85.                                     }

  86.                                     $results.Add([PSCustomObject]@{
  87.                                         匹配关键词 = $keyword
  88.                                         文件       = $file.FullName
  89.                                         工作表     = $sheet.Name
  90.                                         行号       = $cell.Row
  91.                                         列号       = $cell.Column
  92.                                         单元格     = $cell.Address($false, $false)
  93.                                         内容       = [string]$cell.Value2
  94.                                     })

  95.                                     $nextCell = $range.FindNext($cell)

  96.                                     if ($null -ne $cell) {
  97.                                         [void][Runtime.InteropServices.Marshal]::ReleaseComObject($cell)
  98.                                     }

  99.                                     $cell = $nextCell
  100.                                 }
  101.                             }
  102.                         }
  103.                         finally {
  104.                             if ($null -ne $cell) {
  105.                                 [void][Runtime.InteropServices.Marshal]::ReleaseComObject($cell)
  106.                             }
  107.                         }
  108.                     }
  109.                 }
  110.                 finally {
  111.                     if ($null -ne $range) {
  112.                         [void][Runtime.InteropServices.Marshal]::ReleaseComObject($range)
  113.                     }

  114.                     if ($null -ne $sheet) {
  115.                         [void][Runtime.InteropServices.Marshal]::ReleaseComObject($sheet)
  116.                     }
  117.                 }
  118.             }
  119.         }
  120.         catch {
  121.             Write-Warning "无法搜索文件:$($file.FullName)"
  122.             Write-Warning $_.Exception.Message
  123.         }
  124.         finally {
  125.             if ($null -ne $workbook) {
  126.                 $workbook.Close($false)
  127.                 [void][Runtime.InteropServices.Marshal]::ReleaseComObject($workbook)
  128.             }
  129.         }
  130.     }

  131.     if ($results.Count -gt 0) {
  132.         $results |
  133.             Sort-Object 文件, 工作表, 行号, 列号, 匹配关键词 |
  134.             Export-Csv -LiteralPath $output `
  135.                        -NoTypeInformation `
  136.                        -Encoding UTF8

  137.         Write-Host ''
  138.         Write-Host "搜索完成,共找到 $($results.Count) 条匹配结果。"
  139.         Write-Host "结果文件:$output"
  140.     }
  141.     else {
  142.         if (Test-Path -LiteralPath $output) {
  143.             Remove-Item -LiteralPath $output -Force
  144.         }

  145.         Write-Host ''
  146.         Write-Host '没有找到匹配内容。'
  147.     }
  148. }
  149. finally {
  150.     if ($null -ne $excel) {
  151.         $excel.Quit()
  152.         [void][Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
  153.     }

  154.     [GC]::Collect()
  155.     [GC]::WaitForPendingFinalizers()
  156. }
复制代码
发表于 2026-6-22 16:26:44 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-6-23 12:02 编辑

基于以前用过的 bat+jscript 模板修改而成,运行结果会将当前目录中 *.xls 文件(文件类型可在代码第三行中自行增减,预设为 *.xls)包含的指定关键词所在位置(行号)提取输出到 list.txt
指定 '关键词' 在代码第二行中可自定义
test.bat
  1. 2>1/* ::
  2. @echo off &setlocal &set "kw=关键词"
  3. (for %%F in (*.xls) do cscript /nologo /e:jscript "%~f0" "%%~fF" "%kw%")>#.$
  4. sort #.$ /out "list.txt" &type "list.txt" &del /q #.$ &pause&exit/b */
  5. v=WSH.arguments, xls=WSH.createobject('excel.application');
  6. xls.visible=false, xls.displayalerts=false;
  7. wb=xls.workbooks.open(v(0)), ws=wb.sheets(1), ur=ws.usedRange;
  8. cell=ur.find(v(1)), row1=cell.row;
  9. while (1) {
  10.    rs=('  '+cell.row).substr(-3);
  11.    WSH.echo(rs+','+v(1)+','+v(0)), cell=ur.findnext(cell);
  12.    if (!cell || cell.row == row1) break; }
  13. wb.close(), xls.quit(), WSH.quit();
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-7-13 02:11

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表