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

[文本处理] 【已解决】批处理查找并替换字符串

本帖最后由 yearharvest 于 2013-11-8 21:59 编辑

把当前文件夹中指定后缀名的文件中的所有类似\pos(x,y)的字符串(x和y都是数字)替换成\pos(m*x,n*y),m和n也是数字。也就是字符串\pos(x,y)中的x和y乘上一个倍数。能支持各种文件编码

比如说a.txt里
  1. \pos(100,200)\pos(100,200)\pos(100,200)
  2. \pos(100,200)\pos(100,200)
  3. \pos(100,200)
复制代码
x乘1.5,y乘2的话变成
  1. \pos(150,400)\pos(150,400)\pos(150,400)
  2. \pos(150,400)\pos(150,400)
  3. \pos(150,400)
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off
  2. set n=2
  3. for /f "delims=" %%F in ('dir /b /a-d *.ini') do (
  4.     (for /f "usebackq delims=" %%i in ("%%F") do (
  5.          set "str=%%i"
  6.          setlocal enabledelayedexpansion
  7.          if "!str:\pos=(!" neq "%%i" (
  8.             for /f "tokens=1,2 delims=,)" %%a in ("!str:*\pos(=!") do (
  9.                 set /a "i=%%a*n,j=%%b*n" 2>nul&&(
  10.                     for /f %%j in ("\pos(!i!,!j!)") do (
  11.                         set "str=!str:\pos(%%a,%%b)=%%j!"
  12.                     )   
  13.                 )
  14.             )
  15.         )
  16.     for /f "delims=" %%i in ("!str!") do endlocal&echo %%i
  17.     ))>$
  18.     move $ "%%F"
  19. )
  20. pause
复制代码

TOP

本帖最后由 apang 于 2013-10-31 18:43 编辑

纯练习
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. text = fso.OpenTextFile("a.txt").Readall
  3. Set re = New RegExp
  4. re.Pattern = "([\s\S]*?\\pos\()(\d+),(\d+)\)|([\s\S]+)$"
  5. re.IgnoreCase = True
  6. re.Global = True
  7. For Each a In re.Execute(text)
  8.     If a.SubMatches(3) = "" Then
  9.         str = str & a.SubMatches(0) & _
  10.         a.SubMatches(1) * 2 & "," & _
  11.         a.SubMatches(2) * 2 & ")"
  12.     Else str = str & a.SubMatches(3)
  13.     End If
  14. Next
  15. fso.OpenTextFile("b.txt",2,True).Write str
复制代码

TOP

两个方法处理下面这个文件都有问题,用2楼的处理后变成空文件,用3楼的报错“无效的过程调用或参数”,好像是因为编码的原因,然后我把编码转换成UTF-8,但是用2楼和3楼处理后都会乱码,请问这要怎么解决?
还有3楼的有没有办法像2楼可以处理同一后缀名的多个文件?

TOP

回复 4# yearharvest


    附件是unicode编码,第2行改成 text = fso.OpenTextFile("a.txt",1,,-1).Readall

TOP

回复 4# yearharvest
  1. @echo off
  2. set n=2
  3. for /f "delims=" %%F in ('dir /b /a-d *.txt') do (
  4.     (for /f "delims=" %%i in ('type "%%F"^|findstr /n .*') do (
  5.         set "str=%%i"
  6.         setlocal enabledelayedexpansion
  7.         if "!str:\pos=(!" neq "%%i" (
  8.            for /f "tokens=1,2 delims=,)" %%a in ("!str:*\pos(=!") do (
  9.                set /a "i=%%a*n,j=%%b*n" 2>nul&&(
  10.                    for /f %%j in ("\pos(!i!,!j!)") do (
  11.                        set "str=!str:\pos(%%a,%%b)=%%j!"
  12.                    )
  13.                )
  14.            )
  15.         )
  16.           echo;!str:*:=!
  17.           endlocal
  18.      ))>$
  19.           move $ "%%F"
  20. )
  21. pause
复制代码

TOP

回复 5# apang


  编码是UTF-8的话又乱码了

TOP

回复 6# terse


    不支持小数,如果我要乘1.5的话就不行了,不过这是批处理本身不支持小数的原因,有没有其他办法支持小数?

TOP

回复 8# yearharvest
没什么好办法 如你所说 CMD不支持浮点,要么这样,1.5 你当作 15 去乘 然后除以10
1.5*32= 15 *32/10 = 48 这样近似了

TOP

帖子内容很好,学习了。

TOP

回复 8# yearharvest


    论坛搜索浮点数,有现成的代码。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 7# yearharvest


    你的文件夹里到底有几种编码类型的文件需要修改?不说清楚要别人去猜呀?

