【批处理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 的相关文章

  • 为什么 FindWindow 找到了 EnumChildWindows 找不到的窗口?

    我正在寻找一个类名称为 CLIPBRDWNDCLASS 的窗口 它可以在办公应用程序和其他应用程序中找到 如果我使用 FindWindow 或 FindWindowEx 我找到第一个具有此类的 HWND 但我想要all具有该类的窗口 因此我
  • Python 在 anaconda 中找不到 h2o 包

    当我尝试导入 h2o 时 我被告知该包不存在 当我尝试安装它时 它告诉我它已经存在 我尝试将其从计算机中删除并重新安装 但没有成功 此时我能想到的只是一些环境变量 C Users Lanier Anaconda2 C Users Lanie
  • 如何使用 Apache Arrow 在 Windows 上使用 C++ 编写 Parquet 格式的文件?

    我正在尝试使用 C 在 Windows 上编写 Parquet 文件 我按照我找到的说明进行操作here https github com apache arrow blob master docs source developers cp
  • 什么是标准 unicode 字体?

    以下操作系统的标准 unicode 字体是什么 视窗XP 视窗Vista Window 7 按照标准 我的意思是它们存在于操作系统的全新安装中 无需将它们作为附加包安装 我一直在寻找同样的东西 看起来所有 Win 操作系统中只有一种字体 L
  • 有没有办法回显所有驱动器/分区的列表,例如 C:\ D:\ E:\ 等并提示用户选择其中一个来执行某些功能?

    我想知道是否有一种方法可以检查并回显 PC 上所有可用驱动器 分区的列表 并提示用户通过输入字母并按 Enter 提交来选择其中一个 然后批处理文件将继续 理想的结果可能是怎样的 echo off echo List all drives
  • Windows 任务计划程序报告不正确/不一致的结果代码

    背景 我正在尝试在计划任务失败时收到电子邮件通知 我的任务可以通过退出代码 错误级别 指示失败 我想使用它并遵循中描述的过滤方法这个答案 https stackoverflow com a 4289360 29805触发电子邮件 Probl
  • Sigar API for JAVA(需要指南)

    我已经下载了 Sigar API http support hyperic com display SIGAR Home http support hyperic com display SIGAR Home 并希望在项目中使用它来获取有关
  • 如何使用c++获取system32目录的完整路径?

    虽然大多数时候都是C WINDOWS system32 但有时它可以在D分区或类似的 如何以编程方式获取它 可以调用Windows API函数SHGetFolderPath http msdn microsoft com en us lib
  • 设置表单的父级

    我有一个 Windows 表单 我想从中打开一个状态表单 上面写着 正在保存 然后保存完成后消失 我想将这个小状态表单放在调用表单的中间 我尝试将 StartPosition 属性设置为 CenterParent 但它不起作用 我从其他表单
  • Django - 该进程无法访问该文件,因为该文件正在被另一个进程使用

    我正在尝试在 Windows 10 上运行 Django 我是 Django 的新手 我正在使用 Compressor Toolkit 我的问题是 我可以运行 manage py 但本地主机说 base html 第 9 行出错该进程无法访
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li
  • 如何使用 setuptools Windows 安装程序在开始菜单中创建快捷方式

    我想为我的 Python Windows 安装程序包创建开始菜单或桌面快捷方式 我正在尝试遵循https docs python org 3 4 distutils builtdist html the post 安装脚本 https do
  • 从 EC2 W2008 实例创建 AMI - 为什么从来没有获得密码?

    我正在尝试做什么 我正在尝试克隆 EC2视窗2008通过管理控制台实例 该实例基于 Windows Server2008 i386 Base v104 ami 92ba43fb 但上面安装了许多应用程序 我想为新实例保留这些应用程序 发生了
  • Windows:列出并启动与扩展关联的应用程序

    如何确定与特定扩展名 例如 JPG 关联的应用程序 然后确定该应用程序的可执行文件所在的位置 以便可以通过调用 System Diagnostics Process Start 来启动它 我已经知道如何读取和写入注册表 注册表的布局使得以标
  • 操作系统什么时候清除进程的内存

    进程在某些操作系统上成功或异常终止 操作系统何时决定擦除分配给该进程的内存 数据 代码等 在退出时或当它想为新进程分配内存时 这个清除内存分配过程在所有操作系统 winXP Win7 linux Mac 上都相同吗 据我了解 页表具有该进程
  • 如何正确使用和实例化现有预览处理程序

    我正在尝试使用现有的预览处理程序来显示文件的预览 我编写了一个简单的测试程序 以 1 查找给定文件的预览处理程序的 CLSID 2 实例化预览处理程序 3 通过流或文件初始化它 4 在基本窗口上渲染预览 这有效 或多或少 It works
  • GOPATH值设置

    我用go1 3 1 windows amd64 msi安装go 安装后GOROOT是默认设置 我发现 D Programs Go bin 在 PATH 中 然后我创建一个 GOPATH 环境变量 使用 go get 命令时 出现错误 软件包
  • 在远程桌面上使用 Powershell 获取 Windows DisplayLanguage

    我正在尝试通过 powershell 获取 Windows 显示语言设置远程计算机 我尝试了 Get WinUserLanguageList 但这会返回所有语言的列表 Get WinSystemLocale 和 Get Culture 也不
  • 在 powershell 脚本中以不同用户身份本地运行代码块

    这是非常简单的事情 但我就是无法让任何东西发挥作用 我想在特定用户下的 powershell 脚本中运行块代码 关键字是locally我正在使用 powershell 2 0 Invoke Command 似乎需要远程主机 我运行以下命令

随机推荐

  • 【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延迟变量 一 延迟变量 的存在背景 批处理的执行过程是 自上而下 逐条执行 而 逐条