返回列表 发帖
没有测试文件,只能这样试试:
  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
复制代码
1

评分人数

TOP

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

TOP

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

回复 9# haichuan5121
是漏掉了首行?@echo off

TOP

回复 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文件”。
代码未经测试,请注意备份好源文件,以免出现意外。

TOP

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

TOP

本帖最后由 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
复制代码
代码暂不要修改,等结果正确之后再根据具体情况修改特殊字符。
看到楼上的代码突然想到,如果文本中存在英文感叹号是个棘手的问题,恐怕最少要再增加两对变量延迟开关,还要考虑到底要加在何处才合适。还好提供的文本中不存在这种情况。

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

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

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

回复 29# WHY

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

TOP

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

TOP

回复 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

返回列表