gpt4 book ai didi

batch-file - 使用 setlocal 后如何正常设置变量?

转载 作者:行者123 更新时间:2023-12-02 06:18:56 24 4
gpt4 key购买 nike

我正在尝试制作一个简单的批处理文件(“javapath.bat”)以在需要时将 Java 编译器添加到路径中,这样它就不会一直在路径上。我还希望能够在其他构建脚本中执行类似 @call javapath.bat 的操作,以便在需要时自动添加路径。由于这些将在编辑-保存-编译-运行的过程中重复运行,这意味着 javapath.bat 需要检查 Java 是否已经在路径上,如果是,则不读取它,因为显然微软认为这是一个好主意让路径变量有很多愚蠢的重复项。

因此,为了检测是否需要添加它,我使用 setlocal 启用“命令扩展”,这样我就可以使用环境变量字符串替换。这种丑陋效果很好。

然后我使用 endlocal 这样我就可以实际设置环境变量,而不会在脚本末尾恢复更改。那是行不通的。或者,它肯定会阻止变量更改被恢复,但这是不正常的:它完全阻止它们在本地可见,但之后它们仍然可见。

@echo off
setlocal enableextensions
if "%path:jdk1=%"=="%path%" (
endlocal
set ANT_HOME=C:\Program Files\Java\ant
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_07
path %ANT_HOME%\bin;%path%
path %JAVA_HOME%\bin;%path%
)

完成上述操作后,ANT_HOME 和 JAVA_HOME 就设置好了。但是 PATH 的唯一变化是“\bin;”已经添加到它前面,因为在脚本期间设置的变量似乎直到之后才可见(所以 ANT_HOME 和 JAVA_HOME 是空白的,并且忘记了对 PATH 的第一次更改)。因此,运行它两次 可以将 Java 添加到路径中,而不是 Ant。我可以对路径进行两次硬编码,但这种行为是如此奇怪和荒谬,我已经坚持了一个小时。

编辑:添加 enabledelayedexpansion 也没有效果。

最佳答案

@echo OFF
ECHO starting %PATH%
if "%path:jdk1=%"=="%path%" CALL :addjava
ECHO.
ECHO resulting %PATH%
GOTO :eof

:addjava
set ANT_HOME=C:\Program Files\Java\ant
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_07
SET "path=%ANT_HOME%\bin;%JAVA_HOME%\bin;%path%"
GOTO :eof

这就是我要使用的 - 其他方法与最小解释的右括号问题冲突。

理解这种奇怪行为的关键是历史。 Batch 始终将任何 %var% 的解析时值替换到代码中,然后验证结果并在有效时执行。随着语言的发展,有必要保持与现有批处理的兼容性,因此您只能添加新的关键字和功能,而不能删除或更改功能。

因此,随着调用内部子程序的能力被添加,并且在单行上使用 '&' 级联指令并允许 if 的多行指令code>for 通过将指令括在括号中引入,并且需要在文件或目录名称中使用空格和其他分隔符的能力,批处理语言开始有一些小怪癖。

! 访问作为 setlocal 的子句调用的变量的运行时值是一个非常奇怪的决定 - 就我个人而言,我会使用了类似 ECHO on/off 的开关(即 EXPANSION on/off),但我没有运行该项目。同样,DATE 本来可以配备一个 /u 开关来以通用形式返回日期,但是机会错失了(并且继续错失, NT4 后 17 年和 5 代之后...)

关于batch-file - 使用 setlocal 后如何正常设置变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16696892/

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