为什么 setlocal 会干扰 Windows 批处理文件中的 chdir?

2023-11-27

如果我运行批处理文件

setlocal
chdir ..

目录没有改变,但是如果我运行

setlocal
endlocal 
chdir ..

它工作正常。这一定正是 setlocal 所期望的。然而,当你阅读setlocal的定义时,并不完全明显,这与如何看待环境变量有关。我希望这是一个很好的机会来解释 setlocal 的实际作用以及它为什么会干扰 chdir。


SETLOCAL 的帮助文档(help setlocal or setlocal /?)实际上很好地解释了这种情况。唯一不明显的是“环境变化的本地化”不仅仅包括环境变量,还包括当前目录,以及延迟扩展和扩展状态。可能还有更多,但我暂时想不出来。

事实上,让你绊倒的事情已经得到了很好的解释:”当到达批处理脚本末尾时,将为该批处理脚本发出的任何未完成的 SETLOCAL 命令执行隐含的 ENDLOCAL。" 没有说明的是,对于被调用的子程序也是如此。

当批处理脚本结束时,隐式的 ENDLOCAL 会“擦除”CHDIR 的效果。第二个代码中的显式 ENDLOCAL 会让您返回根环境,因此您的 CHDIR 将被保留。


Update

当前目录不是环境变量,即使您通常可以使用以下命令获取当前值%CD%。你可以通过 tr 来证明SET CD- 它可能会给你“环境变量 CD 未定义”。如果您使用显式定义自己的真实 CD 变量set "CD=some value", then %CD%将返回您分配的值,而不是当前目录。

原始的 SETLOCAL 命令无法控制旧 COMMAND.COM 时代的延迟扩展或扩展。引入 CMD.EXE 时添加了启用/禁用 DelayedExpansion 和启用/禁用扩展选项。这就是微软决定实现该功能的方式。事情本来不必如此。在很多方面,不幸的是,如果没有 SETLOCAL/ENDLOCAL,您就无法控制这些状态。我经常希望能够在不本地化环境的情况下启用或禁用延迟扩展。

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

