批处理脚本(Windows)字符串替换扭曲

时间:2013-01-07 14:43:16

标签: windows batch-file cmd

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

这是剧本:

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 个答案:

答案 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

安东尼奥