[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

请问大神 如何写一个bat

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

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

我希望 同时进行

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

注:这些txt文档都是 UTF-8 编码的

  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.     [system.collections.Arraylist] $result=@();
  15. $content=[io.file]::ReadAllLines($file);
  16. foreach($line in $content)
  17. {
  18. foreach($elem in $arrKeyList)
  19. {
  20. $line=$line -replace $elem[0],$elem[1];
  21. }
  22. [void] $result.Add($line);
  23. }
  24. [io.file]::WriteAllLines($file,$result);#输出结果
  25. }
  26. #自检
  27. if(!(test-path $SrcDir)) {"目录不存在: `"$SrcDir`"";pause;exit}
  28. if(!(test-path $ListFile)) {"文件不存在: `"$ListFile`"";pause;exit}
  29. $time=Get-Date;
  30. cd $SrcDir;
  31. $Files=dir *.txt -r  -Exclude $ListFile;#扫描文件
  32. [system.collections.Arraylist] $arrKeyList=@();
  33. $KeyList=[io.file]::ReadAllLines($ListFile);#读取列表文件
  34. foreach($line in $KeyList){[void] $arrKeyList.Add($line -split "`t");}
  35. #创建多线程
  36. $RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, $THREADS);
  37. $RunspacePool.Open();
  38. $Jobs = @();
  39. foreach($file in $Files){
  40.     $Job = [powershell]::Create().AddScript($ScriptBlock).AddArgument($file).AddArgument($arrKeyList);
  41.     $Job.RunspacePool = $RunspacePool;
  42.     $Jobs+=New-Object PSObject -Property @{
  43.         Pipe=$Job;
  44.         Result=$Job.BeginInvoke();
  45.     }
  46. }
  47. #等待所在线程结束
  48. $count=$Files.Count;
  49. do{
  50. $completed=0;
  51. cls;
  52. foreach($job in $Jobs)
  53. {
  54. if($job.Result.IsCompleted){$job.Pipe.EndInvoke($job.Result); $completed+=1;}
  55. }
  56. $t="{0:0.00}" -f ((Get-Date)-$time).TotalSeconds
  57. "进度: $completed/$count 已用时:$($t) 秒"
  58. start-sleep 1
  59. }while($completed -lt $count)
  60. pause
复制代码
1

评分人数

QQ 33892006

TOP

本帖最后由 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

评分人数

    • 523066680: 原来论坛支持插入SVG技术 + 1

TOP

  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放一起使用。
目的,学习批处理

TOP

返回列表