Board logo

标题: [文本处理] 文本批量替换字符的批处理求助 [打印本页]

作者: haichuan5121    时间: 2024-8-13 11:15     标题: 文本批量替换字符的批处理求助

各位大神好:
有一批文本内容格式如下;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,,
,,,,,,,,,,,,
作者: Batcher    时间: 2024-8-13 13:27

回复 1# haichuan5121


    找个真实的文件,把操作之前、操作之后的两份文件打包上传到网盘,我试试。
作者: haichuan5121    时间: 2024-8-13 14:58

回复 2# Batcher

内部局域网限制上传附件;文本全部内容就是下面字符RCP格式可以记事本打开,其中2,0,0也可能是1,0,0

SMD-Product,C:\A-B-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:\A-B-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,2,0,0,C:\A-B-1\Data\RecipeFile\PtnRcpData\S12100_P02_C0_E0,2,0,0,S3 or S4,,
,,,,,,,,,,,,
变更后是
SMD-Product,C:\A-B-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:\A-B-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,3,0,1,C:\A-B-1\Data\RecipeFile\PtnRcpData\S12100_P02_C0_E0,3,0,1,S3 or S4,,
,,,,,,,,,,,,
作者: qixiaobin0715    时间: 2024-8-13 15:48

没有测试文件,只能这样试试:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.RCP^|findstr /v "04T"') do (
  4.     (for /f "delims=" %%j in ('type "%%i"') do (
  5.         set "str=%%j"
  6.         set "str=!str:C0_E0,1,0,0=C0_E0,3,0,1!"
  7.         set "str=!str:C0_E0,2,0,0=C0_E0,3,0,1!"
  8.         echo,!str!
  9.     ))>New-%%i
  10. )
  11. pause
复制代码

作者: haichuan5121    时间: 2024-8-13 16:43

回复 4# qixiaobin0715

执行结果是这个  ;批处理过程覆盖源文件了

   
C:\Users\admin\Desktop\PI\SP01>(
set "str=SMD-Product,C:\SH03-9322-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:\SH03-9322-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,1,0,0,C:\SH03-9322-1\Data\RecipeFile\PtnRcpData\S12100_P02_C0_E0,2,0,0,S3 or S4,,"  
set "str=!str:C0_E0,1,0,0=C0_E0,3,0,1!"  
set "str=!str:C0_E0,2,0,0=C0_E0,3,0,1!"  
echo,!str!
)
SMD-Product,C:\SH03-9322-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:\SH03-9322-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,3,0,1,C:\SH03-9322-1\Data\RecipeFile\PtnRcpData\S12100_P02_C0_E0,3,0,1,S3 or S4,,

C:\Users\admin\Desktop\PI\SP01>(
set "str=,,,,,,,,,,,,"  
set "str=!str:C0_E0,1,0,0=C0_E0,3,0,1!"  
set "str=!str:C0_E0,2,0,0=C0_E0,3,0,1!"  
echo,!str!
)
,,,,,,,,,,,,
作者: qixiaobin0715    时间: 2024-8-13 17:03

1.复制代码内容时,请点击代码下面的“复制代码”,不要选中复制;
2.最好发一个测试文件上来。
如果还不行,我就放弃吧。
作者: aloha20200628    时间: 2024-8-13 17:44

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

回复 3# haichuan5121

以下批处代码仅处理当前目录下文件名未含 04T 的文本文件,假设其扩展名为 .rcp
其中包含 C0_E0,1,0,0 或者 C0_E0,2,0,0 的字段均被置换为  C0_E0,3,0,1
新文件名=源文件名.new.rcp
  1. @echo off &for /f "delims=" %%F in ('dir /b/a-d *rcp^|findstr /irvc:"04t" ') do (
  2.       powershell "(gc '%%F') -replace 'C0_E0,\d,0,0', 'C0_E0,3,0,1' ">"%%~nF.new%%~xF"
  3. )
  4. pause&exit/b
复制代码
再让ps代劳一步...
  1. @echo off & powershell "dir *.rcp -exclude '*04T*'|%%{((gc $_.name) -replace 'C0_E0,\d,0,0', 'C0_E0,3,0,1')|sc ($_.basename+'.new.rcp')}"
  2. pause&exit/b
复制代码

