【转】call命令的“变量嵌套”和其“变量延迟”

【WINDOWS / DOS 批处理】call命令与变量延迟展开 WINDOWS / DOS 脚本编程中,本文介绍了call命令对变量延迟展开的影响。 阅读详情

http://www.sunenze.com/enzebbs/dispbbs.asp?boardid=4&Id=9159

 

先复习一下“字符串截取”的关键内容:

**********************************************
截 取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截 取长度(缺省为全部)。

百分号如果需要当成单一字符,必须写成%%

以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。

比如设变量word为“abcdefghij”,变量num为“123456789”
%word:~4,1% 为e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式如下:
%word:~%num:~3,1%,1% 经测试这种写法不能正确执行,写成%word:~(%num:~3,1%),1%同样不行,那么,怎么实现这种变量嵌套呢?这就必须结合命令嵌套。

什么是命令嵌套呢?简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令, 用call语句调用字符串将其执行,从而得到最终结果。

例:用call语句实现命令嵌套
@echo off
set str1=aaa echo ok bbb
echo 初始字符串:%str1%
echo 生成命令字符串如下:
echo %str1:~4,7%
echo 运行命令字符串生成最终结果为:
call %str1:~4,7%  --->相当于执行了两次,第一次以str1("
aaa echo ok bbb")为原始字符串, 生成命令字符串 %str1:~4,7% (即

                                   “ echo ok ”),第二次以 str1( “ echo ok ”)为原始字符串,再 调用 call %str1:~4,7% 即输出了“ok”
pause

运行显示:
初始字符串:aaa echo ok bbb
生成命令字符串 如下:
echo ok
运行命令字符串 生成最终结果为:
ok
请按任意键继续. . .

 

 

 

http://bbs.verybat.org/archiver/?tid-8560.html

学习贴:对于call命令的“变量嵌套”和其“变量延迟”不明白的进!

-------------------------------------------------
作者:非常批处理论坛——英雄。
如转载请注明出处。
--------------------------------------------------

这是大概是英雄丁亥年吐的最后一口血了,希望对这方面不明白的朋友好好看看。

大家都知道call命令是用来调用其他程序的。
想必有一定经验的朋友都知道要输出%a%需要这样写“echo %%a%%”,这样
百分号会脱掉一个。

先以一个简单的echo作为引子:
例一、[code]@echo off
set a=b
echo %a%
echo %%a%%
echo %%%a%%%
echo %%%%a%%%%
echo %%%%%a%%%%%
pause[/code]运行结果是:
b
%a%
%b%
%%a%%
%%b%%

解说:不知道大家看没看出来问题。批处理中类似于这样的变量替换究竟是如何进行的呢?我们姑且称之为“替换步骤”,“替换步骤”大体分为两步:

    第一步:
        当百分号“%”是偶数时(只按一边的百分号数目计算),变量将不被替换,其它的也不变。当百分号是奇数时(也只按一边的百分号数目计
),最里层的“%a%”将被替换成变量的值,此时百分号数目将少了一个(只按一边计)。

    第二步:
第一步完成后,百分号就都是偶数了。好了,现在把百分号数目的一半脱掉,剩下的就是结果了。

    拿本例的“echo %%%%%a%%%%%”为例说明一下。

第一步,由于百分号有5个是奇数,因此最里层的%a%被其值代替,现在变为“%%%%b%%%%”;

第二步,将百分号脱去一半,就变为“%%b%%”。怎么样,理解了吗?

再看看有call的时候。
例二、[code]@echo off
set a=b
set b=c
set c=d
call echo %%%%%%%%a%%%%%%%%
call echo %%%%%%%%%%%%%a%%%%%%%%%%%%%
pause[/code]运行结果是:
%%a%%
%%%b%%%
解说:由于有call的存在,“替换步骤”就会多进行一次。以“call echo %%%%%%%%%%%%%a%%%%%%%%%%%%%”为例。

“替换步骤”第一次:
    第一步:
百分号有13个是奇数,因此最里层的“%a%”被其值b替换,此时为“%%%%%%%%%%%%b%%%%%%%%%%%%”,

现在百分号数目为12个了。

    第二步:
