gpt4 book ai didi

batch-file - Windows 批处理 : variable is lost after running another batch file

转载 作者:行者123 更新时间:2023-12-03 23:12:51 24 4
gpt4 key购买 nike

我有以下代码:

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set FILENAME=testfilename
for /L %%n in (1,0,10) do (
echo name-before: !FILENAME!
another-batch-file
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@echo off
echo name-after: !FILENAME!
)
@echo on
ENDLOCAL

运行时,以下内容会回显到控制台:

name-before:testfilename
name-after:!FILENAME!

变量 FILENAME 被设置为“testfilename”,并正确地回显到终端。但是,在另一个批处理文件完成后,无法解析 FILENAME 并且回显“FILENAME”而不是“testfilename”。我查看了被调用的批处理文件,但看不到任何明显的代码或设置会导致此问题。

我想知道是否存在明显的问题。谢谢

最佳答案

这里有很多事情要做。

  1. 调试批处理文件时的一些一般建议:删除顶部的 echo off 行。当您不抑制调试信息时,您可以学到令人惊奇的东西。

  2. 在循环中使用setlocal 几乎总是错误的。每次调用都会为环境 block 的完整副本分配资源,您不会调用 endlocal 来解除分配。

关于变量的回显,我无法重现您描述的行为。当我运行您的代码时,我得到 name-before: !FILENAME! 回显。当我使用下面解释的 CALL 关键字时,这会正确输出。

我怀疑主要问题是因为您调用“另一个批处理文件”的方式没有使用 CALL 关键字。一般来说,您从不想要直接从另一个批处理文件运行一个批处理文件。第二批完全取代了第一批,并且不会运行来自外部批处理的更多行。实际上,它用作 EXIT 语句。

:: This line executes
set foo=1

:: Now run another batch file
other.cmd

:: This line never executes, because this batch was canceled when
:: the other started running
set foo=2

解决方案是使用CALL 关键字来运行另一个批处理文件。然后当前的将在完成后继续执行。

:: Now run another batch file
CALL other.cmd

:: This line runs as normal
set foo=2

在您的代码中,很难说清楚,因为循环一直持续到当前语句 (for/L) 完成运行,但是您的最后一个 ENDLOCAL 以及该文件永远不会运行。

关于batch-file - Windows 批处理 : variable is lost after running another batch file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31097384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com