java - 从 Java 调用的 Setx 无法正常工作

标签 java windows batch-file environment-variables

我正在使用 setx 命令来修改 PATH 系统环境变量。这是我正在使用的命令:

setx PATH "%PATH%;C:\Python34" /M

当它作为 batch 文件和 administrator 运行时,它可以正常工作并将新条目添加到 PATH 中。

但是,如果我尝试从我的 Java 应用程序中运行它,它就会开始表现得很奇怪。

首先是用于执行批处理文件的Java代码:

import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.IOUtils;

public class BatchFile
{
    public static void execute(String batchFilePath) throws IOException,
            InterruptedException
    {
        Process process = Runtime.getRuntime().exec("cmd /c " + batchFilePath);
        process.waitFor();

        printResults(process);
    }

    private static void printResults(Process process) throws IOException
    {
        String standardOutput = getString(process.getInputStream());
        String standardError = getString(process.getErrorStream());

        if (!standardOutput.equals(""))
        {
            System.out.println(standardOutput);
        }

        if (!standardError.equals(""))
        {
            System.out.println(standardError);
        }
    }

    private static String getString(InputStream inputStream) throws IOException
    {
        return IOUtils.toString(inputStream).trim();
    }
}

像这样调用:

BatchFile.execute("MyBat.bat");

在运行之前,我的PATH看起来像这样:

c:\devkitPro\msys\bin;C:\devkitPro\devkitPPC\bin;C:\devkitPro\devkitPPC\powerpc-eabi\bin;C:\Program Files\Java\jdk1.8.0_45\bin;C:\ProgramData\Oracle\Java\javapath;C:\Python27\Lib\site-packages\PyQt4;C:\devkitPro\devkitARM\bin;C:\Python27\Lib\site-packages\PyQt4;C:\Program Files (x86)\Wiimm\WIT;C:\Windows\System32;C:\MinGW\bin;C:\MinGW\libexec\gcc\mingw32\4.8.1;C:\Python34;C:\MinGW\msys\1.0\bin;C:\Program Files (x86)\Git\cmd;C:\Windows\SysWOW64;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\MiKTeX 2.9\miktex\bin\;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files (x86)\Skype\Phone\

但是运行Java代码后,它变成了这样:

C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin/server;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/lib/amd64;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin/server;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/lib/amd64;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin/server;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/lib/amd64;c:\devkitPro\msys\bin;C:\devkitPro\devkitPPC\bin;C:\devkitPro\devkitPPC\powerpc-eabi\bin;C:\Program Files\Java\jdk1.8.0_45\bin;C:\ProgramData\Oracle\Java\javapath;C:\Python27\Lib\site-packages\PyQt4;C:\devkitPro\devkitARM\bin;C:\Python27\Lib\site-packages\PyQt4;C:\Program Files (x86)\Wiimm\WIT;C:\Windows\System32;C:\MinGW\bin;C:\MinGW\libexec\gcc\mingw32\4.8.1;C:\Python34;C:\MinGW\msys\1.0\bin;C:\Program Files (x86)\Git\cmd;C:\Windows\SysWOW64;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\MiKTeX 2.9\miktex\bin\;C:\Program Files 

控制台打印出的信息如下:

D:\Programs\Portable\Eclipse\workspace\My Application>setx PATH "C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin/server;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/lib/amd64;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin/server;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/lib/amd64;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin/server;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/bin;C:/Program Files/Java/jdk1.8.0_45/bin/../jre/lib/amd64;c:\devkitPro\msys\bin;C:\devkitPro\devkitPPC\bin;C:\devkitPro\devkitPPC\powerpc-eabi\bin;C:\Program Files\Java\jdk1.8.0_45\bin;C:\ProgramData\Oracle\Java\javapath;C:\Python27\Lib\site-packages\PyQt4;C:\devkitPro\devkitARM\bin;C:\Python27\Lib\site-packages\PyQt4;C:\Program Files (x86)\Wiimm\WIT;C:\Windows\System32;C:\MinGW\bin;C:\MinGW\libexec\gcc\mingw32\4.8.1;C:\Python34;C:\MinGW\msys\1.0\bin;C:\Program Files (x86)\Git\cmd;C:\Windows\SysWOW64;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\MiKTeX 2.9\miktex\bin\;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files (x86)\Skype\Phone\;D:\Programs\Portable\Eclipse;;C:\Python34" /M 

SUCCESS: Specified value was saved.
WARNING: The data being saved is truncated to 1024 characters.

可以看到,PATH内容的开头添加了很多Java垃圾目录,超过了1024个字符的最大限制,所以最后就被截断了。最后添加了一个不需要的 Eclipse 目录,并且在实际的 Python 路径之前还有两个分号。

使用 Java 调用批处理文件时如何消除不需要的行为?我想要正确的默认行为,例如在 cmd 上正常调用 setx 命令时.

最佳答案

不久前我也遇到了同样的问题。

简单的答案是: 不要使用 eclipse 来启动您的程序。

Eclipse 会为了执行而大量改变你的环境变量。 (包括路径) 您现在可能已经猜到了,但是 Eclipse 用 ; 关闭 PATH。所以当你打电话时

setx PATH "%PATH%;C:\Python34" /M 

你添加另一个;在 python 路径前面。

只需将批处理更改为即可进行检查

echo %PATH%

然后从 eclipse 运行并从命令行 (java -cp . MyMainClass) 进行另一次测试运行以查看差异。

关于“警告:正在保存的数据被截断为 1024 个字符。” setx 的限制你可能想看看:https://superuser.com/questions/387619/overcoming-the-1024-character-limit-with-setx

关于java - 从 Java 调用的 Setx 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32208542/

相关文章:

batch-file - Windows 批处理文件将 1000 个文件分组到字母数字文件夹中

java - 无边框打印 JTable 的数据

java - <level value ="info"/> 在日志文件中显示调试语句

c++ - 如何使用注册表中的 CurrentVersion\Run 键为特定用户自动启动程序?

Python 循环在 Window 的解释器中不断停止

java - 无法识别“javac”且未找到 rmiregistry

java - DialogDisplayer 文本可复制

java - 在 Java 返回类型中强制执行多个泛型边界

windows - 插入 USB 设备时如何自动运行 Python 脚本?

sql - 带有馈线和批处理文件的语法 SQL 多行?