如何使用变量中的值拆分字符串? (批量)

时间:2013-02-17 14:01:31

标签: string batch-file

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

1 个答案:

答案 0 :(得分:2)

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

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

批处理文件中存在适当的延迟扩展,必须首先启用(通常使用命令SETLOCAL EnableDelayedExpansion),然后使用!代替%进行变量评估。请考虑以下示例:

SET ind=1
SET line%ind%=ABC
SETLOCAL EnableDelayedExpansion
ECHO !line%ind%!
ENDLOCAL

在上面的示例中,创建了两个变量indline1。第二个名称部分使用第一个变量构造。当您值设置为此类变量时,不需要延迟扩展,因为不需要评估赋值的左侧部分。但是当需要进行评估时,您需要使用延迟扩展。上面脚本中的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中的主题还有更多内容。