批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[文件操作] 批处理怎么匹配数组提取数据更新到文件呢?人工复制数组数据很繁琐,还容易出错

比如:
把move-l_format.c里面m_reg_tab数组数据更新到amp.h 中m_reg_tab_l数组;
把move-r_format.c里面m_reg_tab数组数据更新到amp.h 中m_reg_tab_r数组;
把move-c_format.c里面m_reg_tab数组数据更新到amp.h 中m_reg_tab_cen数组;


把move-l_format.c里面m_ram1_tab数组数据更新到amp.h中 eq_tables_ram1_left_movie数组;
把move-r_format.c里面m_ram1_tab数组数据更新到amp.h中 eq_tables_ram1_right_movie数组;
把move-c_format.c里面m_ram1_tab数组数据更新到amp.h中 eq_tables_ram1_cen_movie数组;

把music-l_format.c里面m_ram1_tab数组数据更新到amp.h中 eq_tables_ram1_left_music数组;
把music-r_format.c里面m_ram1_tab数组数据更新到amp.h中 eq_tables_ram1_right_music数组;
把music-c_format.c里面m_ram1_tab数组数据更新到amp.h中 eq_tables_ram1_cen_music数组;

把news-l_format.c里面m_ram1_tab数组数据更新到amp.h中 eq_tables_ram1_left_news数组;
把news-r_format.c里面m_ram1_tab数组数据更新到amp.h中 eq_tables_ram1_right_news数组;
把news-c_format.c里面m_ram1_tab数组数据更新到amp.h中 eq_tables_ram1_cen_news数组;

还有.c文件跟amp.h文件不一定在同一个目录,谢谢解答!

以下是文件下载链接
https://we.tl/t-UTm9Q26blY

test.bat
ansi编码,和amp_.h放到一起运行
  1. #&cls&@cd /d "%~dp0"&powershell -c "Get-Content '%~0' | Out-String | Invoke-Expression" & pause&exit
  2. cls
  3. #映射关系表
  4. $map = @(
  5.     'amp_.h',
  6.     'move-l_format.c -> m_reg_tab -> m_reg_tab_l',
  7.     'move-r_format.c -> m_reg_tab -> m_reg_tab_r',
  8.     'move-c_format.c -> m_reg_tab -> m_reg_tab_cen',
  9.     'move-l_format.c -> m_ram1_tab -> eq_tables_ram1_left_movie',
  10.     'move-r_format.c -> m_ram1_tab -> eq_tables_ram1_right_movie',
  11.     'move-c_format.c -> m_ram1_tab -> eq_tables_ram1_cen_movie',
  12.     'music-l_format.c -> m_ram1_tab -> eq_tables_ram1_left_music',
  13.     'music-r_format.c -> m_ram1_tab -> eq_tables_ram1_right_music',
  14.     'music-c_format.c -> m_ram1_tab -> eq_tables_ram1_cen_music',
  15.     'news-l_format.c -> m_ram1_tab -> eq_tables_ram1_left_news',
  16.     'news-r_format.c -> m_ram1_tab -> eq_tables_ram1_right_news',
  17.     'news-c_format.c -> m_ram1_tab -> eq_tables_ram1_cen_news'
  18. )
  19. #读取源
  20. $src_str = Get-Content $map[0] | Out-String
  21. #循环读取新数据
  22. $map | Select-Object -Skip 1 | foreach {
  23.     $arr = $_ -split '->' | foreach { $_.Trim() }
  24.     Write-Host ('文件 {0} 中 {1} 数组数据更新到文件 {2} 中 {3} 数组' -f $arr[0],$arr[1],$map[0],$arr[2])
  25.     $str = Get-ChildItem $arr[0] -Recurse | Select-Object -First 1 | Get-Content | Out-String
  26.     if($str -match ('(?s){0}\[\]\s*=\s*{{\s*\n(.*?)}};' -f $arr[1])){
  27.         $s1 = $Matches[1]
  28.         $src_str = $src_str -replace ('(?s)(?<={0}\[\]\s*=\s*{{\s*\n)(.*?)(?=}};)' -f $arr[2]),$s1
  29.     }
  30. }
  31. #输出新数据
  32. $src_str | Out-File $map[0] -Encoding Default
  33. Write-Host '更新已完成'
复制代码

TOP

回复 2# went
感谢大佬,验证正确。
发现一个现象,多次运行批处理后.h文件最后都会增加一行空行。

还有对比参数是否更新正确,有点不好对比,还希望帮忙再改下,谢谢!
文件连接https://we.tl/t-OsyP8Sgl6J

把move-l_format.c里面m_reg_tab数组数据更新到amp_move.h 中m_reg_tab_move_l数组;
把move-r_format.c里面m_reg_tab数组数据更新到amp_move.h 中m_reg_tab_move_r数组;
把move-c_format.c里面m_reg_tab数组数据更新到amp_move.h 中m_reg_tab_move_cen数组;

把music-l_format.c里面m_reg_tab数组数据更新到amp_music.h 中m_reg_tab_music_l数组;
把music-r_format.c里面m_reg_tab数组数据更新到amp_music.h 中m_reg_tab_music_r数组;
把music-c_format.c里面m_reg_tab数组数据更新到amp_music.h 中m_reg_tab_music_cen数组;

把news-l_format.c里面m_reg_tab数组数据更新到amp_news.h 中m_reg_tab_news_l数组;
把news-r_format.c里面m_reg_tab数组数据更新到amp_news.h 中m_reg_tab_news_r数组;
把news-c_format.c里面m_reg_tab数组数据更新到amp_news.h 中m_reg_tab_news_cen数组;

