我知道如何在批处理脚本中进行文字字符串替换。但是,我有一个特定的情况,我需要替换数值变量的值
这是剧本:
setlocal enableextensions enabledelayedexpansion
set /A L=2
:L1
if %L% EQU 0 goto :EOF
set STRING="THIS IS # TEST"
SET NEW=%STRING:#=%%L%
echo %NEW%
set /A L=%L% - 1
goto L1
我希望它显示:
THIS IS 2 TEST
THIS IS 1 TEST
但最终却将这种情况改为:
THIS IS TEST2
THIS IS TEST1
有关如何让它做我需要的任何提示吗?
感谢。
答案 0 :(得分:7)
即使是aphoria和Bali C的解决方案也可以使用,最好使用
set "NEW=!STRING:#=%L%!"
此时更换将在延迟扩展阶段完成,而不是在扩展阶段。
这也适用于STRING
@echo off
set L=2
set "String=This is # test!"
setlocal EnableDelayedExpansion
set "NEW=!STRING:#=%L%!"
echo !NEW!
答案 1 :(得分:3)
你几乎就在那里,只需改变
SET NEW=%STRING:#=%%L%
到
SET NEW=%STRING:#=!L!%
答案 2 :(得分:2)
您需要使用!L!
来使用延迟扩展。
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET /A L=2
:L1
IF !L! EQU 0 goto :EOF
SET STRING=THIS IS # TEST
SET NEW=%STRING:#=!L!%
ECHO %NEW%
SET /A L=!L! - 1
GOTO L1
实际上,您不必在!L!
行的任何地方使用SET NEW=%STRING:#!L!%
。我到处都用它来保持视觉的一致性。
答案 3 :(得分:2)
只是为了好玩。这是如何在没有延迟扩展的情况下完成的。的 :)
强>
使用call
命令双重扩展变量。在变量周围使用双倍%%
来评估第二个。变量周围的单个百分比%
首先进行评估。
setlocal EnableExtensions
set /A L=2
:L1
if %L% EQU 0 goto :EOF
set "STRING=THIS IS # TEST"
call set "NEW=%%STRING:#=%L%%%"
echo %NEW%
set /A L=%L% - 1
goto L1
答案 4 :(得分:2)
您也可以将STRING用作“格式字符串”,将所需变量放在感叹号中的正确位置。这样,不需要进一步替换值,只需以通常的方式显示格式字符串:
rem Define the "format string" with Delayed Expansion disabled:
set STRING=THIS IS !L! TEST
setlocal enableextensions enabledelayedexpansion
set /A L=2
:L1
if %L% EQU 0 goto :EOF
echo %STRING%
set /A L=L - 1
goto L1
或者,没有延迟\扩展:
set STRING=THIS IS %%L%% TEST
set /A L=2
:L1
if %L% EQU 0 goto :EOF
call echo %STRING%
set /A L=L - 1
goto L1
安东尼奥