将百分号数脱去一半,现在为“%%%%%%b%%%%%%”。

“替换步骤”第二次:
    第一步:
百分号有6个是偶数,因此不替换。现在仍然是“%%%%%%b%%%%%%”。

    第二步:
将百分号数脱去一半,现在为“%%%b%%%”。

结果就是“%%%b%%%”
(如果有n个call那么就要进行n+1次“替换步骤”。)

call命令在“变量延迟”中也遵循“替换步骤”。
举个例子:我现在要将字符串str1的“superhero”部分替换为chess,在此我们用间接的方法实现。代码如下:[code]@echo off
set str1=mynameissuperhero
set str2=supxrhxro
set a=x
call call set str3=%%%%str1:%%str2:%a%=e%%=chess%%%%
echo %str3%
pause[/code]因为用了两个call,因此要进行3次“替换步骤”。
“替换步骤”第一次:
1、将“%a%”替换成“x”,结果为“%%%%str1:%%str2:x=e%%=chess%%%%”。
2、将百分号脱去一半,为“%%str1:%str2:x=e%=chess%%”。

“替换步骤”第二次:
1、将“%str2:x=e%”替换掉,结果为“%%str1:superhero=chess%%”。
2、将百分号脱去一半,为“%str1:superhero=chess%”。

“替换步骤”第三次:
1、将“%str1:superhero=chess%”替换掉,结果为“mynameischess”。
2、将百分号脱去一半(没的脱了),因此结果为“mynameischess”。

怎么样,明白了吗?


【WINDOWS / DOS 批处理】call命令的变量延迟展开特性 WINDOWS / DOS 脚本编程时,在小括号内语句块(或复合语句)中,call命令对变量展开是怎样的? 阅读详情

相关推荐

【WINDOWS / DOS 批处理】嵌套变量如何(延迟)展开

WINDOWS / DOS 脚本编程中,嵌套变量如何(延迟)展开呢?

【扬科网络官方技术博客】让每个勤奋者成为网络时代的精英 1145

call命令

