带有扭曲的批处理脚本(Windows)字符串替换
我知道如何在批处理脚本中进行文本字符串替换。但是,我有一个特殊情况,需要替换数值变量的值 以下是脚本:带有扭曲的批处理脚本(Windows)字符串替换,windows,batch-file,cmd,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 T
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
关于如何让它做我需要的事,有什么建议吗
谢谢。你的车快到了,换一下就行了
SET NEW=%STRING:#=%%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
实际上,您不必使用!我代码>无处不在,就在设置新=%STRING:#!L!%代码>行。为了视觉上的一致性,我在任何地方都使用它。即使是aphoria和Bali C的解决方案也可以,最好使用它
set "NEW=!STRING:#=%L%!"
因此,更换将在延迟扩展阶段进行,而不是在百分比扩展阶段
这也适用于字符串中的感叹号和插入符号
@echo off
set L=2
set "String=This is # test!"
setlocal EnableDelayedExpansion
set "NEW=!STRING:#=%L%!"
echo !NEW!
只是为了好玩。下面是如何做到这一点而不延迟扩展:)
使用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
您也可以将该字符串用作“格式字符串”,将所需的变量放在感叹号括起来的正确位置。这样,无需进一步替换值,只需以常规方式显示格式字符串:
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
安东尼奥不用担心,很乐意帮忙:)很好地解释了内线的更换时机及其后果
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