作者: 77七    时间: 2024-8-13 19:13

  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "delims=" %%i in ('dir /b /a-d *.rcp ^|find /v "04T"') do (
  4. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
  5. if "%%b" equ "" (
  6. echo=
  7. ) else (
  8. set str=%%b
  9. setlocal enabledelayedexpansion
  10. set str=!str:C0_E0,1,0,0=C0_E0,3,0,1!
  11. echo=!str:C0_E0,2,0,0=C0_E0,3,0,1!
  12. endlocal
  13. )
  14. ))>"%%~ni_2%%~xi"
  15. )
  16. pause
复制代码

作者: haichuan5121    时间: 2024-8-14 14:32

回复 4# qixiaobin0715


    可以用了感谢感谢大神
作者: qixiaobin0715    时间: 2024-8-14 14:54

本帖最后由 qixiaobin0715 于 2024-8-14 14:56 编辑

回复 9# haichuan5121
是漏掉了首行?@echo off
作者: haichuan5121    时间: 2024-8-14 15:23

回复 8# 77七


    可以可以 感谢!要把3,0,1变回1.0.0或2.0.0怎么写,能不能根据提示输入后执行;文档两个C0_E0后参数根据需求修改;
比如提示输入12 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为2.0.0
比如提示输入11 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为1.0.0
比如提示输入13 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为3.0.1
作者: haichuan5121    时间: 2024-8-14 15:26

本帖最后由 haichuan5121 于 2024-8-14 15:27 编辑

回复 10# qixiaobin0715


       对的我看执行过程把OFF 改成ON了  
感谢!要把3,0,1变回1.0.0或2.0.0怎么写,C0_E0后面只有这三个组合
能不能根据提示输入后执行;文档两个C0_E0后参数根据需求修改;
比如提示输入12 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为2.0.0
比如提示输入11 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为1.0.0
比如提示输入13 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为3.0.1
比如提示输入21 则内容  第一个3.0.1变更为2.0.0,第二个3.0.1变更为1.0.0
比如提示输入22 则内容  第一个3.0.1变更为2.0.0,第二个3.0.1变更为2.0.0
比如提示输入23 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为3.0.1
作者: qixiaobin0715    时间: 2024-8-14 16:37

回复 12# haichuan5121
替换需要一个字符作为锚点,此字符不能在文本的任何地方出现,这里选为“`”,如果文本中含有此字符,请自行更换:
  1. @echo off
  2. set /p n=Please Input No. :
  3. setlocal enabledelayedexpansion
  4. set x1=C0_E0,1.0.0
  5. set x2=C0_E0,2.0.0
  6. set x3=C0_E0,3.0.1
  7. for /l %%i in (1,1,3) do (
  8.     for /l %%j in (1,1,3) do (
  9.         set m=%%i%%j
  10.         if !n! equ !m! (
  11.             set a1=!x%%i!
  12.             set a2=!x%%j!
  13.         )
  14.     )
  15. )
  16. for /f "delims=" %%i in ('dir /b /a-d *.RCP^|findstr /v "04T"') do (
  17.     (for /f "delims=" %%j in ('type "%%i"') do (
  18.         set "str=%%j"
  19.         set "str=!str:C0_E0,3,0,1=`!"
  20.         if "!str!"=="%%j" (
  21.             echo,%%j
  22.         ) else (
  23.             for /f "tokens=1,2* delims=`" %%a in ("!str!") do (
  24.                 echo,%%a!a1!%%b!a2!%%c
  25.             )
  26.         )
  27.     ))>New-%%i
  28. )
  29. pause
复制代码
这里也是针对顶楼所说的“文件名中不包含04T文件”。
代码未经测试,请注意备份好源文件,以免出现意外。
作者: qixiaobin0715    时间: 2024-8-14 16:55

回复 12# haichuan5121
刚刚注意到,你前面的数字之间是逗号,后面是点号,写代码时我也没注意,前后不统一,请根据文本具体情况自行修改。3.0.1————3,0,1
作者: 77七    时间: 2024-8-14 20:51

回复 11# haichuan5121


   这个和1楼的替换应该是一回事,就是替换 两段C0_E0后数字,可以写个通用脚本,用批处理有点麻烦,用其它脚本或第三方文本工具的正则应该好点。
作者: haichuan5121    时间: 2024-8-14 23:35