为什么 setlocal 会干扰 Windows 批处理文件中的 chdir? 的相关文章

  • 如何在后台运行python程序以保持活动窗口相同

    我编写了一个程序 可以将前景窗口更改为显示器尺寸的 85 并且要成功运行 前景窗口需要保持不变 我已将 python 脚本 pyw 放入批处理文件 运行 pythonw 并在桌面上创建了批处理文件的快捷方式 并提供了快速运行它的快捷方式 我
  • 批量设置命令的输出和错误以分隔变量

    在Windows 7批处理 cmd exe命令行 中 我试图将命令的标准输出 stdout 和标准错误 stderr 重定向到单独的变量 因此第一个变量设置为输出 第二个变量设置为输出 变量设置为错误 如果有 而不使用任何临时文件 我已经尝
  • 如何在安装过程中运行“.bat”文件?

    在安装项目中 诸如 exe dll js vbs 之类的可执行文件是可以接受的 但无法运行 bat自定义操作中的文件 问题是如何运行 bat安装过程中的文件 好吧 经过大量搜索和反复试验 我解决了这个问题 我不确定这是否是最好的方法 但它确
  • 如何获取Windows批处理的父文件夹

    我正在编写一个批处理文件 我需要获取该bat文件的父文件夹 有可能吗 注意 我的意思是批处理文件的父文件夹 而不是调用该批处理的提示的当前目录 Thanks 批处理的父文件夹位于变量中 dp0位于 例子 echo off setlocal
  • 批处理脚本 FOR 循环仅设置输出的第一个字母 wsl --list -q

    我正在编写一个批处理脚本 将文件从 Windows 目录复制到 WSL 发行版 其中一部分是选择将文件复制到哪个发行版 如果我使用命令wsl list q如果给我以下输出 Ubuntu 22 04 Ubuntu 18 04 我正在尝试使用此
  • 如何设置任务在使用 vbs 登录时以当前用户身份运行而无需管理员权限?

    从命令行 我可以创建一个在登录时运行的计划任务 无需管理员权限或用户输入密码来设置任务 但是我必须使用 xml 文件来执行此操作 下面是一个示例 xml 其中 Domain User 部分必须在运行时替换为当前用户的域和名称
  • Windows批处理文件:将结构转换为单行字符串

    我需要将这个艰巨的任务作为批处理文件来完成 这对于 C 来说不是最困难的 但在 DOS 中是一个地狱 至少对我来说 我需要将结构转换为单个 var 字符串 才能在我的程序中再次将它们转换为该结构 别担心回归 一切都已经完成了 该结构的大小会
  • 如何批量获取子字符串在字符串中的位置

    获取子串的位置 Set str1 This is Test string Set sstr Test 这里我需要获取 Test 8 的位置 谢谢 echo OFF SETLOCAL Set str1 This is Test string
  • 批处理文件中是否存在“Power to”功能? (指数)

    Problem 有没有办法将变量 乘以 数字或其他变量的批处理文件 有这个功能吗 Python 中的一个示例是您可以使用 为 到 的力量 EDIT 您可以在批处理文件中进行数学运算 http en wikipedia org wiki Ba
  • 小于或等于

    使用暂停命令我发现错误位于此代码的第一行 if choice 1 if energy gt m2enc set a enemhp enemhp m1hpd earmr pause set a energy energy m1enc set
  • 使用特定的 JRE 运行 JAR 文件

    在 Windows 上有没有办法使用位于特定文件夹中的 JRE 运行 JAR 文件 类似于 Eclipse 在您提供给它的某个路径中查找其 JRE 的方式 一些 Windows 可执行代码 C 或 C 或批处理文件都可以完成这项工作 谢谢
  • MD 和 MKDIR 批处理命令有什么区别?

    这两个命令都会创建文件夹 我read http www computerhope com mdhlp htmMKDIR 甚至可以创建子文件夹 这只是区别吗 为什么有两个命令做同样的事情 我应该使用哪一个 除了 npocmaka 的answe
  • 在重定向文件 (>output.txt) 中显示带重音符号的字符

    example mode con cp gt tmp output tmp notepad tmp output tmp show Statut du p riph rique CON Page de codes 850 代替 Statut
  • shutdown.exe 参数带有破折号或斜杠?

    我使用的电话shutdown exe重新启动安装了不同版本 Windows 的计算机 对于 Windows XP 命令是 shutdown exe r f t 01 对于其他版本的 Windows 我使用 shutdown exe L R
  • 如何将 .bat 文件中的变量获取到 PowerShell 脚本中?

    我正在用 PowerShell 替换 bat 脚本的部分内容 批处理文件的配置是通过以下文件完成的set适当的环境变量 我正在寻找一种方法将这些变量值加载到 ps1脚本 无需修改 bat文件 因为它们也在其他地方使用 一个例子 bat看起来
  • 为什么 %processor_architecture% 总是返回 x86 而不是 AMD64

    我正在尝试检索环境变量来检测系统是32位还是64位 但在64位服务器上环境变量 processor architecture 正在返回x86代替AMD64 有人对此有任何线索吗 您可能获得了错误的环境变量 如果您的应用程序是在 64 位操作
  • 如何使用批处理文件实现快速排序?

    虽然通常情况下 为工作选择正确的语言是件好事 但有时尝试用一种非常不合适的语言做一些事情可能会很有启发 它可以帮助您更好地理解问题 也许你不知道have按照您认为的方式解决它 它可以帮助您更好地理解该语言 也许它支持的功能比您想象的还要多
  • 如何查找具有特定模式的文件夹和文件

    我想编写一个批处理文件 该文件将写入日志包含特定模式以及排除文件夹的所有文件和文件夹 但没有成功 ECHO OFF for r c x in david do echo x findstr f exclude txt c x gt nul
  • 从命令行启用/禁用 Windows 10 中的设备 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个特定的硬件 我想在每次 Windows 重新启动时禁用并重新启用它 我创建了一个批处理脚本 该脚本应该执行此操作 然后运行我的程序
  • 找到第一个命中后停止 DIR 命令搜索

    在 CMD EXE 中我可以使用以下命令搜索某些内容DIR 以下面的例子为例 DIR C EXCEL EXE A D B S 虽然需要一段时间才能看清C 盘的整个结构 但是第一次匹配还是比较快的 Q 有没有办法自动地一旦发现命中 就停止命令

