标题: [文本处理] 批处理延迟变量里有迟延变量里有延迟变量,三层套娃,怎么写? [打印本页]
作者: tiandyoin 时间: 2023-3-4 23:05 标题: 批处理延迟变量里有迟延变量里有延迟变量,三层套娃,怎么写?
在 CMD 里,如果我想使用在延迟变量里使用延迟变量,如下:- @echo off
- set /p s1=Enter value for s1:
- set /p s2=Enter value for s2:
-
- rem Escape exclamation marks in s1 and s2
- set "s1=%s1:!=^^^!!%"
- set "s2=%s2:!=^^^!!%"
-
- cd.>3.out.txt
- for /f "delims=" %%j in ('findstr .* 3.txt') do (
- (set "val=%%j")
- setlocal enabledelayedexpansion
- Set val=!val:%s1%=%s2%!
- echo.!val!
- endlocal
- ) >> 3.out.txt
-
- pause
- 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 里一样。
感觉离正确答案很近了,但是我没法想通,卷太多层了
作者: tiandyoin 时间: 2023-3-4 23:16
- @echo off
- set /p s1=Enter value for s1:
- set /p s2=Enter value for s2:
-
- rem Escape exclamation marks in s1 and s2
- set "s1=%s1:!=^^^!!%"
- set "s2=%s2:!=^^^!!%"
-
- cd.>3.out.txt
- for /f "delims=" %%j in ('findstr .* 3.txt') do (
- set "val=%%j"
- call :replace val s1 s2
- setlocal enabledelayedexpansion
- echo.!val!
- endlocal
- ) >> 3.out.txt
-
- pause
- goto :eof
-
- :replace <var> <search> <replace>
- setlocal enabledelayedexpansion
- for /f "tokens=1,* delims==" %%a in ('set %~1') do (
- set "temp=%%b"
- set "%~1=!temp:%~2=%~3!"
- )
- endlocal & set "%~1=%temp%"
- goto :eof
复制代码
回复 1# tiandyoin
chatgpt 又给我卷出这串代码,感觉要抓狂,但结果错的离谱
作者: buyiyang 时间: 2023-3-5 12:08
看不懂你的需求是什么,你贴的代码和你的描述也不相符,建议不是你的代码就不用贴了,准确描述你的需求就行。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |