【发布时间】:2014-01-08 15:00:25
【问题描述】:
我正在使用一个调用外部批处理文件并传入命令数组的 Java 程序。我在批处理文件中有一个如下所示的循环:
set paramCount=0
for %%x in (%*) do (
set /A paramCount+=1
set list[!paramCount!]=%%x
)
参数是一堆目录,存储为字符串,像这样:
String[] commands = {"cmd.exe",
"/C",
"C:\Users\user\Documents",
"C:\Users\user\Pictures",
"C:\Users\user\Videos"}
如您所见,我的 for 循环应该遍历传递给批处理文件 (%*) 的参数列表并在脚本中模拟一个数组(因为命令数组中的前两个元素用于启动命令进程,只留下要循环的目录)。该程序一直运行良好,直到前几天我突然开始收到一条错误消息:
Environment variable list[ not defined
我根本没有对批处理文件进行任何更改,它似乎无缘无故停止工作。如果有必要的信息,我正在使用流程构建器来运行流程:
ProcessBuilder pb = new ProcessBuilder(commands);
Process p = pb.start();
据说在批处理文件中对数组使用这种语法是可以的,所以我不确定它为什么不接受它。感谢您在此问题上提供的任何帮助。我在使用这个程序时遇到了很多障碍,虽然我已经能够解决其中的 90%,但剩下的 10% 已经开始让我发疯了!谢谢!
编辑: 我重新编写了循环并添加了一些回显命令以使调试更容易。但是,当我运行批处理文件时,由于回显,没有任何内容打印到屏幕上,但我仍然收到相同的错误:
@echo off
setlocal enableDelayedExpansion
set paramCount=0
for %%x in (%*) do (
echo !paramCount!
echo %%x
set list[!paramCount!]=%%x
set /A paramCount=paramCount+1
)
我还忘了提到当我从 Eclipse 运行 Java 时程序运行良好;它正确调用批处理文件,并且一切都按预期工作。在我将项目导出到可运行的 JAR 并尝试运行它之前,我不会收到错误消息。
编辑 2:
在再次查看我的批处理文件代码后(我之前写过),我发现只有一行看起来可能会导致这个问题。奇怪的是,我使用了在其他地方找到的几乎相同的代码示例来对其进行建模,并且它工作了很长时间而没有给出错误。这是一个循环,旨在循环遍历在第一个循环中创建的列表“数组”的元素:
for /F "tokens=2 delims==" %%d in ('set list[') do (
set /A paramCount+=1
set _dir=%%d
set _dir=!_dir:"=!
if NOT "%%d"=="nul" set "dirs[!paramCount!]=!_dir!"
)
如您所见,第一行有一段写着set list[,我觉得这很奇怪。但是,正如我所提到的,它在很长一段时间内都运行良好。
【问题讨论】:
-
This answer 可能有帮助
-
感谢您的链接。不幸的是,我不太确定它是否能帮助我解决这个特定问题。我正在使用延迟扩展来确保 !! 的工作。我确保 %...%s 和 !...!s 使用正确,顺序正确。该问题似乎与 paramCount 有关,因为它似乎只读取变量的 list[ 部分而不是完整的东西(“list[
]”)。不太清楚是什么原因造成的。 -
你使用了 setlocal enabledelayedexpansion 吗? paramCount+=1 最好是 paramCount=!paramCount!+1
-
@mihai_mandis 是的,它是我的批处理文件中的第一行,除了 echo off 语句。至于设置 paramCount,我不知道有什么不同。 += 是否会导致批处理文件出现问题?
-
应该不会造成问题,但是……我只是想说明一下。请在此处查看使用 %* 时的一些问题stackoverflow.com/questions/20617065/…
标签: java arrays batch-file environment-variables undefined