从Java中运行命令提示符?

4

你好,我想使用Java从命令提示符中运行一些东西。

我想进入以下目录:C:\Program Files\OpenOffice.org 3\program\ 然后运行 soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

我尝试过了,但是无法做到!

我的代码:

public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            Runtime rt = Runtime.getRuntime();
            //Process pr = rt.exec("cmd /c dir");

           // Process pr = rt.exec("cmd /c dir");

            Process pr = rt.exec(new String[]{"C:\\Program Files\\OpenOffice.org 3\\program\\soffice", 
                    "-headless",
                    "-accept='socket,host=127.0.0.1,port=8100;urp;'",
                    "-nofirststartwizard"});

            BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));

            String line=null;

            while((line=input.readLine()) != null) {
                System.out.println(line);
            }

            int exitVal = pr.waitFor();
            System.out.println("Exited with error code "+exitVal);

        } catch(Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
        }
    }

1
你遇到了什么样的错误?可能是因为soffice没有在你的系统路径中。 - joekarl
请提供最小完整的代码以展示问题行为,并附上堆栈跟踪。 - jcomeau_ictx
@joekarl 以错误代码0退出。 - Harinder
@jcomeau-ictx 不是,当我直接从命令提示符运行它时,它就在那里。 - Harinder
6个回答

6

不要使用 cd 命令,而是使用字符串数组方法:

rt.exec(new String[]{"C:\\Program Files\\OpenOffice.org 3\\program\\soffice.exe", 
    "-headless",
    "-accept='socket,host=127.0.0.1,port=8100;urp;'",
    "-nofirststartwizard"});

我可以先更改目录,然后运行 "soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard" 吗? - Harinder
不,你不能先更改目录。 - OscarRyz
@Harinder,我更新了答案,包括.exe,你可以用这个新的命令行再试一次吗?顺便说一下,在这里你不能也不需要使用cd - Thomas Mueller

3

最终我解决了它

String[] SOFFICE_CMD = { "C:/Program Files/OpenOffice.org 3/program/soffice", "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager", "-invisible", "-nologo"}; 
        Runtime.getRuntime().exec(SOFFICE_CMD); 

感谢大家的支持!

2

@Harinder: 我想提供一种替代方法。你可以:

  1. 首先,直接从命令提示符中运行带有所有属性等的所需内容。一旦成功地从命令提示符中直接运行服务/应用程序,请执行第2步。

  2. 将命令保存在.bat文件中。

例如:C:\m-admin\app.exe 我将其保存为app.bat在C:\上。

  1. 现在根据需要修改Java代码以执行此脚本,该脚本将反过来执行您的应用程序或服务。
例如:
 ProcessBuilder builder = new ProcessBuilder(new String[]{"cmd", "/c","C:\\app.bat"});
 Process pr =   builder.start();
 BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
  1. 如果即使这样也不起作用...我们需要重新开始。

1

我认为我已经找到了你的错误:将你的参数更改为以下内容:看看它是否有效:

(new String[]{"cmd", "/c", "C:\\Program Files\\OpenOffice.org 3\\program\\soffice",
            "-headless",
            "-accept='socket,host=127.0.0.1,port=8100;urp;'",
            "-nofirststartwizard"})

我认为您关于先更改目录是正确的。请再次查看上面的代码……我对最初发布的东西进行了一些编辑…… - knurdy
@Harinder:我正在做最后的努力,我已经对上面进行了一些编辑...请为我尝试这个... - knurdy
如果我删除“cmd”、“/c”,然后运行这个命令,我会得到“无法运行程序“C:\Program Files\OpenOffice.org 3\program”:CreateProcess error=5, Access is denied”的错误提示。 - Harinder
以下对我有效:new String[]{"cmd", "/c","C:\\m-admin\\app.exe"} 您成功运行了吗?如果是,请发布您的解决方案。 - knurdy
@knurdy,你在回答中忘记了 soffice 之后的 .exe(好吧,我也忘了...) - Thomas Mueller
甚至 ProcessBuilder builder = new ProcessBuilder(new String[]{"cmd", "/c", "C:\Program Files\OpenOffice.org 3\program\soffice.exe"}); 无法打开我的应用程序。 - Harinder

1

我使用进程构建器方法编辑了下面的代码。看看这是否适用于您。由于访问违规,有时使用exec不起作用:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        Runtime rt = Runtime.getRuntime();
        //Process pr = rt.exec("cmd /c dir");

       // Process pr = rt.exec("cmd /c dir");
       ProcessBuilder builder = new ProcessBuilder(new String[]{"cmd", "/c", "C:\\Program Files\\OpenOffice.org 3\\program", "soffice",
        "-headless",
        "-accept='socket,host=127.0.0.1,port=8100;urp;'",
        "-nofirststartwizard"});
       Process pr =   builder.start();
       BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));


        String line=null;

        while((line=input.readLine()) != null) {
            System.out.println(line);
        }

        int exitVal = pr.waitFor();
        System.out.println("Exited with error code "+exitVal);

    } catch(Exception e) {
        System.out.println(e.toString());
        e.printStackTrace();
    }
}

}


我希望在运行soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard时,C:\Program Files\OpenOffice.org 3\program\成为我的目录。 - Harinder

0

退出状态 0 通常表示没有错误。

尝试使用 ProcssBuilder 替代。

使用 ProcessBuilder,您可以设置 工作目录

这里 一些 链接 可能会有所帮助。


顺便说一句,如果你想启动应用程序,也可以尝试使用 Desktop.open(),但我不确定那是否是你需要的。 - OscarRyz
我想让 C:\Program Files\OpenOffice.org 3\program\ 成为我的目录,当我运行 soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard 时。 - Harinder
其实我正在尝试运行一个服务。 - Harinder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接