- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个简单的批处理文件(“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/
阅读了一些内容,但我正在努力解决这个问题。基本上,必须将 Setlocal 与启用和禁用延迟扩展一起使用才能使用和操作带有感叹号的变量。以下代码示例。代码部分可以在一个 session 中循环多次,在
是否可以在浏览器不刷新页面的情况下更改位置 url? 想象一下,我希望用户更改某些字段的某些值,因此要更新的是url(问号后面) 所以 www.mysite.com/mypage?level=1&fa
我正处于创建运算符(operator)工/客户系统的程序的开始阶段,现在我刚刚创建了登录 GUI,但我在使用 setLocation(); 方法。我将它设置为 250、250,但它使我的 GUI 的高
对于批处理新手而言,“变量延迟”这个概念很可能闻所未闻,但是,它却像一堵横亘在你前进道路上的无形高墙,你感受不到它的存在,但当你试图往前冲时,它会把你狠狠地弹回来,让你无法逾越、无功而返;而一旦找到
我正在尝试在批处理脚本中一起使用setlocal enabledelayedexpansion和cd,这似乎无法将更改持久化回shell。 我需要setlocal enabledelayedexpan
你怎么用setlocal在批处理文件中?我只是在学习脚本,并希望用非常简单的术语向我解释。 我有一个脚本停止并说 c:\superapp.out endlocal start notepad c:\s
这个问题已经有答案了: how to draw multiple rectangles (1 个回答) 已关闭 6 年前。 目前,此代码段通过鼠标单击移动已在框架上绘制的当前矩形。该点击的坐标转到变量
我有以下代码,我尝试将 JLabel 放置在 JFrame 上的自定义位置。 public class GUI extends JFrame { /** * * @para
使用 SSCCE 和变通方法编辑 我想以编程方式更改 JDialog 的位置。 public class SSCCE { public static void main(String[] pArg
我是 Java 新手。我正在尝试移动当前居中的 JButton,因此我将位置更改为静态位置但它没有移动。任何想法? public Main(BufferedImage image) { thi
在我的应用程序中,我使用 gps 获取地址、纬度和经度。我们还需要捕获视频并将该位置设置为视频。因此可以在视频-> 详细信息选项中看到这一点。 我用照片成功完成了,但无法用视频完成。 我为此使用 Me
这是我写的代码: super("Add contact"); setLayout(new FlowLayout()); IPAddress = new JLabel("IP Address"); IP
我不明白我做错了什么,输出始终是整个脚本,带有 Invalid parameter to setlocal 错误!这可能只是一个愚蠢的错误,但它让我发疯。 SETLOCAL ENABLEDELAYED
在 Windows 批处理文件中编写脚本时,有时脚本的正确执行需要使用 setlocal 命令。我对使用 setlocal 的主要提示是,我经常执行复杂的 for & if 语句,在这些语句中我在该代
我有一个带有一些功能的批处理文件。每个函数都使用 setlocal,这样它的变量就不会污染主批处理脚本。我注意到我第一次在主批处理脚本中而不是在每个嵌套的 setlocal 中只需要参数 ENABLE
我有以下代码,我尝试将 JLabel 放在 JFrame 上的自定义位置。 public class GUI extends JFrame { /** * * @param
试图在变量中保留感叹号。下面是一个简化的说明性脚本: echo off set testvar="C:\Windows\TestOfIllegals[!]" echo Pre-
我正在尝试制作一个简单的批处理文件(“javapath.bat”)以在需要时将 Java 编译器添加到路径中,这样它就不会一直在路径上。我还希望能够在其他构建脚本中执行类似 @call javapat
嘿,这是我的第二篇文章,所以不要生我的气,但我在使用 java 中的 JPanel 时遇到了问题。我正在尝试设置大小和位置,但它不起作用,我尝试过 repaint();但这不起作用。有什么帮助吗? 这
如何在 LWUIT 中设置按钮位置? public void error() { error = new Dialog(); e = new Label("EMPTY
我是一名优秀的程序员,十分优秀!