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

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

用字符串替换写了一个,兼顾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

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

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

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

回复 19# qixiaobin0715


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

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

  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

回复 24# qixiaobin0715


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

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

回复 28# qixiaobin0715


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

TOP

回复 29# WHY

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

TOP

返回列表