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

[文本处理] 文本批量替换字符的批处理求助

各位大神好:
有一批文本内容格式如下;RCP格式可以记事本打开;判断文件名是否包含04T字符,不包含04T的文件将C0_E0后面的1,0,0或2,0,0替换为3,0,1
SMD-Product,C:\AV03-2322-1\Data\RecipeFile\ChmRcpData\R0001\AD IMPROVE-AB,1:C+W+M+C,1,1,0.7t,2023/07/24 18:02:37,C2,NotUse,C2,NotUse,LotClean,NotUse,Clean Cycle,NotUse,,C:\AV03-2322-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,1,0,0,C:\AV03-2322-1\Data\RecipeFile\PtnRcpData\S12100_P02_C0_E0,2,0,0,S3 or S4,,
,,,,,,,,,,,,

回复 21# haichuan5121
根据24楼代码进行完善,满足21楼2个附加条件:
1.非法输入提示重新输入;
2.只有一组C0-E0不执行操作;
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :a
  4. set /p n=Please Input a number:
  5. set x1=C0_E0,1,0,0
  6. set x2=C0_E0,2,0,0
  7. set x3=C0_E0,3,0,1
  8. set a=1
  9. for /l %%i in (1,1,3) do (
  10.     for /l %%j in (1,1,3) do (
  11.         set m=%%i%%j
  12.         if !n! equ !m! (
  13.             set a=
  14.             set a1=!x%%i!
  15.             set a2=!x%%j!
  16.         )
  17.     )
  18. )
  19. if defined a (
  20.     echo,Input error!
  21.     goto :a
  22. )
  23. set Groups="C0_E0,1,0,0" "C0_E0,2,0,0" "C0_E0,3,0,1"
  24. set Sub=`
  25. for /f "delims=" %%i in ('findstr /imr "C0_E0,.*C0_E0," *.RCP^|findstr /iv "04T"') do (
  26.     (for /f "delims=" %%j in ('type "%%i"') do (
  27.         set "str=%%j"
  28.         for %%k in (%Groups%) do set "str=!str:%%~k=%Sub%!"
  29.         for /f "tokens=1,2* delims=%Sub%" %%a in ("!str!") do (
  30.             if not "%%c"=="" (
  31.                 echo,%%a!a1!%%b!a2!%%c
  32.             ) else (
  33.                 echo,%%j
  34.             )
  35.         )
  36.     ))>"New-%%i"
  37. )
  38. pause
复制代码

TOP

回复 31# WHY


    新文本更改后缀会不能识别,改成前缀比较好,替换源文件用这个 fso.OpenTextFile(f & ".RCP", 2, True).Write s为甚报错 没有指定Input a Number:22
C:\Users\1111\Desktop\PI\PTN测试新.bat(36, 9) Microsoft JScript 运行时错
误: 'True' 未定义

请按任意键继续. . .

TOP

回复 32# WHY
实际上代码中延迟变量开关位置设置有问题,不应当放在循环内,把setlocal enabledelayedexpansion移到@echo off下一行,就不会出现报错的问题。谢谢提醒!

TOP

回复 30# qixiaobin0715

可以在 goto :a 的上一行插入 endlocal

TOP

本来不想再在这个帖子浪费时间,想想还是贴出来,其他人有可能会参考一下下。
  1. @if(0)==(0) echo off
  2. for %%i in (11 12 13 21 22 23 31 32 33) do set _%%i=1
  3. :Loop
  4. set /p "Input=Input a Number:"
  5. setlocal enabledelayedexpansion
  6. if not defined _!Input! (
  7.     endlocal
  8.     echo;Input Error
  9.     goto :Loop
  10. ) else (
  11.     endlocal
  12.     dir /b /a-d *.rcp | findstr /i /v "04T" | cscript -nologo -e:jscript "%~f0" "%Input%"
  13. )
  14. pause & exit
  15. @end
  16. var arg = WSH.Arguments(0);
  17. var arr = ['C0_E0,1,0,0', 'C0_E0,2,0,0', 'C0_E0,3,0,1'];
  18. var reg = new RegExp('C0_E0,[123],0,[01]', 'ig');
  19. var fso = new ActiveXObject('Scripting.FileSystemObject');
  20. var replacement = function(s0) {
  21.     var i = arg.substr(n, 1);
  22.     n += 1;
  23.     return n<=2 ? arr[i-1] : s0;  //replace only 2 times
  24. }
  25. while (!WSH.StdIn.AtEndOfStream) {
  26.     var n = 0;
  27.     var f = WSH.StdIn.ReadLine();
  28.     var objFile = fso.OpenTextFile(f, 1);
  29.     var s = objFile.ReadAll();
  30.     objFile.Close();
  31.     if (s.split(reg).length > 2) {
  32.         s = s.replace(reg, replacement);
  33.         fso.OpenTextFile(f + '.Log', 2, 1).Write(s);
  34.     }
  35. }
复制代码

TOP

回复 29# WHY

是要在第2、3行加上一行endlocal,是吗?

TOP

回复 28# qixiaobin0715


    如果提示输入错误次数超过32次,可能会报语法错误。因为变量延迟递归层数限制在32以内。
当然这是从批处理语法上说的,实际中没人会一直输入错误。

TOP

回复 24# qixiaobin0715
又仔细检查了24楼代码,是有点问题,影响不大,只是在文本文件中压根不存在"C0_E0,1,0,0" "C0_E0,2,0,0" "C0_E0,3,0,1"这3个字符串时,会生成与源文件内容相同的新文件而不会被后面的del命令删除。分别将代码第34、38行修改如下:
  1. if not "%%c"=="" set a=1
  2. if not defined a del "New-%%i"
复制代码

TOP

回复 26# haichuan5121
不要纠结我写的这个了,没仔细检查,可能是哪个地方有问题,楼上有能用的就好。

TOP

回复 24# qixiaobin0715


    文本验证文本没有更新也没生成新的文本,源文件也没有变化没看出来问题在哪儿

TOP

  1. <# :
  2. @echo off
  3. PowerShell ". ([ScriptBlock]::Create((gc -Literal '%~f0') -join \"`r`n\")) '%~dp0'"
  4. pause & exit
  5. #>
  6. While (($myInput = Read-Host 'Input a Number') -notMatch '^[123][123]$') {
  7.     echo 'Input Error!';
  8. }
  9. $HashTab = @{'1'='C0_E0,1,0,0,'; '2'='C0_E0,2,0,0,'; '3'='C0_E0,3,0,1,'}
  10. $reg     =[regex]'(?i)C0_E0,[123],0,[01],';
  11. $replace = {
  12.     $key = $myInput.SubString($global:n, 1);
  13.     $global:n += 1;
  14.     $HashTab[$key];
  15. }
  16. forEach ($file In (dir -Literal $args[0] -Filter *.rcp)) {
  17.     If ($file -is [IO.FileInfo] -and $file.BaseName -notMatch '04T') {
  18.         $global:n = 0;
  19.         $s = (gc -Literal $file.FullName -ReadCount 0) -join "`r`n";
  20.         If ($reg.Matches($s).Count -gt 1) {
  21.             $s = $reg.Replace($s, $replace, 2);   #Replace Only 2 Times
  22.             sc -Literal $file.FullName -Value $s;
  23.         }
  24.     }
  25. }
复制代码

TOP

1.非法输入提示重新输入,返回开始输入界面;
2.判断不符合条件不操作,其一是比较繁琐,其二可能效率会受到影响;不如先操作后判断,不符合条件时删除生成的文件;
  1. @echo off
  2. :a
  3. set /p n=Please Input No. :
  4. setlocal enabledelayedexpansion
  5. set x1=C0_E0,1,0,0
  6. set x2=C0_E0,2,0,0
  7. set x3=C0_E0,3,0,1
  8. set a=1
  9. for /l %%i in (1,1,3) do (
  10.     for /l %%j in (1,1,3) do (
  11.         set m=%%i%%j
  12.         if !n! equ !m! (
  13.             set a=
  14.             set a1=!x%%i!
  15.             set a2=!x%%j!
  16.         )
  17.     )
  18. )
  19. if defined a (
  20. echo,Please Input again
  21. goto :a
  22. )
  23. set Groups="C0_E0,1,0,0" "C0_E0,2,0,0" "C0_E0,3,0,1"
  24. set Sub=`
  25. for /f "delims=" %%i in ('dir /b /a-d *.RCP^|findstr /v "04T"') do (
  26.     (for /f "delims=" %%j in ('type "%%i"') do (
  27.         set "str=%%j"
  28.         for %%k in (%Groups%) do set "str=!str:%%~k=%Sub%!"
  29.         if "!str!"=="%%j" (
  30.             echo,%%j
  31.         ) else (
  32.             for /f "tokens=1,2* delims=%Sub%" %%a in ("!str!") do (
  33.                 echo,%%a!a1!%%b!a2!%%c
  34.                 if "%%c"=="" set a=1
  35.             )
  36.         )
  37.     ))>"New-%%i"
  38. if defined a del "New-%%i"
  39. )
  40. pause
复制代码

TOP

回复 19# qixiaobin0715


   大佬说得对,有时候没必要考虑这个感叹号,但是我想,一是楼主提供的文本只是部分;二是主要想多写写,折腾...
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-8-15 15:46 编辑

回复 20# aloha20200628

给一个调用 powershell 低版本也能可靠运行的代码...
命令行的参数组合用法如同20楼说明
  1. @echo off &setlocal &if "%~2"=="" exit/b
  2. if "%~1"=="3" (set "v1=_C0_E0,3,0,1,") else (set "v1=_C0_E0,%~1,0,0,")
  3. if "%~2"=="3" (set "v2=_C0_E0,3,0,1,") else (set "v2=_C0_E0,%~2,0,0,")
  4. powershell "dir *.rcp -exclude '*04T*'|%%{ $s=(gc -raw $_.name); $p=($s -replace '_C0_E0,\d,0,\d,', '◆').split('◆'); $s=$p[0]+'%v1%'+$p[1]+'%v2%'+$p[2]; sc ($_.basename+'.new.rcp') $s.trim() }"
  5. endlocal&pause&exit/b
复制代码

TOP

返回列表