【批处理DOS-CMD-汇总】扩展变量-延迟变量cmd /v:on、cmd /v:off、setlocal enabledelayedexpansion、DisableDelayedExpansion

2023-11-17

Reference

批处理命令——for - kaizen - 博客园

Bat脚本之延时变量cmd /v:on_komomon‘s blog的博客-CSDN博客_bat延迟变量

一、“延迟变量”的存在背景

批处理的执行过程是“自上而下,逐条执行”,而“逐条执行”不代表“逐行执行”。

因为一条指令可能占据多行。

在复合语句中,整个复合语句是一条完整的语句,而无论这个复合语句占用了多少行的位置。常见的复合语句有:for语句、if……else语句、用连接符&、||和&&连接的语句,用管道符号|连接的语句,以及用括号括起来的、由多条语句组合而成的语句块。

在非复合语句中,如果该语句占据了一行的位置,则该行代码为一条完整的语句。  

而批处理在执行一条语句前会进行“预处理”,预处理过程会把所有变量识别出来,直接给各处变量赋上现有值。

即使一条语句中,涉及同一变量的操作有前有后,在前面改变了变量的值,这个更新值无法传至后面的变量,因此后面的变量在执行命令时起作用的是旧值(但往往我们想要前面执行命令得到的更新值直接传给后面的变量)。

例如,你编写了一个脚本文件。

chcp 65001
@echo off 
set school=湘潭大学
echo "我现在就读于%school%"
echo "经过四年的时间,我收到重庆大学的录取通知书"
set school=重庆大学 & echo 我现在即将就读于%school% 
pause>nul

执行结果如下。是不是很怪?按道理应该怎么样,先把自己的school设定为重庆大学后,对外输出的应该是“我现在即将就读于重庆大学”吧。

原因就是因为命令【set school=重庆大学 & echo 我现在即将就读于%school% 】是一条复合语句,在预处理过程中后面的school变量已经被赋值“湘潭大学”了。

有没有一种选项或开关,我们开了它之后,就能在不改变原先语句结构的基础上,将复合语句后面的变量更替至前面执行的最新值。

有有有!当然有!欲知后事如何,请听后文分解!

二、在cmd窗口中打开延迟变量

在cmd窗口中,我们执行命令【cmd /?】可以得到相关帮助信息,下面重点引述(其他不相关的全删了,如果感兴趣其他参数可以自行打印)。

C:\Users\Administrator>cmd /?
启动 Windows 命令解释器的一个新实例

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] string]

/V:ON   使用 ! 作为分隔符启用延迟的环境变量
        扩展。例如,/V:ON 会允许 !var! 在执行时
        扩展变量 var。var 语法会在输入时
        扩展变量,这与在一个 FOR
        循环内不同。
/V:OFF  禁用延迟的环境扩展。

延迟环境变量扩展不按默认值启用。你
可以用/V:ON 或 /V:OFF 开关,为 CMD.EXE 的某个调用而
启用或停用延迟环境变量扩展。你
可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有
调用的延迟扩展,这要通过设置使用 REGEDIT.EXE 的注册表中的
一个或两个 REG_DWORD 值:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion

        和/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

到 0x1 或 0x0。用户特定设置
比机器设置有优先权。命令行开关
比注册表设置有优先权。

在批处理文件中,SETLOCAL ENABLEDELAYEDEXPANSION 或 DISABLEDELAYEDEXPANSION
参数比 /V:ON 或 /V:OFF 开关有优先权。请参阅 SETLOCAL /?
获取详细信息。

如果延迟环境变量扩展被启用,
惊叹号字符可在执行时间被用来
代替一个环境变量的数值。

我们从帮助信息可以知道,大致分为两种打开延迟变量开关的方式,不管哪种都需要把变量两旁的百分号%改成感叹号!。

第一种,在cmd中打开延迟变量,其中又分为临时性地通过命令【cmd /v:on】或命令【cmd /v】打开和永久性地修改注册表变量打开。

第二种,在批处理脚本中打开延迟变量,其中又分为临时性地通过命令【SETLOCAL ENABLEDELAYEDEXPANSION】打开和永久性地修改注册表变量打开。

我们试试第一种的临时修改版本。

执行命令【cmd /v:on】后,便进入延迟变量扩展环境,cmd窗口标题后面也加了命令代码。

再执行命令。

set CQ=1
set /a CQ+=1 & echo !CQ!

