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

[文本处理] 批量替换UTF-8编码文档的批处理求教

[复制链接]
发表于 2019-1-4 17:10:33 | 显示全部楼层 |阅读模式
请问大神 如何写一个bat

在一个文件夹下(包括子文件夹)

所有的txt文档的内容里 批量替换汉字 例

我希望 同时进行

一  替换成  三
男  替换成  女
山  替换成  水
我  替换成  你
(等等 有很多字)

注:这些txt文档都是 UTF-8 编码的
发表于 2019-1-4 17:59:42 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. del /q test*.ini>nul 2>nul
  3. md 已完成>nul 2>nul
  4. md 原文件>nul 2>nul
  5. echo.
  6. echo 流程:先转码,后替换。保留原文件。可随时停止。
  7. pause>nul
  8. for /f "delims=*" %%g in ('dir /b/on *.txt') do (
  9.     iconv -c -f utf-8 -t gb2312 "%%g" test.ini
  10.   for /f "delims=" %%c in ('type "test.ini"') do (
  11.     set "foo=%%c"
  12.     set foo=!foo:原来的=替换后的!
  13.     set foo=!foo:原来的=替换后的!
  14.     echo 如上多次重复并根据需要修改
  15.     echo foo
  16.    )>>test1.ini
  17.    move /y test1.ini 已完成\%%g>nul 2>nul
  18.    move /y "%%g" 原文件\%%g>nul 2>nul
  19.    del /q test*.ini
  20.     )
  21. echo  全部完成
  22. pause
复制代码
未测试,注意保护原文件。和txt放一起使用。
发表于 2019-1-4 19:53:05 | 显示全部楼层
本帖最后由 ivor 于 2019-1-4 20:27 编辑

  1. dir *.txt -Recurse -File| %{((gc $_ -Encoding UTF8 -Raw) `
  2. -Replace "一","三" `
  3. -Replace "男","女"
  4. )| Set-Content -Path $_ -Ver -Encoding UTF8}
复制代码
替换关键字需要手动添加,一个关键字一行例如
-Replace "一","三" `

评分

参与人数 1技术 +1 收起 理由
523066680 + 1 原来论坛支持插入SVG

查看全部评分

发表于 2019-1-4 22:10:03 | 显示全部楼层
  1. <# :********注释区**********
  2. @echo off
  3. more +7 "%~f0" >"%~n0.ps1"
  4. powershell -Mta -NoLogo -NoProfile -ExecutionPolicy bypass -File "%~n0.ps1"
  5. del /f /q "%~n0.ps1"
  6. ********注释区**********#>

  7. #************用户设置区**************
  8. $THREADS=10;#最大线程数
  9. $SrcDir=$PSScriptRoot;#源目录(示例为脚本目录)
  10. $ListFile='keylist.txt';#关键字列表文件,UTF8编码(示例与脚本同目录,否则当用全路径)
  11. #************************************

  12. $ScriptBlock={
  13.     Param($file,$arrKeyList)
  14.        
  15.     [system.collections.Arraylist] $result=@();
  16.         $content=[io.file]::ReadAllLines($file);
  17.         foreach($line in $content)
  18.         {
  19.                 foreach($elem in $arrKeyList)
  20.                 {
  21.                         $line=$line -replace $elem[0],$elem[1];
  22.                 }
  23.                 [void] $result.Add($line);
  24.         }
  25.         [io.file]::WriteAllLines($file,$result);#输出结果
  26. }

  27. #自检
  28. if(!(test-path $SrcDir)) {"目录不存在: `"$SrcDir`"";pause;exit}
  29. if(!(test-path $ListFile)) {"文件不存在: `"$ListFile`"";pause;exit}

  30. $time=Get-Date;
  31. cd $SrcDir;
  32. $Files=dir *.txt -r  -Exclude $ListFile;#扫描文件
  33. [system.collections.Arraylist] $arrKeyList=@();
  34. $KeyList=[io.file]::ReadAllLines($ListFile);#读取列表文件
  35. foreach($line in $KeyList){[void] $arrKeyList.Add($line -split "`t");}

  36. #创建多线程
  37. $RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, $THREADS);
  38. $RunspacePool.Open();
  39. $Jobs = @();

  40. foreach($file in $Files){
  41.     $Job = [powershell]::Create().AddScript($ScriptBlock).AddArgument($file).AddArgument($arrKeyList);
  42.     $Job.RunspacePool = $RunspacePool;
  43.     $Jobs+=New-Object PSObject -Property @{
  44.         Pipe=$Job;
  45.         Result=$Job.BeginInvoke();
  46.     }
  47. }

  48. #等待所在线程结束
  49. $count=$Files.Count;
  50. do{
  51.         $completed=0;
  52.         cls;
  53.         foreach($job in $Jobs)
  54.         {
  55.                 if($job.Result.IsCompleted){$job.Pipe.EndInvoke($job.Result); $completed+=1;}
  56.         }

  57.         $t="{0:0.00}" -f ((Get-Date)-$time).TotalSeconds
  58.         "进度: $completed/$count        已用时:$($t) 秒"
  59.         start-sleep 1
  60. }while($completed -lt $count)

  61. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
523066680 + 1 多线程都用上了

查看全部评分

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

本版积分规则

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

GMT+8, 2026-3-18 22:12 , Processed in 0.017867 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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