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

[文本处理] 批处理延迟变量里有迟延变量里有延迟变量,三层套娃,怎么写?

在 CMD 里,如果我想使用在延迟变量里使用延迟变量,如下:
  1. @echo off
  2. set /p s1=Enter value for s1:
  3. set /p s2=Enter value for s2:
  4. rem Escape exclamation marks in s1 and s2
  5. set "s1=%s1:!=^^^!!%"
  6. set "s2=%s2:!=^^^!!%"
  7. cd.>3.out.txt
  8. for /f "delims=" %%j in ('findstr .* 3.txt') do (
  9.     (set "val=%%j")
  10.     setlocal enabledelayedexpansion
  11.         Set val=!val:%s1%=%s2%!
  12.         echo.!val!
  13.     endlocal
  14. ) >> 3.out.txt
  15. pause
  16. goto :eof
复制代码
一般 s1=abc 是可以的,但 s1 里面有特殊字符就出问题了,比如有特殊字符感叹号 ! 。如 s1 字面量是 !ab, 或 s1 字面量是 !a!bc
或 s1 字面量是 !a!b!c 或 s1 字面量是 !a!b!c!

这时我该怎么保证在 call 调用时, s1 里的感叹号不会被当成特殊字符进行求值呢,
或者简单说, 3.txt 内容里有三行字符串
!a!bc
!a!b!c
!a!b!c!
对 s1 的值,我输入 !a!b!c
对 s2 的值,我输入 !d!e!f!!!
要怎么确保 3.out.txt 内容为
!a!bc
!d!e!f!!!
!a!b!c!
chatgpt, 谢谢你刚才的结果,但是 3.out.txt 的内容还是和 3.txt 里一样。
感觉离正确答案很近了,但是我没法想通,卷太多层了

看不懂你的需求是什么,你贴的代码和你的描述也不相符,建议不是你的代码就不用贴了,准确描述你的需求就行。

TOP

  1. @echo off
  2. set /p s1=Enter value for s1:
  3. set /p s2=Enter value for s2:
  4. rem Escape exclamation marks in s1 and s2
  5. set "s1=%s1:!=^^^!!%"
  6. set "s2=%s2:!=^^^!!%"
  7. cd.>3.out.txt
  8. for /f "delims=" %%j in ('findstr .* 3.txt') do (
  9.     set "val=%%j"
  10.     call :replace val s1 s2
  11.     setlocal enabledelayedexpansion
  12.         echo.!val!
  13.     endlocal
  14. ) >> 3.out.txt
  15. pause
  16. goto :eof
  17. :replace <var> <search> <replace>
  18. setlocal enabledelayedexpansion
  19. for /f "tokens=1,* delims==" %%a in ('set %~1') do (
  20.     set "temp=%%b"
  21.     set "%~1=!temp:%~2=%~3!"
  22. )
  23. endlocal & set "%~1=%temp%"
  24. goto :eof
复制代码
回复 1# tiandyoin

chatgpt 又给我卷出这串代码,感觉要抓狂,但结果错的离谱

TOP

返回列表