我正在处理一个调用外部批处理文件并传递一系列命令的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[
,这对我来说看起来很奇怪。然而,就像我之前提到的那样,它在相当长的一段时间内都能正常运行。
set /a parmCount+=1
完全没有问题。它不可能是问题的源头,我认为这是增加值的首选方式,但这主要是风格问题。 - dbenham