一、call命令总结 【1】call命令简介   学过汇编或C的朋友,肯定都知道call指令表示什么意思。其实,在这里它的意思也是一样的。在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理脚本。   语法: call [ [Drive:] [Path] FileName [BatchParameters]] [:label [arguments]]   参数: [Drive

蒙奇D许的博客 2万+

变量延迟详解 call setlocal

变量延迟在for语句中起着至关重要的作用,不只是在for语句中,在其他的复合语句中,它也在幕后默默地工作着,为了突出它的重要性,本节内容在单独的楼层中发出来,希望引起大家的重视

ASP 中调用函数关于Call使用注意的问题

Function TestFun(Tstr) TStr = "Fun2" End Function Sub TestSub(TStr) Tstr = "Sub2" End Sub Dim Fun, [Sub] Fun = "Fun1" Call TestFun(Fun) Msgbox Fun '打印出来 "Fun2" Fun = ...

weixin_33720078的博客 312

Git下载安装及环境配置,解决安装包下载慢问题(详细版)

Git是我们平时开发都要用到的项目管理工具,虽然有网页版的Git网站,但是在本地安装Git后,可以直接使用命令语句来进行项目的上传与克隆。还是非常方便的。今天就来介绍下Git的下载。1、首先在浏览器中搜索Git,进入到Git的官方下载界面或者直接复制下面这个链接。 2、点击download进入下载界面,选择自己需要平台的文件 3、下载标准版就可以4、但是会发现下载速度很慢,就找个镜像版 5、点击 https://registry.npmmirror.com/binary.html?path=git-for-

mengxiang_的博客 6万+

让AI稳定生成流程图:基于Skill与Mermaid的工程化实践

流程图是软件工程中沟通业务逻辑的通用语言,但其绘制与维护却长期依赖手工工具,导致文档更新滞后、协作成本高。随着大语言模型技术的成熟,自然语言生成代码已成为可落地的技术路径,而Mermaid作为一款文本化图表语法,凭借其可版本管理、可自动渲染和可嵌入文档的优势,正逐步取代传统绘图工具。要让AI稳定输出合格的流程图,关键在于为模型定义一套清晰的Skill规则,约束输入结构、处理逻辑和输出格式。本文从流程图的工程痛点出发,介绍如何利用大模型将自然语言描述转化为结构化文本,再通过Mermaid CLI渲染成可视化图

weixin_42548782的博客 306

变量延迟详解 call setlocal (转)

变量延迟详解 call setlocal   变量延迟在for语句中起着至关重要的作用,不只是在for语句中,在其他的复合语句中,它也在幕后默默地工作着,为了突出它的重要性,本节内容在单独的楼层中发出来,希望引起大家的重视。   对于批处理新手而言,“变量延迟”这个概念很可能闻所未闻,但是,它却像一堵横亘在你前进道路上的无形高墙,你感受不到它的存在,但当你试图往前冲时,它会把你狠狠

IcebergSnowfox的专栏 3554

欧姆龙PLC的FinsTCP协议

三个流行的PLC: PLC 通讯协议 默认IP和端口 区别 西门子S7-1200 S7 192.168.1.201 :102 2次验证(正常连接后,第一次发不断开,第二次发断开) 三菱Q系列 MC 192.168.1.250 :4096 不验证(正常连接后,怎么发都不断开) 欧姆龙CJ-2M系列 FinsTCP 192.168.1.14 :9600 1次验证(正常连接后,第一次发断开) ...

周林的博客 1万+

批处理文章:预处理、变量延迟、call

http://bbs.bathome.net/thread-3349-1-1.html 原始出处:http://bbs.verybat.org/viewthread.php?tid=9292 原始标题:讨论帖:预处理究竟是如何进行的 ————————namejm补注————

DreamSpark的专栏 1813

ubuntu18.04安装xenomai3.1(百分百成功版)

ubuntu18.04安装xenomai3.1(百分百成功版),保姆级教学!!!

h542812556sdu的博客 2059

stm32f103c8t6的中文字库

stm32的成熟中文字库,上手即用,操作简单

nbbskk的博客 3652

bat使用命令解析-详细(转)

bat命令解析 目录第一章 批处理基础第一节 常用批处理内部命令简介 1、REM 和 :: 2、ECHO 和 @ 3、PAUSE 4、ERRORLEVEL 5、TITLE 6、COLOR 7、mode 配置系统设备 8、GOTO 和 : 9、FIND 10、START 11、assoc 和 ftype 12、pushd 和 popd 13、CALL 14、shift 15、IF 16、setlocal 与 变量延迟(ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPAN

Ave.的博客 8016

Codex入门00-初识神器(小白入门:到底什么是Codex CLI,和ChatGPT写代码有什么不同?)

OpenAI Codex CLI 是 OpenAI 于2025年推出的终端原生AI编程代理,不是在网页里聊天写代码,而是直接在你的终端里自主读代码、改文件、跑命令。它拥有三种安全模式、/goal 持久化任务、云端沙箱执行等独特能力。本文从零介绍 Codex CLI 的核心概念、与 ChatGPT 写代码的本质区别、典型使用场景和费用说明,让你全面认识这个改变开发方式的神器。

yueyeguzhuo的专栏 301

关于CMD中延迟环境变量嵌套的实现方法

在我昨天做的一个bat中(自动按日期重命名文件名)涉及到这方面的问题 以前涉及到这里时就想别的办法替代过去,今天好好扒出来说说: 实现变量嵌套的2种方法: 1,使用call实现变量嵌套 变量嵌套:即在变量中嵌套变量,将变量的值作为另外一个变量的名字(或一部分名字) 这种用法很多语言都支持,如PHP的$$p,如C语言的**p二级指针,但在BAT中这是第一次涉及 如:(需要通过a输入10)...

weixin_30480583的博客 359

基于JeecgBoot 3.9.0 开源项目的企业管理平台

基于JeecgBoot 3.9.0 开源项目的企业管理平台

宁波阿成的博客 370

PCL 法向量夹角剔除错误匹配点对【2026最新版】

实现了一种简单的基于对应点法线角度的对应关系去除方法。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 41万+

批处理学习start、call、cmd 篇

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34189116的博客 1835

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

call

-------siwuxie095 call 调用另一个批处理程序或自身程序段,调用完,程序会回到原来 call 的地方继续执行 如果在脚本或批处理文件外使用 call,则不会在命令行起作用 语法 call  [[Drive:][Path] FileName [BatchParameters]]   [:Label [Arguments]]

siwuxie095's blog 830

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

bat命令

目录第一章 批处理基础第一节 常用批处理内部命令简介1、REM 和 ::2、ECHO 和 @3、PAUSE4、ERRORLEVEL5、TITLE6、COLOR7、mode 配置系统设备8、GOTO 和 :9、FIND10、START11、assoc 和 ftype12、pushd 和 popd13、CALL14、shift15、IF16、setlocal 与 变量延迟(ENABLEDEL...

dmoi77214的博客 325

Windows批处理脚本进阶:call、start、pushd与popd命令的深度解析与实战应用

在Windows批处理脚本编程中,命令的协同与流程控制是提升脚本效率与健壮性的核心。理解命令的执行原理,如同步与异步机制、环境变量继承以及目录栈管理,是构建复杂自动化任务的基础。这些技术价值在于实现脚本的模块化、并发执行以及跨目录的稳健文件操作,从而应对日常运维、批量处理及部署等应用场景。本文聚焦于批处理脚本中四个关键命令:call用于同步调用与模块化,start实现异步任务执行,pushd和popd则优雅管理目录导航。针对“cmd start命令不带标题”这一高频搜索需求,文中提供了标准解决方案与避坑指南

weixin_34238633的博客 437

批处理命令基础

第一章 批处理基础第一节 常用批处理内部命令简介批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。了解了大概意思后,我们正式开始学习.先看一个简单的例子!@echo offecho "欢迎来到非常BAT!"pause把上面的3条...

anwenzhao0749的博客 1719

cmd脚本命令--之基本命令锦集

转自:http://www.jb51.net/article/26994.htm 目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1、REM 和 :: 2、ECHO 和 @ 3、PAUSE 4、ERRORLEVEL 5、TITLE 6、COLOR 7、mode 配置系统设备 8、GOTO 和 : 9、FIND 10、START 11、assoc 和 fty

人生代码,代码人生。。。 9540

[批处教程]三.4 环境变量延迟扩展

[批处教程]三.4 环境变量延迟扩展编程&命令2009-08-08 23:42:01阅读66评论0  字号:大中小 订阅环境变量延迟扩展本文学习重点:一,什么是延迟环境变量扩展?二,批处理变量延迟详解三,批处理延迟变量(通俗解释)四,什么时候使用延迟变量?如何使用?一,什么是延迟环境变量扩展?原文稿地址:http://bbs.bathome.cn/thread-3083-1-1.html      延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫变量扩展!CMD在解释我们的命令的时

.50的专栏 742

dos bat批处理批量获取文件名以及全路径名

@echo off&setlocal enabledelayedexpansion SET index=0 ::用以判断字符串中是否包含对应字符串,可填写多个,用\<字符串\>表示 SET excludestr="\<bat\> \<csv\> \<xls\> \<txt\>" echo index filefullname f...

野蜂的博客 9436

(Dos)-BAT命令入门与高级技巧详解(转)

目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1、REM 和 :: 2、ECHO 和 @ 3、PAUSE 4、ERRORLEVEL 5、TITLE 6、COLOR 7、mode 配置系统设备 8、GOTO 和 : 9、FIND 10、START 11、assoc 和 ftype 12、pushd 和 popd 13、CALL 14、shift 15、I

guaishushu1ss的博客 2155

CMD命令行高级教程精选合编合集 转

CMD命令行高级教程精选合编合集 PKjason发布于 2013/04/14 18:24 CMD命令行高级教程精选合编,需要的朋友可以参考下。 目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1、REM 和 :: 2、ECHO 和 @ 3、PAUSE 4、ERRORLEVEL 5、TITLE 6、COLOR 7、mode 配置系统设备 8、GOTO 和 : 9、FIND 10...

xcntime的专栏 839
上一篇: 【转】批处理字符串操作
下一篇: 批处理使用心得
code09
博客等级 码龄18年 31粉丝 56原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值