结果如下所示,set /a CQ+=1的输出是2,并且后面的echo也输出了2,说明后面的echo使用的是前一个set执行后的最新值。 

我们可以通过命令【exit】或者命令【cmd /v:off】来退出延迟变量状态。

退出后,再执行上述命令,结果如下。

下面我们继续讲解如何在批处理脚本使用延迟变量机制。

三、在批处理脚本中打开延迟变量

新建一个bat文件,代码如下。

chcp 65001
@echo off 
set school=湘潭大学
echo "我现在就读于%school%"
echo "经过四年的时间,我收到重庆大学的录取通知书"
set school=重庆大学 & echo 我现在即将就读于%school%
echo 这次输出错了
echo "打开延迟变量试试"
setlocal EnableDelayedExpansion
set school=湘潭大学
set school=重庆大学 & echo 我现在即将就读于!school! 
echo "终于正确了"
echo "再关闭延迟变量试试"
setlocal DisableDelayedExpansion
set school=湘潭大学
set school=重庆大学 & echo 我现在即将就读于%school%
echo "果然又错了哈哈哈"
pause>nul

执行之后,输出结果如下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【批处理DOS-CMD-汇总】扩展变量-延迟变量cmd /v:on、cmd /v:off、setlocal enabledelayedexpansion、DisableDelayedExpansion 的相关文章

  • 如何在Windows中收集每个服务名称及其状态?

    我想在不使用任何第三方工具的情况下获取所有 service name 及其状态 迄今为止SC http ss64 com nt sc html命令足以获取其中一个值 例如 sc query findstr SERVICE NAME 但我还需
  • 在 Jenkins 中执行批处理文件

    我有一个简单的批处理文件 我想要从 Jenkins 调用 运行 执行该文件 Jenkins 中有同样的插件吗 如何从 Jenkins 执行批处理文件 如果有相同的教程或文档 无需为此添加新插件 在Jenkins 选择您的工作名称并转到配置部
  • 在 Android SDK 中设置 JAVA_HOME

    我和对方有一些冲突JAVA HOME配置 当我使用以下代码时 System out println System getenv JAVA HOME I get C jdk1 6 0 23这是正确的地方 但是 当我在 Android buil
  • 如何让 git 和 copSSH 在正确的目录中查找密钥?

    我刚刚安装了 Windows 版 copSSH 当我启动它时 我得到一个目录C copSSH home Nick ssh其中有我的酒吧和私钥 当我通过 Cygwin bash 窗口访问此目录时 使用 ssh 用户 主机 我很高兴地登录了 但
  • NtDll 真的导出 C 运行时函数吗?我可以在我的应用程序中使用这些函数吗?

    我在查看 Windows 10 计算机上的 NtDll 导出表 发现它导出标准 C 运行时函数 例如memcpy sprintf strlen etc 这是否意味着我可以在运行时动态调用它们LoadLibrary and GetProcAd
  • 批处理文件 FOR /f 标记

    任何人都可以逐行准确解释以下代码是如何工作的 我真的迷路了 我一直在尝试学习如何使用 FOR 命令 但我不明白这一点 echo off for f tokens delims f in myfile do set line f call p
  • Windows7上python3.5无法安装BeautifulSoup4

    我已经从下载了 beautifulsoup4 4 5 3 tar gzhttps www crummy com software BeautifulSoup bs4 download 4 5 https www crummy com sof
  • .bat 文件将文件排序到文件夹中

    对于我的图片集 我希望文件夹中的所有图片按日期自动分类到文件夹中 幸运的是 这些文件已经以时间戳命名 2012 07 15 12 21 06 jpg 2012 07 15 12 21 26 jpg 2012 07 16 12 12 50 j
  • 代码退出-1073741515 (0xc0000135)“未找到依赖的 dll”

    我正在尝试编写一个简单的程序 与 2019 年相比 Windows 10 64 位 调试 gt x64 遵循 将 Visual C 项目配置为面向 64 位平台 1 include
  • 如何在 C++ 中急于提交分配的内存?

    总体情况 带宽 CPU 使用率和 GPU 使用率都极其密集的应用程序需要每秒从一个 GPU 向另一个 GPU 传输约 10 15GB 的数据 它使用 DX11 API 来访问 GPU 因此上传到 GPU 只能在每次上传都需要映射的缓冲区中进
  • 更改desktop.ini不会在Windows中自动更新文件夹图标

    我使用此批处理脚本将所有文件夹和子文件夹的图标更改为位于文件夹中的 ico 文件 但是 资源管理器中的文件夹图标不会改变除非我手动重命名desktop ini将资源管理器中的文件更改为其他内容 然后返回desktop ini或者例如将字母更
  • python+win32:检测窗口拖动

    有没有办法检测何时使用 python pywin32 在窗口中拖动不属于我的应用程序的窗口 我想对其进行设置 以便当我拖动标题与桌面边缘附近的图案匹配的窗口时 当松开鼠标时它会捕捉到边缘 我可以编写代码 以便在释放鼠标时将所有具有该标题的窗
  • 内存映射图形输出

    我正在探索使用内存映射图形绘制像素和线条 我在 Windows 的 Textpad 中使用 TASM 当我单击 运行 时 整个屏幕变成蓝色 就是这样 没有绘制像素 model small stack data saveMode db xVa
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • Vim 在 Mingw 上表现异常

    我在 MinGW 4 6 2 上的 Vim 表现得很奇怪 例如 在插入模式下按 Backspace 会删除字符 但我必须用箭头键移动光标才能删除的字符消失 而且它也会使我退出插入模式 另一个例子 按 Del 删除字符有时会生成奇怪的字符 例
  • 自定义波特率,redux

    我遇到的问题详述如下自定义波特率 https stackoverflow com questions 7714060 custom baud rate SetCommState 波特率 921600 失败 但波特率 115200 成功 尽管
  • 对于多重继承,使用隐式转换而不是 QueryInterface() 是否合法?

    假设我有一个类实现两个或多个 COM 接口 正如here https stackoverflow com questions 1742848 why exactly do i need an explicit upcast when imp
  • 不在焦点时响应键盘? (C#、Vista)

    我正在尝试编写一个应用程序 只要按下 Shift 键 无论当前哪个应用程序具有焦点 它都会做出响应 我尝试过这个SetWindowsHookEx 与GetKeyboardState 但这两种方法仅在应用程序窗口具有焦点时才有效 我需要它在全
  • 在哪里可以获得 PHP 5.3+ 的 runkit DLL 扩展?

    这是一个简单的问题 我在哪里可以获得 PHP 5 3 版本的 runkit 扩展 它的手册 http php net manual en book runkit php http php net manual en book runkit
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔

随机推荐

  • 【Allegro 17.4软件操作保姆级教程二】布局前准备

    由于Allegro 17 2软件出了故障 干脆新安装了17 4版本 后续的教程截图都用17 4的 操作逻辑是差不多的 1 生成和导入网表 1 原理图绘制完成 导出网表 在Capture中 选中原理图dsn文件 tools create ne
  • 企业服务端接口认证案例

    接口认证方式 调用方要向管理员获取 appkey 和 secret appkey 调用方唯一标识 方便 HTTP API 统计与维护 secret 密钥 用于生成 HTTP API 校验所需的 token 值 调用方每次请求都需要带上当前时
  • PPP协议、PPPoE协议、L2TP协议的关系

    1 简述 首先对这3中协议做一个简单的描述 协议 协议类型 描述 PPP 点对点链路层协议 应用最广泛的点对点协议 可应用在多种网络 改善了SLIP协议的不足 PPPoE 点对点链路层协议 对PPP协议进行扩展 将PPP用于以太网上 L2T
  • CNN,Transformer,MLP三分天下

    title 论文列表 1 MLP Mixer MLP Mixer An all MLP Architecture for Vision 2 MetaFormer MetaFormer is Actually What You Need fo
  • 原生JS实现贪吃蛇游戏

    原生JS实现贪吃蛇游戏 贪吃蛇游戏 原生JavaScript 贪吃蛇游戏思路分析 游戏思想 面向对象的思想 三个js文件分别代表三个对象 三个对象相互独立 在HTML中控制全局 使用面向对象思想的好处 贪吃蛇游戏采用面向对象的思想去实现 我
  • 2023年第七届航空航天、机械与机电工程国际会议(CAMME 2023)

    2023年第七届航空航天 机械与机电工程国际会议 CAMME 2023 重要信息 会议网址 www camme org 会议时间 2023年2月18 20日 召开地点 中国广州 截稿时间 2023年12月30日 录用通知 投稿后2周内 收录
  • 微信公众号开发笔记6(WEUI组件实现图片上传、预览、删除)

    没有废话直接上代码 1 新建HTML5 样式自行百度下载
  • 数学篇(二) 方差、标准差、协方差

    1 均值 均值就是将所有的数据相加求平均 求得一个样本数据的中间值 2 标准差 标准差也被称为标准偏差 公式如下所示 简单来说 标准差是一组数平均值分散成都的一种度量 一个较大的标准差 代表大部分数值和其平均值之间差异较大 一个较小的标准差
  • 方差分析 / 主成分分析 / 因子分析 / 聚类分析

    一 方差分析 水平 因素的不同状态 分组是按照因素的不同水平划分的 因变量 在分组试验中 对试验对象所观测记录的变量 它是受各因素影响的变量 常见的方差分析类型 单因素方差分析 多因素方差分析 单因素方差分析 是指检验由单一因素影响一个因变
  • 浅谈对软件工程的认识与理解

    数据结构与算法 计算机组成原理 计算机操作系统 计算机网络 软件工程需重视的 软件工程涉及的资源有 人力 资金 时间的合理分配 涉及到文化与管理等 及各种规划化 软件开发是一个把用户需要转化为软件需求 把软件需求转化为软件设计 用软件代码来
  • 解决XML本地无法找到的问题

    Java开发中 xml一般网络上面获取即可 但是如果想本地解析测试 直接放在文件夹里面加内容是会找不到相关问题 解决方法就是找到文件所在系统的绝对路径即可 寻找路径方法 右键xml文件 gt properties gt Location 注
  • 双线性插值原理分析及c++实现

    双线性插值原理分析及C 实现 双线性插值 又称为双线性内插 其核心思想利用虚拟点四周真实存在的四个像素点分别在两个方向上进行线性插值操作 公式推导过程 上述图片中像素点的说明 Q11 Q21 Q12 Q22 分别为虚拟点周围四个真实存在的像
  • MATLAB中reshape的使用方法整理

    1 语法 1 B reshape A m n 将矩阵A的元素返回到一个m n的矩阵B 如果A中没有m n个元素则返回一个错误 2 B reshape A m n p or B reshape A m n p 把A中元素进行重塑成m n p
  • 使用jenkins部署项目

    使用jenkins部署项目 IP 安装环境 系统 192 168 201 147 tomcat jenkins centos8 redhat8 192 168 201 149 tomcat centos8 redhat8 需求 通过192
  • WPF_性能优化

    WPF Windows Presentation Foundation 是微软推出的基于Windows的用户界面框架 运行在 NET Framework 3 0及以上版本 WPF是基于DirectX引擎的 支持GPU硬件加速 在不支持硬件加
  • 任务 01、重塑视觉艺术:Midjourney AI绘画的无限可能

    1 1 任务目标 了解什么是MidJourney MidJourney公司简介 了解生成式人工智能MidJourney原理 MidJourney 能做什么 目前市面主流的Ai绘画工具有哪些 MidJourney的商业价值与企业应用 1 2
  • js逆向-ast-hook定位参数生成位置

    声明 本文仅供参考学习 切勿用于其他途径 违者后果自负 前言 不了解ast hook的小伙伴可以翻看上一篇文章 链接 ast hook 以一个简单的网站为例 网址 aHR0cHM6Ly93d3cueGluaXVkYXRhLmNvbS8 接口
  • 算法与数据结构学习笔记

    文章目录 常用排序方式的时间 空间复杂度以及稳定性的总结 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 基于插入排序 注意对比 5 归并排序 6 快速排序 最流行的排序算法 大多数情况都是最快的 7 堆排序 找出前几个前几个最大的
  • Ha-NeRF: Hallucinated Neural Radiance Fields in the Wild 代码复现与解读

    code GitHub rover xingyu Ha NeRF CVPR 2022 Ha NeRF Hallucinated Neural Radiance Fields in the Wild CVPR 2022 Ha NeRF Hal
  • 【批处理DOS-CMD-汇总】扩展变量-延迟变量cmd /v:on、cmd /v:off、setlocal enabledelayedexpansion、DisableDelayedExpansion

    Reference 批处理命令 for kaizen 博客园 Bat脚本之延时变量cmd v on komomon s blog的博客 CSDN博客 bat延迟变量 一 延迟变量 的存在背景 批处理的执行过程是 自上而下 逐条执行 而 逐条