标题: [文本处理] 批量替换UTF-8编码文档的批处理求教 [打印本页]
作者: yx03040860 时间: 2019-1-4 17:10 标题: 批量替换UTF-8编码文档的批处理求教
请问大神 如何写一个bat
在一个文件夹下(包括子文件夹)
所有的txt文档的内容里 批量替换汉字 例
我希望 同时进行
一 替换成 三
男 替换成 女
山 替换成 水
我 替换成 你
(等等 有很多字)
注:这些txt文档都是 UTF-8 编码的
作者: hlzj88 时间: 2019-1-4 17:59
- @echo off&setlocal enabledelayedexpansion
- del /q test*.ini>nul 2>nul
- md 已完成>nul 2>nul
- md 原文件>nul 2>nul
- echo.
- echo 流程:先转码,后替换。保留原文件。可随时停止。
- pause>nul
- for /f "delims=*" %%g in ('dir /b/on *.txt') do (
- iconv -c -f utf-8 -t gb2312 "%%g" test.ini
- for /f "delims=" %%c in ('type "test.ini"') do (
- set "foo=%%c"
- set foo=!foo:原来的=替换后的!
- set foo=!foo:原来的=替换后的!
- echo 如上多次重复并根据需要修改
- echo foo
- )>>test1.ini
- move /y test1.ini 已完成\%%g>nul 2>nul
- move /y "%%g" 原文件\%%g>nul 2>nul
- del /q test*.ini
- )
- echo 全部完成
- pause
复制代码
未测试,注意保护原文件。和txt放一起使用。
作者: ivor 时间: 2019-1-4 19:53
本帖最后由 ivor 于 2019-1-4 20:27 编辑
- dir *.txt -Recurse -File| %{((gc $_ -Encoding UTF8 -Raw) `
- -Replace "一","三" `
- -Replace "男","女"
- )| Set-Content -Path $_ -Ver -Encoding UTF8}
复制代码
替换关键字需要手动添加,一个关键字一行例如
作者: yhcfsr 时间: 2019-1-4 22:10
- <# :********注释区**********
- @echo off
- more +7 "%~f0" >"%~n0.ps1"
- powershell -Mta -NoLogo -NoProfile -ExecutionPolicy bypass -File "%~n0.ps1"
- del /f /q "%~n0.ps1"
- ********注释区**********#>
-
- #************用户设置区**************
- $THREADS=10;#最大线程数
- $SrcDir=$PSScriptRoot;#源目录(示例为脚本目录)
- $ListFile='keylist.txt';#关键字列表文件,UTF8编码(示例与脚本同目录,否则当用全路径)
- #************************************
-
- $ScriptBlock={
- Param($file,$arrKeyList)
-
- [system.collections.Arraylist] $result=@();
- $content=[io.file]::ReadAllLines($file);
- foreach($line in $content)
- {
- foreach($elem in $arrKeyList)
- {
- $line=$line -replace $elem[0],$elem[1];
- }
- [void] $result.Add($line);
- }
- [io.file]::WriteAllLines($file,$result);#输出结果
- }
-
- #自检
- if(!(test-path $SrcDir)) {"目录不存在: `"$SrcDir`"";pause;exit}
- if(!(test-path $ListFile)) {"文件不存在: `"$ListFile`"";pause;exit}
-
- $time=Get-Date;
- cd $SrcDir;
- $Files=dir *.txt -r -Exclude $ListFile;#扫描文件
- [system.collections.Arraylist] $arrKeyList=@();
- $KeyList=[io.file]::ReadAllLines($ListFile);#读取列表文件
- foreach($line in $KeyList){[void] $arrKeyList.Add($line -split "`t");}
-
- #创建多线程
- $RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, $THREADS);
- $RunspacePool.Open();
- $Jobs = @();
-
- foreach($file in $Files){
- $Job = [powershell]::Create().AddScript($ScriptBlock).AddArgument($file).AddArgument($arrKeyList);
- $Job.RunspacePool = $RunspacePool;
- $Jobs+=New-Object PSObject -Property @{
- Pipe=$Job;
- Result=$Job.BeginInvoke();
- }
- }
-
- #等待所在线程结束
- $count=$Files.Count;
- do{
- $completed=0;
- cls;
- foreach($job in $Jobs)
- {
- if($job.Result.IsCompleted){$job.Pipe.EndInvoke($job.Result); $completed+=1;}
- }
-
- $t="{0:0.00}" -f ((Get-Date)-$time).TotalSeconds
- "进度: $completed/$count 已用时:$($t) 秒"
- start-sleep 1
- }while($completed -lt $count)
-
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |