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


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

C:\***\PtnRcpData\S12100_P10_C0_E0,1,0,0,,,C0_E0,2,0,0 ,

TOP

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

评分人数

bat小白,请多指教!谢谢!

TOP

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

TOP

回复 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其余位置不变

TOP

回复 11# haichuan5121


   这个和1楼的替换应该是一回事,就是替换 两段C0_E0后数字,可以写个通用脚本,用批处理有点麻烦,用其它脚本或第三方文本工具的正则应该好点。
bat小白,请多指教!谢谢!

TOP

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

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

本帖最后由 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

TOP

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

TOP

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

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

TOP

回复 4# qixiaobin0715


    可以用了感谢感谢大神

TOP

  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
复制代码
bat小白,请多指教!谢谢!

TOP

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

TOP

返回列表