回复 13# qixiaobin0715


    链接: https://pan.baidu.com/s/1qRFkQmfK15LHmhN6c7Ub8A?pwd=1122 提取码: 1122 复制这段内容后打开百度网盘手机App,操作更方便哦[url=链接: https://pan.baidu.com/s/1qRFkQmfK15LHmhN6c7Ub8A?pwd=1122 提取码: 1122 复制这段内容后打开百度网盘手机App,操作更方便哦]附件[/url]

附件放网盘了 大神给再研究研究;C0_E0后面只有三种组合1,0,0  ;2,0,0;3,0,1  无论当前是哪个组合需要根据输入设定分别更换第一个CO_E0后面的和第二个C0_E0后面的
例如:我输入 21  结果更新为CO_E0,2,0,0      CO_E0,1,0,0 其余位置不变
:我输入 22  结果更新为CO_E0,2,0,0      CO_E0,2,0,0 其余位置不变
:我输入 23  结果更新为CO_E0,2,0,0      CO_E0,3,0,1其余位置不变
作者: haichuan5121    时间: 2024-8-14 23:52

回复 13# qixiaobin0715
我测试的11 第一组没变化 第二组变成那个特殊符号了  末尾执行结果单独到后面了
SMD-Product,C:\SH03-9322-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:\SH03-9322-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,2,0,0,C:\SH03-9322-1\Data\RecipeFile\PtnRcpData\S12100_P02_$,S3 or S4,,C0_E0,1,0,0C0_E0,1,0,0
,,,,,,,,,,,,
作者: 77七    时间: 2024-8-15 08:47

用字符串替换写了一个,兼顾1楼和11楼。
  1. @echo off
  2. cd /d "%~dp0"
  3. set /p n=input:
  4. set list=0001
  5. for /f "delims=" %%i in ('dir /b /a-d *.rcp ^|find /v "04T"') do (
  6. setlocal
  7. for /f "tokens=1* delims=:" %%a in ('findstr /n "C0_E0,[1-3],0,[0-1].*C0_E0,[1-3],0,[0-1]" ^< "%%i"') do (
  8. set #%%a=1
  9. )
  10. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^< "%%i"') do (
  11. if defined #%%a (
  12. set str=%%b
  13. setlocal enabledelayedexpansion
  14. set str2=!str:*C0_E0,=!
  15. set str2=!str2:~5!
  16. call set str1=%%str:!str2!=%%
  17. for %%x in ("C0_E0,1,0,0" "C0_E0,2,0,0" "C0_E0,3,0,1") do (
  18. call set str1=%%str1:%%~x=C0_E0,!n:~0,1!,0,!list:~%n:~0,1%,1!%%
  19. call set str2=%%str2:%%~x=C0_E0,!n:~1,1!,0,!list:~%n:~1,1%,1!%%
  20. )
  21. echo !str1!!str2!
  22. endlocal
  23. ) else (
  24. echo=%%b
  25. )
  26. )) > "%%~ni_2%%~xi"
  27. endlocal
  28. )
  29. pause
复制代码

作者: qixiaobin0715    时间: 2024-8-15 09:20

本帖最后由 qixiaobin0715 于 2024-8-15 13:10 编辑