随机推荐

  • ADO.NET 实体框架:ORM 解决方案之间的决策

    我在选择 ORM 时正在为我的新应用程序寻找一些指南 我想通过 NHibernate 和 LINQ to SQL 来评估 EF 我需要来自这个美好社区的专家声音 您可以根据以下几点进行评估 可扩展性 学习曲线 便于使用 表现 ETC 嗯 在
  • 如何在部署时隐藏或加密我自己的keras模型文件(如h5)?

    我为应用程序制作了自己的模型 并将其保存在 Keras 中作为 h5 文件 我使用 PyQt5 制作了 GUI 应用程序 该应用程序使用此模型 我正在尝试在没有任何有关深度学习模型的信息的情况下部署此应用程序 我对这种情况有一些疑问 我可以
  • 取消文件链接失败。我应该再试一次吗?

    我的本地 git 存储库中的一个文件出现问题 当我尝试更改分支时 它说 Unlink of file templates media container html failed Should I try again y n 这意味着什么 这
  • 如何在 codeIgniter 中自定义表单验证错误

    codeIgniter 中是否有一个文件 我可以在其中进行编辑 以便自定义表单验证消息 我只是想将它们放在项目符号列表中以消耗更少的空间 这是我用来输出错误消息的代码 div class div
  • xsd.exe 生成了一个数组中包含多个元素的 C#

    我收到了一组 XML 架构文件 我无法更改 XML 因为这些有时会更新 我正在使用 xsd exe 将架构文件转换为生成的 C 代码 我无法使用任何第三方工具 XML 架构文件之一的一部分如下所示
  • 静态常量数据成员应该在哪里定义? [复制]

    这个问题在这里已经有答案了 我有课 class foo public foo foo int private static const string s 初始化字符串的最佳位置在哪里s在源文件中 任何地方在one编译单元 通常是 cpp 文
  • 模板文字作为 JSX 中的字符串内容

    我想知道在 JSX 标签内混合字符串值和变量的最佳实践是什么 我列出了我熟悉的选项 render const totalCount this state const totalCountStr Total count totalCount
  • 如何重新定义“迷你缓冲区”模式映射内的键?

    当在多个命令中接受正则表达式并提供 C p C n 历史导航时 我试图重新定义用于导航历史记录的键 除了 C p C n 之外 我还想使用其他键 例如当使用occur or 替换正则表达式 C p 和 C n 可用于转到上一个和下一个元素
  • 关联实体和关联关系属性之间的区别?

    关联实体和关联关系属性有什么区别 我的书 现代数据库管理 Hoffer 第 11 版 指出两者之间存在差异 它没有解释为什么会有差异 它只是举例说明它们的不同之处 一种关系 具有single与其关联的属性是关联关系属性 并用圆角矩形的虚线表
  • CORS 标头在浏览器中发生更改,导致内容被阻止

    更新2 完整日志 从客户的角度 请求标头 POST dev micro server php HTTP 1 1 主机 生产服务器 com连接 保持活动状态内容长度 86编译指示 无缓存缓存控制 无缓存接受 文本 html q 0 01起源
  • 无法使用 jQuery 正确设置 Accept HTTP 标头

    我正在尝试使用以下 jquery 代码将 Accept HTTP 标头设置为 text xml ajax beforeSend function req req setRequestHeader Accept text xml type G
  • R 中与跨度相关的 LOESS 警告/错误

    我正在 R 中运行 LOESS 回归 并且在一些较小的数据集上遇到了警告 警告消息 1 在 simpleLoess y x w 跨度 度数 度数 参数 参数化 在 2703 9 使用伪逆 2 在 simpleLoess y x w 跨度 度
  • 错误:在“INTO”处或附近多次指定 INTO

    在 postgresql 函数内 我试图将从表中选择的两个值放入两个变量中 但出现此错误 INTO specified more than once at or near INTO 这是 伪 代码 CREATE OR REPLACE FUN
  • 多对多关系示例

    我在这里和谷歌中没有找到任何 MYSQL 多对多关系示例 我正在寻找的是一个非常简单的示例 其中 php mysql 显示数据库的结果 有人可以写一个非常简单的例子吗 示例场景 大学的学生和课程 一个特定的学生可能会参加多门课程 当然一门课
  • 使用以反斜杠结尾的字符串时,ConvertTo-Json 会引发错误

    以下代码位会产生错误 W surge ogre gt SolutionDir W Surge ogre ConvertTo Json ConvertTo Json The converted JSON string is in bad fo
  • 在 dealloc 中调用 super 是否重要?

    void dealloc super dealloc receivedData release receivedData nil or void dealloc receivedData release receivedData nil s
  • 应用程序崩溃异常类型:EXC_CRASH (SIGKILL) 终止原因:命名空间 SPRINGBOARD

    我的应用程序最近被拒绝 因为该应用程序在启动时被 beta 测试人员崩溃 但在开发配置文件中运行它时 这种情况不会发生 我可以知道这个崩溃日志是什么意思 何时以及如何解决它 指南 2 1 性能 应用程序完整性 我们无法审核您的应用程序 因为
  • 多处理 - 管道与队列

    队列和管道之间的根本区别是什么Python 的多处理包 在什么情况下应该选择其中一种而不是另一种 什么时候使用比较有利Pipe 什么时候使用比较有利Queue 简短的摘要 截至 CY2023 此答案中描述的技术已经过时 这些天 您可以使用p
  • 如何更改Python-pptx创建的表格中文本的字体大小

    我正在创建一个脚本来显示产品性能图表 并创建一个表格来显示其零件编号 应用程序列表和当前应用程序的数量 但是 默认字体大小太大 无法将所有这些信息放入幻灯片中 需要减小 如何减小 Python pptx 表格中文本的字体大小 这就是我所拥有
  • 为什么 setlocal 会干扰 Windows 批处理文件中的 chdir?

    如果我运行批处理文件 setlocal chdir 目录没有改变 但是如果我运行 setlocal endlocal chdir 它工作正常 这一定正是 setlocal 所期望的 然而 当你阅读setlocal的定义时 并不完全明显 这与