繁体   English   中英

如何使用Java打开命令提示符并插入命令?

[英]How to open the command prompt and insert commands using Java?

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

目前我所拥有的是:

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目录。

我知道人们建议不要使用rt.exec(String),但这是可行的,而且我不知道如何将其更改为数组版本。

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\"");
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());
    }

}

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

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

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

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

但是,使用ProcessBuilder可能会更容易,它具有用于设置当前工作目录的directory方法。

希望这可以帮助。

以下是我在Snow Leopard上的工作:

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”}

要在新的命令提示符下打开命令,您必须使用Process参考。 但是我不确定在您只可以使用exec时为什么要这么做,正如我之前的人所说。

您只需在启动后在传递的字符串中附加命令。

String command = "cmd.exe /c start "+"*your command*";

Process child = Runtime.getRuntime().exec(command);

请把您的命令放在如下所述的参数中。

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

您可以在命令提示符下将任何进程用于动态路径

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

您必须仔细设置所有\\" (引号)。参数\\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());

嵌套引号\\“用于命令和文件名,第二个引号\\”用于文件名本身,尤其是名称中的空格等。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM