Der*_*om8 5 java arrays batch-file environment-variables undefined
我正在使用一个 Java 程序,该程序调用外部批处理文件并传入一组命令。我在批处理文件中有一个循环,如下所示:
set paramCount=0
for %%x in (%*) do (
set /A paramCount+=1
set list[!paramCount!]=%%x
)
Run Code Online (Sandbox Code Playgroud)
参数是一堆目录,存储为字符串,如下所示:
String[] commands = {"cmd.exe",
"/C",
"C:\Users\user\Documents",
"C:\Users\user\Pictures",
"C:\Users\user\Videos"}
Run Code Online (Sandbox Code Playgroud)
如您所见,我的 for 循环应该循环遍历传递给批处理文件 (%*) 的参数列表,并模拟脚本中的数组(因为命令数组中的前两个元素用于启动命令过程,只留下要循环的目录)。该程序运行得很好,直到有一天,我突然开始收到一条错误消息,内容如下:
Environment variable list[ not defined
Run Code Online (Sandbox Code Playgroud)
我根本没有对批处理文件进行任何更改,它似乎无缘无故地停止工作。如果有必要的信息,我将使用流程构建器来运行该流程:
ProcessBuilder pb = new ProcessBuilder(commands);
Process p = pb.start();
Run Code Online (Sandbox Code Playgroud)
据说在批处理文件中对数组使用这种语法是可以的,所以我不确定为什么它不接受它。感谢您在此事上提供的任何帮助。我在使用这个程序时遇到了很多障碍,虽然我已经解决了 90% 的障碍,但剩下的 10% 已经开始让我发疯了!谢谢!
编辑: 我重写了循环并添加了一些 echo 命令以使调试更容易。但是,当我运行批处理文件时,由于回显,屏幕上没有打印任何内容,但我仍然收到相同的错误:
@echo off
setlocal enableDelayedExpansion
set paramCount=0
for %%x in (%*) do (
echo !paramCount!
echo %%x
set list[!paramCount!]=%%x
set /A paramCount=paramCount+1
)
Run Code Online (Sandbox Code Playgroud)
我还忘了提到,当我从 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!"
)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,第一行有一个段显示set list[,这对我来说看起来很奇怪。然而,正如我所提到的,它在相当长的一段时间内运行良好。
我在评论中提到了这一点,但我想我应该为其他想知道的人发布一个答案:
如前所述,程序在 Eclipse 中运行良好,批处理文件被调用并按预期运行。然而,在对批处理文件进行一些更改之前,我已经从它们创建了 .exe,并且显然正在运行 .exe,而不是 .bat。对我来说这是一个非常愚蠢的错误,该问题是由以前版本的批处理文件中的一些错误引起的。如果我没记错的话,该错误是因为“数组元素”为空。因此,我最终进行了检查,以确保在对其进行操作之前它不为空。以下是我当前使用的代码,它按预期工作:
@echo off
setlocal ENABLEDELAYEDEXPANSION
set /A paramCount=-3
for %%x in (%*) do (
set list[!paramCount!]=%%x
set /A paramCount=paramCount+1
)
set argA=%list[-3]%
set argB=%list[-2]%
set argC=%list[-1]%
for /F "tokens=2 delims==" %%a in ('set list[-') do SET "%%a="
set list[-3]=""
set list[-2]=""
set list[-1]=""
set paramCount=0
for /F "tokens=2 delims==" %%d in ('set list[') do (
if not "%%d"=="" (
set _dir=%%d
set _dir=!_dir:"=!
if NOT "%%d"=="nul" set "dirs[!paramCount!]=!_dir!"
)
set /A paramCount+=1 )
Run Code Online (Sandbox Code Playgroud)
谢谢大家的回答!