我有一个变量作为一行打印,但我需要通过它们在行中的位置来编辑该行中的单个字符。但是我每次都需要使用变量来指定位置,CMD以错误的方式解释我的变量。
@echo off
set fv=0
set fh=1
set /a fh1=%fh%+1
set linev=line%fv%
set line%fv%=%linev:~0,%fh%%%NEWCHARACTER%%linev:~%fh1%%
很抱歉我的代码很乱,但我希望它能被理解。
我希望CMD将代码解释为:
%fv %% fh %% newcharacter %% fh1%然后将两个字符串操纵器转换为子字符串。
答案 0 :(得分:2)
我不确定我是否理解了脚本示例最后一行中的评估顺序,即使您的口头解释也是如此。但是,我想我至少可以通过简单的例子向您展示如何实现您想要的,并且您将了解如何在您的情况下应用该技术。
基本上,你需要在这里使用两种扩展:立即(或%
扩展)和延迟。
批处理文件中存在适当的延迟扩展,必须首先启用(通常使用命令SETLOCAL EnableDelayedExpansion
),然后使用!
代替%
进行变量评估。请考虑以下示例:
SET ind=1
SET line%ind%=ABC
SETLOCAL EnableDelayedExpansion
ECHO !line%ind%!
ENDLOCAL
在上面的示例中,创建了两个变量ind
和line1
。第二个名称部分使用第一个变量构造。当您将值设置为此类变量时,不需要延迟扩展,因为不需要评估赋值的左侧部分。但是当需要进行评估时,您需要使用延迟扩展。上面脚本中的ECHO
命令的工作方式如下:
%ind%
;
作为%ind%
评估的结果,该命令变为ECHO !line1!
;
由于刚刚启用了延迟扩展,!
现在具有特殊含义,即(延迟)变量评估,因此!line1!
评估为ABC
;
ECHO
打印ABC
。
虽然这种延迟扩展通常是首选扩展,但在上面的示例中,您也可以使用CALL
- 扩展来实现相同的扩展。这是使用CALL
重写的相同示例脚本 - 扩展:
SET ind=1
SET line%ind%=ABC
CALL ECHO %%line%ind%%%
基本上,一直有%
扩展,但不同的部分会在不同的时间进行评估。以下是第二个示例的延迟评估的工作原理:
第一个%%
变为%
;
%ind%
评估为1
;
剩余的%%
变为%
;
CALL现在收到执行命令:ECHO %line1%
;
%line1%
评估为ABC
;
ECHO
打印ABC
。
CALL
扩展速度较慢,尤其可能在循环中表现出来。另一方面,!
扩展具有一些影响,特别是因为SETLOCAL
命令用于启用语法。 my answer to a different question中的主题还有更多内容。