批处理脚本(Windows)带有变化的字符串替换

5

我知道如何在批处理脚本中进行文字字符串替换。然而,我有一个特定的情况,需要替换数值变量的值。

这是脚本:

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

任何有关如何达到我需要的目标的建议吗?
谢谢。
5个回答

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!

3
你已经接近成功了,只需要更改一下。
SET NEW=%STRING:#=%%L%

为了

SET NEW=%STRING:#=!L!%

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!%行中使用即可。我之所以在所有地方都使用它,是为了视觉上的一致性。

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

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

或者,不使用Delayed\Expansion:

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

Antonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接