Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有扭曲的批处理脚本(Windows)字符串替换_Windows_Batch File_Cmd - Fatal编程技术网

带有扭曲的批处理脚本(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