回复 17# haichuan5121
1.你在12楼表达的意思与16、17楼有差距;
2.在12楼说“要把3,0,1变回1.0.0或2.0.0怎么写”,而在16楼的示范文本中要替换的内容并不是3,0,1,而是这3种字符串都有,数字之间有时是逗号有时又是点号,相互矛盾;
3.测试时,你可能修改了锚点字符,但修改的也不对,是不是只修改了第19行,而第23行未修改。下面代码锚点字符,使用变量来表达,只需修改第8行。
所以按照你12楼的要求写的代码,你用其它不相符的文本测试,当然会出问题了。
你的要求是不是这样:
  1. @echo off
  2. set /p n=Please Input No. :
  3. setlocal enabledelayedexpansion
  4. set x1=C0_E0,1,0,0
  5. set x2=C0_E0,2,0,0
  6. set x3=C0_E0,3,0,1
  7. set Groups="C0_E0,1,0,0" "C0_E0,2,0,0" "C0_E0,3,0,1"
  8. set Sub=`
  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 a1=!x%%i!
  14.             set a2=!x%%j!
  15.         )
  16.     )
  17. )
  18. for /f "delims=" %%i in ('dir /b /a-d *.RCP^|findstr /v "04T"') do (
  19.     (for /f "delims=" %%j in ('type "%%i"') do (
  20.         set "str=%%j"
  21.         for %%k in (%Groups%) do set "str=!str:%%~k=%Sub%!"
  22.         if "!str!"=="%%j" (
  23.             echo,%%j
  24.         ) else (
  25.             for /f "tokens=1,2* delims=%Sub%" %%a in ("!str!") do (
  26.                 echo,%%a!a1!%%b!a2!%%c
  27.             )
  28.         )
  29.     ))>New-%%i
  30. )
  31. pause
复制代码
代码暂不要修改,等结果正确之后再根据具体情况修改特殊字符。
看到楼上的代码突然想到,如果文本中存在英文感叹号是个棘手的问题,恐怕最少要再增加两对变量延迟开关,还要考虑到底要加在何处才合适。还好提供的文本中不存在这种情况。
作者: aloha20200628    时间: 2024-8-15 09:57

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

回复 16# haichuan5121

一。订正了7楼代码 〉将C0_E0,1,0,0或C0_E0,2,0,0替换为C0_E0,3,0,1
二。根据楼主的新要求再给一个版本如下,存为 test.bat 运行 〉将连续两个C0_E0,3,0,1分别置换为指定参数,其命令行用法:
   test 2,1
   或
   test 2,2
   或
   test 2,3
   ... 等不同参数组合 ...
  1. @echo off &setlocal &if "%~2"=="" exit/b
  2. set "v1=_C0_E0,%~1,0,0,"
  3. if "%~2"=="3" (set "v2=_C0_E0,%~2,0,1,") else (set "v2=_C0_E0,%~2,0,0,")
  4. powershell "dir *.rcp -exclude '*04T*'|%%{ $s=(gc $_.name); [regex]$p='_C0_E0,\d,0,\d,'; $s=$p.replace($s, '%v1%', 1); $s=$p.replace($s, '%v2%', 1); sc ($_.basename+'.new.rcp') $s }"
  5. endlocal&pause&exit/b
复制代码

作者: haichuan5121    时间: 2024-8-15 15:24

回复 19# qixiaobin0715


    可以完美运行,1)测试时候不小心输入了不是两位数的组合里面输入了个位数执行结果里面代码全乱了 2)如果文件里只有一组C0-E0这个数 不执行操作可以不,18楼代码可以的,咱的是按照两位数的后面那个替换了

C:\***\PtnRcpData\S12100_P10_C0_E0,1,0,0,,,C0_E0,2,0,0 ,
作者: aloha20200628    时间: 2024-8-15 15:42

本帖最后由 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
复制代码

作者: 77七    时间: 2024-8-15 15:51

回复 19# qixiaobin0715


   大佬说得对,有时候没必要考虑这个感叹号,但是我想,一是楼主提供的文本只是部分;二是主要想多写写,折腾...
作者: qixiaobin0715    时间: 2024-8-15 16:18

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
复制代码

作者: WHY    时间: 2024-8-15 17:11

  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. }
复制代码

作者: haichuan5121    时间: 2024-8-16 10:38

回复 24# qixiaobin0715


    文本验证文本没有更新也没生成新的文本,源文件也没有变化没看出来问题在哪儿
作者: qixiaobin0715    时间: 2024-8-16 10:44

回复 26# haichuan5121
不要纠结我写的这个了,没仔细检查,可能是哪个地方有问题,楼上有能用的就好。
作者: qixiaobin0715    时间: 2024-8-16 15:17

回复 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"
复制代码

作者: WHY    时间: 2024-8-16 17:30

回复 28# qixiaobin0715


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

回复 29# WHY

是要在第2、3行加上一行endlocal,是吗?
作者: WHY    时间: 2024-8-16 17:47

本来不想再在这个帖子浪费时间,想想还是贴出来,其他人有可能会参考一下下。
  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. }
复制代码

作者: WHY    时间: 2024-8-16 17:49

回复 30# qixiaobin0715

可以在 goto :a 的上一行插入 endlocal
作者: qixiaobin0715    时间: 2024-8-19 08:27

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

回复 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' 未定义

请按任意键继续. . .
作者: qixiaobin0715    时间: 2024-8-20 09:03

回复 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
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2