批处理文件:“未定义环境变量”

时间:2013-12-19 21:21:33

标签: java arrays batch-file environment-variables undefined

我正在使用一个调用外部批处理文件的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:

再次浏览我的批处理文件代码后(我刚才写了),我发现只有一行看起来可能会导致这个问题。奇怪的是,我使用了一个几乎相同的代码示例,我在其他地方找到了它的模型,并且它工作了很长时间而没有给出错误。它是一个循环,旨在循环遍历在第一个循环中创建的列表“array”的元素:

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[,这看起来很奇怪。但是,正如我所提到的,它在很长一段时间内都运行良好。

3 个答案:

答案 0 :(得分:1)

您发布的代码无法提供该错误消息。您的脚本中必须有一些其他代码导致该错误。

只有没有=的SET语句才能给出错误。解析和扩展后,违规语句必须如下所示:

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

实际上,如果有错误的引号,您可以在=出现时收到该错误。例如,以下内容将给出该错误,因为忽略了上一个"之后的所有文本:

set "list["1]=value

1]=value显示在最后一个"之后,将被忽略,离开set "list["

您可以考虑启用ECHO,以便准确查明错误消息的发生位置。然后你需要弄清楚在那时可能导致错误的条件。


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

新发布的代码中的IN()子句几乎肯定是生成错误消息的点。它表示在执行FOR / F循环时未定义列表“数组”。问题是,为什么不呢?需要注意的事项:

  • 是否阻止了早期的FOR循环定义列表“array”的运行?

  • 您确定参数是否正确传递给脚本?如果没有参数,则不会有数组。

  • 在第二个FOR循环有机会执行之前是否取消了数组?

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

答案 1 :(得分:0)

我尝试了下面的代码,从命令行调用时它对我有用。

@echo off
setlocal enabledelayedexpansion

set paramCount=0

for %%x in (%*) do (
    set /A paramCount=!paramCount!+1
    set list[!paramCount!]=%%x
)
echo !list[1]!
echo !list[2]!
echo !list[3]!

答案 2 :(得分:0)

我在评论中提到过,但我想我会发布一个答案,对于其他任何想知道的人:

如前所述,程序在Eclipse中正常运行,批处理文件正在调用并按预期运行。但是,在对批处理文件进行一些更改之前,我已经从它们创建了.exe,并且显然正在运行.bat的.exe的instad。这对我来说是一个非常愚蠢的错误,问题是由以前版本的批处理文件中的一些错误引起的。如果我没记错的话,那个错误是因为“数组元素”是空的。所以我最终做了检查以确保在操作之前它不是空的。以下是我目前使用的代码,它按预期工作:

@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 )

感谢所有答案,伙计们!