4

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

这是脚本:

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

关于如何让它做我需要的任何提示?

谢谢。

4

5 回答 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!
于 2013-01-07T15:21:02.653 回答
3

你快到了,只是改变

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

SET NEW=%STRING:#=!L!%
于 2013-01-07T14:52:45.923 回答
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!%行。我在任何地方都使用它来保持视觉一致性。

于 2013-01-07T14:53:05.957 回答
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
于 2013-01-07T17:57:04.850 回答
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

安东尼奥

于 2013-01-07T18:30:52.170 回答