【问题标题】:How to split a string using values from variables? (Batch)如何使用变量中的值拆分字符串? (批)
【发布时间】:2013-02-17 14:01:30
【问题描述】:

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

【问题讨论】:

标签: string batch-file


【解决方案1】:

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

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

批处理文件中存在延迟扩展,必须首先启用(通常使用命令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-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 命令用于启用语法这一事实。 my answer to a different question 中有更多关于该主题的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多