【问题标题】:How to open the command prompt and insert commands using Java?如何使用 Java 打开命令提示符并插入命令?
【发布时间】:2011-06-08 22:57:15
【问题描述】:

是否可以打开命令提示符(我猜其他系统的任何其他终端),并在新打开的窗口中执行命令?

目前我拥有的是这样的:

Runtime rt = Runtime.getRuntime();
rt.exec(new String[]{"cmd.exe","/c","start"});

我尝试在“开始”之后添加下一个命令,我尝试运行另一个包含我的命令的 rt.exec,但我找不到让它工作的方法。

如果重要的话,我正在尝试运行类似于以下的命令:

java -flag -flag -cp terminal-based-program.jar

编辑不幸的是,我有一些奇怪的发现。我已经能够成功启动命令提示符并使用以下命令传递命令:

rt.exec("cmd.exe /c start command");

但是,它似乎只适用于一个命令。因为,如果我尝试使用这样的命令分隔符“cmd.exe /c start command&command2”,第二个命令将通过后台传递(就像我只使用 rt.exec("command2"); 的方式) .现在这里的问题是,我意识到我需要更改命令提示符所在的目录,因为如果我只是使用 jar 文件的完整路径,jar 文件会错误地从命令提示符的活动目录中读取数据,而不是包含其资源的 jar 目录。

【问题讨论】:

  • 您能否阐明为什么要尝试执行此操作,而不是仅在 java 命令上运行 .exec。命令窗口会自动打开。
  • 查看我对 ktm5124 答案的评论。

标签: java command terminal launch


【解决方案1】:
public static void main(String[] args) {
    try {
        String ss = null;
        Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
        BufferedWriter writeer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
        writeer.write("dir");
        writeer.flush();
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
        BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        System.out.println("Here is the standard output of the command:\n");
        while ((ss = stdInput.readLine()) != null) {
            System.out.println(ss);
        }
        System.out.println("Here is the standard error of the command (if any):\n");
        while ((ss = stdError.readLine()) != null) {
            System.out.println(ss);
        }

    } catch (IOException e) {
        System.out.println("FROM CATCH" + e.toString());
    }

}

【讨论】:

  • 您可以从代码中删除不相关的 cmets 并添加一些相关的。
【解决方案2】:
String[] command = {"cmd.exe" , "/c", "start" , "cmd.exe" , "/k" , "\" dir && ipconfig 
\"" };
ProcessBuilder probuilder = new ProcessBuilder( command );
probuilder.directory(new File("D:\\Folder1"));
Process process = probuilder.start();

【讨论】:

    【解决方案3】:

    您必须仔细设置所有\"(引号)。参数\k 用于在执行后保持命令提示符打开。

    1) 组合使用 2 个命令(例如 pauseipconfig

    Runtime.getRuntime()
      .exec("cmd /c start cmd.exe /k \"pause && ipconfig\"", null, selectedFile.getParentFile());
    

    2) 显示文件使用的内容(MORE 是 Windows 上的命令行查看器)

    File selectedFile = new File(pathToFile):
    Runtime.getRuntime()
      .exec("cmd /c start cmd.exe /k \"MORE \"" + selectedFile.getName() + "\"\"", null, selectedFile.getParentFile());
    

    一个嵌套引号 \" 用于命令和文件名,第二个引号 \" 用于文件名本身,特别是名称中的空格等。

    【讨论】:

      【解决方案4】:

      请将您的命令放入如下所述的参数中。

      Runtime.getRuntime().exec("cmd.exe /c start cmd /k \" parameter \"");
      

      【讨论】:

        【解决方案5】:

        你只需要在你传递的字符串中添加你的命令。

        String command = "cmd.exe /c start "+"*your command*";
        
        Process child = Runtime.getRuntime().exec(command);
        

        【讨论】:

          【解决方案6】:

          您可以在命令提示符下使用任何进程作为动态路径

          Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
          Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\rakhee\\Obligation Extractions\" && dir");
          Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\oxyzen-workspace\\BrightleafDesktop\\Obligation Extractions\" && dir");
          

          【讨论】:

            【解决方案7】:

            如果您同时运行两个命令只是为了更改命令提示符所在的目录,则 Runtime.exec 方法有一个重载,可让您指定当前工作目录。喜欢,

            Runtime rt = Runtime.getRuntime();
            rt.exec("cmd.exe /c start command", null, new File(newDir));
            

            这将在 newDir 的目录中打开命令提示符。我认为您的解决方案也可以,但这会使您的命令字符串或数组更加简洁。

            将命令作为字符串并将命令作为字符串数组存在重载。

            不过,您可能会发现使用ProcessBuilder 更容易,它有一个directory 方法来设置您当前的工作目录。

            希望这会有所帮助。

            【讨论】:

            • 应该是runtime.exec("cmd.exe /c start", null, new File(newDir));
            • 我用过这个,String newDir="C:\\Test\\Application\\"; runtime.exec("cmd.exe /c 启动目录", null, new File(newDir));如果我想在这个文件夹下运行一些命令,C:\Test\Application\avt install - filename.. 怎么做?你能帮我吗??
            【解决方案8】:

            我知道人们建议远离 rt.exec(String),但这有效,我不知道如何将其更改为数组版本。

            rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\"");
            

            【讨论】:

            • 我正在做一些与你类似的事情,我很好奇 /c 和 /k 来自哪里。我似乎找不到关于 cmd 的提及。另外,你为什么要转义引号?是不是因为两者之间的值代表要传递给 CMD 的命令?
            • cmd /?/C Carries out the command specified by string and then terminates /K Carries out the command specified by string but remains
            • 经过 3 天的工作。它对我有用,谢谢:))))))))
            【解决方案9】:

            在雪豹上对我有用:

            Runtime rt = Runtime.getRuntime();
            String[] testArgs = {"touch", "TEST"};
            rt.exec(testArgs);
            

            问题是,如果要读取该命令的输出,则需要读取进程的输入流。例如,

            Process pr = rt.exec(arguments);
            BufferedReader r = new BufferedReader(new InputStreamReader(pr.getInputStream()));
            

            让您可以轻松阅读命令的逐行输出。

            问题也可能是 MS-DOS 没有将您的参数顺序解释为“启动新的命令提示符”。你的数组应该是:

            {“开始”、“cmd.exe”、“\c”}

            要在新的命令提示符中打开命令,您必须使用进程引用。但我不知道为什么当你可以只使用 exec 时,你为什么要这样做,正如我之前的人所评论的那样。

            【讨论】:

            • 我想在新的命令提示符中打开命令的原因是因为我试图启动的程序是一个基于控制台的程序,它的输入和输出分别来自和去到控制台。注意,我要启动的程序不是我自己做的,所以我必须根据它的工作原理来编程,我不能改变它。
            猜你喜欢
            • 2015-07-22
            • 1970-01-01
            • 1970-01-01
            • 2011-07-29
            • 2011-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多