【问题标题】:Run command prompt from java?从java运行命令提示符?
【发布时间】:2011-06-08 05:09:17
【问题描述】:

嗨,我想使用 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();
        }
    }

【问题讨论】:

  • 您遇到了什么样的错误? soffice 可能不在您的系统路径中。
  • 请发布显示问题行为的最低完整代码,并发布堆栈跟踪。
  • @joekarl 退出,错误代码为 0
  • @jcomeau-ictx na 当我从命令提示符直接运行它时,它就在那里

标签: java command-line


【解决方案1】:

不要使用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 我更新了答案以包含.exe,你能用这条新线再试一次吗?顺便说一句,你不能也不需要在这里使用cd
【解决方案2】:

终于解决了

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

感谢大家的支持!!

【讨论】:

    【解决方案3】:

    @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. 如果连这都行不通……我们需要从头开始。

    【讨论】:

      【解决方案4】:

      我已经使用流程构建器方法编辑了代码(如下)。看看这是否适合你。由于访问冲突,使用 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();
          }
      }
      

      }

      【讨论】:

      • 我希望 C:\\Program Files\\OpenOffice.org 3\\program\\ 在我运行 soffice -headless -accept="socket,host=127.0.0.1,port 时成为我的目录=8100;urp;” -nofirststartwizard
      【解决方案5】:

      我想我发现了你的错误:将你的论点更改为以下内容:看看它是否有效:

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

      【讨论】:

      • 我认为您首先更改目录是正确的。再次查看上面的代码...我对我发布的原始内容进行了一些编辑...
      • @Harinder :我正在做最后的努力,我已经在上面做了一些编辑...帮我试试这个...
      • 如果我删除“cmd”、“/c”,然后运行它,我得到无法运行程序“C:\Program Files\OpenOffice.org 3\program”:CreateProcess error=5, Access被拒绝
      • 以下对我有用:new String[]{"cmd", "/c","C:\\m-admin\\app.exe"} 你让它运行了吗?如果是,请发布您的解决方案
      • @knurdy 你在soffice 之后忘记了.exe 在你的答案中(我也这样做了......)
      【解决方案6】:

      退出状态 0 通常意味着没有错误。

      尝试改用 ProcssBuilder。

      使用 ProcessBuilder,您可以设置 the working directory

      Here are some links 这可能会有所帮助。

      【讨论】:

      • 顺便说一句,如果您尝试启动该应用程序,您也可以尝试Desktop.open(),但我不确定这是否是您需要的。
      • 我希望 C:\\Program Files\\OpenOffice.org 3\\program\\ 在我运行 soffice -headless -accept="socket,host=127.0.0.1,port 时成为我的目录=8100;urp;” -nofirststartwizard
      • 实际上我正在尝试运行服务