2013-02-17 50 views
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%然后将两个字符串操纵器转换为子字符串。

+0

我不确定要达到什么效果,但是您是否搜索FOR/F,请参阅http://ss64.com/nt/for_cmd.html – 2013-02-17 14:06:05

回答

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 -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的话题还有更多。