【问题标题】:Batch and the for loop批处理和 for 循环
【发布时间】:2010-04-30 17:20:13
【问题描述】:

我有一个由 .cmd 文件启动的 java 应用程序。我想通过这个批处理设置应用程序的类路径,所有需要的jar都到一个lib文件夹中。

这是我尝试过的:

 set _classpath=.
for %%i in (%1/lib/*.*) do ( set _classpath=%_classpath%;%%i )

令人惊讶的是,它似乎没有按预期运行。假设 lib 文件夹中有 3 个 jar:

  • 皮卡丘.jar
  • sonic.jar
  • mario.jar

这是发生了什么:

  1. 设置_classpath=。
  2. 设置_classpath=.;pikachu.jar
  3. 设置 _classpath=.;sonic.jar
  4. 设置 _classpath=.;mario.jar

显然,我想要得到的是

  • 设置 _classpath=.;pikachu.jar;sonic.jar;mario.jar

有什么想法吗?

感谢和问候,

【问题讨论】:

  • 为什么需要一个批处理文件来包含类路径?你见过新的 Java 6 技巧吗-cp "lib/*" 这将包括 lib 目录中的所有 jars
  • 不幸的是,需要使用java 5...但是谢谢你,对java 6项目肯定有用。

标签: java batch-file classpath


【解决方案1】:

将其放在批处理文件的顶部:

setlocal enabledelayedexpansion

然后在 for 循环中,将 %_classpath% 替换为 !_classpath!

如果不启用延迟扩展,%_classpath% 在 for 循环开始时会扩展一次。


[编辑]作为对评论的回应,这里是完整的代码清单

@echo off
setlocal enabledelayedexpansion

set _classpath=.
for %%i in (%1/lib/*.*) do (
    set _classpath=!_classpath!;%%i
)

echo %_classpath%
pause

【讨论】:

  • 感谢 BlueRaja(也感谢 Richard。),使用这种方法时还会出现另一个问题。我可以看到类路径看起来类似于循环结束时的内容: .;pikachu.jar ;sonic.jar ;mario.jar 空格是出乎意料的,会受到伤害。你知道摆脱它们的快速方法吗?我想我们可以对 %%i 进行正确的修剪?
  • @Farid:这是因为您在块的末尾有一个空格。请参阅编辑后的答案。
【解决方案2】:

CMD.EXE 在运行循环之前扩展%...%

您需要延迟变量扩展,这在命令提示符的set /? 中有说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多