把move-l_format.c里面m_ram1_tab数组数据更新到amp_move.h中 eq_tables_ram1_left_move数组;
把move-r_format.c里面m_ram1_tab数组数据更新到amp_move.h中 eq_tables_ram1_right_move数组;
把move-c_format.c里面m_ram1_tab数组数据更新到amp_move.h中 eq_tables_ram1_cen_move数组;

把music-l_format.c里面m_ram1_tab数组数据更新到amp_music.h中 eq_tables_ram1_left_music数组;
把music-r_format.c里面m_ram1_tab数组数据更新到amp_music.h中 eq_tables_ram1_right_music数组;
把music-c_format.c里面m_ram1_tab数组数据更新到amp_music.h中 eq_tables_ram1_cen_music数组;

把news-l_format.c里面m_ram1_tab数组数据更新到amp_news.h中 eq_tables_ram1_left_news数组;
把news-r_format.c里面m_ram1_tab数组数据更新到amp_news.h中 eq_tables_ram1_right_news数组;
把news-c_format.c里面m_ram1_tab数组数据更新到amp_news.h中 eq_tables_ram1_cen_news数组;

TOP

  1. <#*,:&cls
  2. @echo off
  3. cd /d "%~dp0"
  4. powershell -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~f0\" -ReadCount 0 | Out-String)))"
  5. pause
  6. exit /b
  7. #>
  8. $mapTable = @(
  9.   @("move-l_format.c", "m_reg_tab", "amp_move.h", "m_reg_tab_move_l"),
  10.   @("move-r_format.c", "m_reg_tab", "amp_move.h", "m_reg_tab_move_r"),
  11.   @("move-c_format.c", "m_reg_tab", "amp_move.h", "m_reg_tab_move_cen"),
  12.   @("music-l_format.c", "m_reg_tab", "amp_music.h", "m_reg_tab_music_l"),
  13.   @("music-r_format.c", "m_reg_tab", "amp_music.h", "m_reg_tab_music_r"),
  14.   @("music-c_format.c", "m_reg_tab", "amp_music.h", "m_reg_tab_music_cen"),
  15.   @("news-l_format.c", "m_reg_tab", "amp_news.h", "m_reg_tab_news_l"),
  16.   @("news-r_format.c", "m_reg_tab", "amp_news.h", "m_reg_tab_news_r"),
  17.   @("news-c_format.c", "m_reg_tab", "amp_news.h", "m_reg_tab_news_cen"),
  18.   
  19.   @("move-l_format.c", "m_ram1_tab", "amp_move.h", "eq_tables_ram1_left_move"),
  20.   @("move-r_format.c", "m_ram1_tab", "amp_move.h", "eq_tables_ram1_right_move"),
  21.   @("move-c_format.c", "m_ram1_tab", "amp_move.h", "eq_tables_ram1_cen_move"),
  22.   @("music-l_format.c", "m_ram1_tab", "amp_music.h", "eq_tables_ram1_left_music"),
  23.   @("music-r_format.c", "m_ram1_tab", "amp_music.h", "eq_tables_ram1_right_music"),
  24.   @("music-c_format.c", "m_ram1_tab", "amp_music.h", "eq_tables_ram1_cen_music"),
  25.   @("news-l_format.c", "m_ram1_tab", "amp_news.h", "eq_tables_ram1_left_news"),
  26.   @("news-r_format.c", "m_ram1_tab", "amp_news.h", "eq_tables_ram1_right_news"),
  27.   @("news-c_format.c", "m_ram1_tab", "amp_news.h", "eq_tables_ram1_cen_news")
  28. )
  29. $format = '(?si)(?<var>{0}\[\]\s*=\s*)(?<block>(?>/\*.*?\*/|//[^\n]*|(?<open>\{{)|(?<-open>\}})|.)+?(?(open)(?!)))'
  30. $encoding = New-Object System.Text.UTF8Encoding -ArgumentList $false
  31. $files = Get-ChildItem -Recurse | Where-Object { -not $_.PSIsContainer }
  32. foreach ($arr in $mapTable) {
  33.   $srcfile = $files | Where-Object { $_.Name -eq $arr[0] } | Select-Object -First 1
  34.   $dstfile = $files | Where-Object { $_.Name -eq $arr[2] } | Select-Object -First 1
  35.   if ($null -ne $srcfile -and $null -ne $dstfile) {
  36.     $resrc = [regex]($format -f $arr[1])
  37.     $redst = [regex]($format -f $arr[3])
  38.     $txtsrc = [System.IO.File]::ReadAllText($srcfile.FullName, $encoding)
  39.     $txtdst = [System.IO.File]::ReadAllText($dstfile.FullName, $encoding)
  40.     [System.IO.File]::WriteAllText($dstfile.FullName, $redst.Replace($txtdst, {
  41.           param([System.Text.RegularExpressions.Match]$mdst)
  42.           $msrc = $resrc.Match($txtsrc)
  43.           if ($msrc.Success) {
  44.             $mdst.Groups['var'].Value + $msrc.Groups['block'].Value
  45.           } else {
  46.             $mdst.Value
  47.           }
  48.         }), $encoding)
  49.   }
  50. }
复制代码
微信:flashercs
QQ:49908356

TOP

回复 4# flashercs
验证了可以,谢谢大佬
批处理代码量真的好少,如果用C语言实现估计非常麻烦

TOP

返回列表