首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java调用的Setx不能正常工作

从Java调用的Setx不能正常工作
EN

Stack Overflow用户
提问于 2015-08-25 15:51:49
回答 1查看 359关注 0票数 1

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

代码语言:javascript
复制
setx PATH "%PATH%;C:\Python34" /M

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

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

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

代码语言:javascript
复制
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();
    }
}

像这样被引用:

代码语言:javascript
复制
BatchFile.execute("MyBat.bat");

在运行之前,我的PATH如下所示:

代码语言:javascript
复制
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代码之后,它会变成以下内容:

代码语言:javascript
复制
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 

正在控制台上打印的消息如下:

代码语言:javascript
复制
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.

正如您所看到的,许多垃圾Java目录在开始时被添加到PATH内容中,并且它超过了1024个字符的最大限制,所以它在末尾被切断。最后,添加了一个不需要的Eclipse目录,在实际的Python路径之前还有两个分号。

如何在使用调用批处理文件时消除不必要的行为--我想要正确的默认行为,比如在cmd上正常调用setx命令时。

EN

回答 1

Stack Overflow用户

发布于 2015-08-25 16:45:57

不久前,我被困在同一个问题上。

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

Eclipse将在执行过程中更改您的环境变量。(包括路径)您现在可能已经猜到了,但是eclipse用一个;所以当您调用

代码语言:javascript
复制
setx PATH "%PATH%;C:\Python34" /M 

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

只需将批处理更改为

代码语言:javascript
复制
echo %PATH%

然后从eclipse运行,并从命令行(java -cp )进行另一次测试。( MyMainClass)看不同之处。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32208542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档