gpt4 book ai didi

java - 批处理文件 : "Environment Variable Not Defined"

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:35 25 4
gpt4 key购买 nike

我正在使用调用外部批处理文件并传入命令数组的 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 命令以使调试更容易。但是,当我运行批处理文件时,由于回显,没有任何内容打印到屏幕上,但我仍然遇到相同的错误:

@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 语句才会出现该错误。解析和扩展后,有问题的语句必须类似于以下之一:

set list[
set "list[
set "list["

实际上,如果有错位的引号,您可能会在出现 = 时遇到该错误。例如,以下将给出该错误,因为最后一个 " 之后的所有文本都将被忽略:

set "list["1]=value

1]=value 出现在最后一个 " 之后并被忽略,留下 set "list["

您可以考虑启用 ECHO,以便您可以准确查明错误消息出现的位置。然后您需要弄清楚什么条件可能会导致此时的错误。


更新以回应有问题的“编辑 2:”

几乎可以肯定,新发布的代码中的 IN() 子句就是生成错误消息的地方。它表示执行 FOR/F 循环时未定义列表“array”。问题是,为什么不呢?要寻找的东西:

  • 是否有什么阻止了定义列表“数组”的早期 FOR 循环的运行?

  • 您确定参数已正确传递给脚本吗?如果没有参数,那么就不会有数组。

  • 在第 2 个 FOR 循环有机会执行之前是否取消了对数组的定义?

我建议您放入一些诊断性 ECHO 语句来帮助调试。例如, ECHO BEFORE 1ST LOOP 紧接在定义数组的循环之前,以确保到达循环。或者在脚本开头使用 ECHO ARGS = %* 来确保参数正确传递。快乐侦查:-)

关于java - 批处理文件 : "Environment Variable Not Defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20691925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com