1

我有一个变量充当要打印的行,但我需要通过它们在行中的位置来编辑该行中的单个字符。但是我每次都需要使用变量来指定位置,并且 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% 然后将两个字符串操作符转换为子字符串。

4

1 回答 1

2

我不确定我是否理解脚本示例最后一行中的评估顺序,即使您的口头解释也是如此。但是,我想我至少可以通过简单的示例向您展示如何实现您想要的,并且您将弄清楚如何在您的情况下应用该技术。

基本上,您需要在这里使用两种扩展:立即(或%扩展)和延迟。

批处理文件中存在适当的延迟扩展,必须首先启用(通常使用 command 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-expansion 实现相同的效果。这是使用CALL-expansion 重写的相同示例脚本:

SET ind=1
SET line%ind%=ABC
CALL ECHO %%line%ind%%%

基本上,%一路都有扩展,但不同的部分在不同的时间进行评估。以下是第二个示例的延迟评估的工作原理:

  • 第一个%%变成%;

  • %ind%被评估为1;

  • 剩下的%%变成%;

  • CALL 现在接收要执行的命令:ECHO %line1%;

  • %line1%评估为ABC;

  • ECHO打印ABC

扩展速度较慢,这CALL可能特别体现在循环中。!另一方面,扩展具有一些含义,特别是由于该命令SETLOCAL用于启用语法这一事实。在我对另一个问题的回答中有更多关于这个主题的内容。

于 2013-02-17T17:39:58.423 回答