你如果是真心求助的话,把你最终的需求更新到顶楼,我可以尝试一下,帮你写一段支持utf-8的代码。

TOP

  1. @set @n=0//& dir /b *.txt | cscript.exe -nologo -e:jscript "%~f0" &pause&exit/b
  2. while (!WSH.StdIn.AtEndOfStream) {
  3.     f = WSH.StdIn.ReadLine();
  4.     WSH.StdOut.Write("\r处理:\t"+f);
  5.     WSH.Sleep(300); //Delete this line!
  6.     try {enlarge(f, 1.5, 2.5); WSH.StdOut.Write("\r成功:\n");}
  7.     catch(e) {WSH.StdOut.Write("\r失败:\n");}
  8. }
  9. function enlarge(file, m, n)
  10. {
  11.     var aso, txt;
  12.     aso = new ActiveXObject("ADODB.Stream");
  13.     aso.Mode = 3;
  14.     aso.Type = 2;
  15.     aso.Charset = "cp437";
  16.     aso.Open();
  17.     aso.LoadFromFile(file);
  18.     txt = aso.ReadText(-1);
  19.     if (txt.indexOf('\x00') > -1) {
  20.         aso.Position = 0;
  21.         aso.Charset = "unicode";
  22.         txt = aso.ReadText(-1);
  23.     }
  24.     txt = txt.replace(/\\pos\((\d+),(\d+)(?=\))/g,
  25.         function(s0,s1,s2){return "\\pos(" + s1*m + ',' + s2*n});
  26.     aso.Position = 0;
  27.     aso.WriteText(txt);
  28.     aso.SetEOS();
  29.     aso.SaveToFile(file + ".log", 2);
  30.     aso.Close();
  31.     aso = null;
  32.     return txt;
  33. }
复制代码
1

评分人数

TOP

本帖最后由 terse 于 2013-11-4 15:28 编辑

搞个PS练手
XP系统需安装有POWERSHELL win7自带无需另装
代码第一行 2.89 为设定数 自己修改
路径为 c:\test
对于编码的判断准确与否 没测试 运行请前先备份
  1. $n=2.89
  2. function Get-Encoding ($ph)
  3. {
  4. $ByteStr = Get-Content $Ph -Encoding Byte -TotalCount 3
  5. $BOM = "{0:X}{1:X}{2:X}" -f $ByteStr
  6. if ($BOM -eq "EFBBBF") { "UTF8" }
  7. Else {
  8.        $BOM = "{0:X}{1:X}" -f $ByteStr
  9.        if ($BOM -eq "FFFE") { "Unicode" }
  10.            Elseif ($BOM -eq "FEFF") {"BigEndianUnicode"}
  11.            Else {"Ascii"}
  12.        }
  13. }
  14. get-childitem "c:\te st\*" -include *.txt | ?{
  15. $Encoding = Get-Encoding($_)
  16. (Get-Content $_ | % {
  17.     if ($_ -cmatch '(.+\\pos\()(\d+),(\d+)(.*)') {
  18.        "$($matches[1])$([int]($n * $matches[2])),$([int]($n * $matches[3]))$($matches[4])"
  19.     } else {"$_"}
  20. }) | Set-Content  -Encoding $Encoding $_
  21. }
复制代码

TOP

路径和文件扩展名 统一在前面定义
楼主没回复 浪费脑细胞
  1. $n = 2.89
  2. $Ph = "c:\test"
  3. $Ext = "txt"
  4. function Get-Encoding ($ph)
  5. {
  6. $ByteStr = Get-Content $Ph -Encoding Byte -TotalCount 3
  7. $BOM = "{0:X}{1:X}{2:X}" -f $ByteStr
  8. if ($BOM -eq "EFBBBF") { "UTF8" }
  9. Else {
  10.        $BOM = "{0:X}{1:X}" -f $ByteStr
  11.        if ($BOM -eq "FFFE") { "Unicode" }
  12.            Elseif ($BOM -eq "FEFF") {"BigEndianUnicode"}
  13.            Else {"Ascii"}
  14.        }
  15. }
  16. get-childitem "$Ph\*" -include *.$Ext | ?{
  17. $Encoding = Get-Encoding($_)
  18. (Get-Content $_ | % {
  19.     if ($_ -cmatch '(.+\\pos\()(\d+),(\d+)(.*)') {
  20.        "$($matches[1])$([int]($n * $matches[2])),$([int]($n * $matches[3]))$($matches[4])"
  21.     } else {"$_"}
  22. }) | Set-Content  -Encoding $Encoding $_
  23. }
复制代码

TOP

返回列表