【问题标题】:Passing a string to the Windows command line将字符串传递到 Windows 命令行
【发布时间】:2013-02-08 04:15:52
【问题描述】:

请看下面的代码

Runtime rt = Runtime.getRuntime();  
rt.exec("cmd /c start");
String[] cmd = {"LogParser", "Select top 10 * into c:\temp\test9.csv from application" };
rt.exec(cmd);

打开命令窗口但打开后没有传入字符串。有人能告诉我为什么这段代码不会将字符串放入命令窗口吗?

【问题讨论】:

  • 它们作为单独的命令执行,它们并不相关,因为您先执行了一个。
  • 您离解决方案还差得很远。我认为您最好的选择是使用这些命令创建一个文本文件,并让 LogParser 接受其中的命令。
  • 好的 - 但如果我把它们都放在一个字符串中,比如
  • String[] cmd = {"cmd /c start", "LogParser", "Select top 10 * into c:\temp\test9.csv from application" };编译器不喜欢它
  • 对了,一定要转义反斜杠:"Select top 10 * into c:\\temp\\test9.csv from application".

标签: java command-line process runtime.exec


【解决方案1】:

选项/C表示:Carries out the command specified by the string and then terminates.

所以另一个命令作为一个单独的命令处理。

【讨论】:

    【解决方案2】:

    使用OutputStreamWriter 并写入所创建进程的输入流。

    Process p = Runtime.getRuntime().exec("cmd /K start") ;
    Writer w = new java.io.OutputStreamWriter(p.getOutputStream());
    w.append(yourCommandHere);
    

    还有,使用 /K 的原因:

    /K 运行命令,然后返回 CMD 提示符。

    参考:http://ss64.com/nt/cmd.html

    【讨论】:

    • ...这将失败,因为cmd 在生成一个单独的进程后立即完成。
    • 你的提议会发生什么,w 将附加到 cmds 标准输入,而不是 LogParsers -- 你甚至不以任何方式参与。跨度>
    • 我认为这是正确的树,但需要的是"LogParser"而不是"cmd /K start"。然后可以使用输出流与 LogParser 进程进行通信。但是,如果 OP 希望 LogParser 在单独的 cmd 窗口中运行,那将不会发生。
    【解决方案3】:

    为什么不用这个:

    String[] cmd = { "cmd /c", "LogParser",
            "Select top 10 * into c:\temp\test9.csv from application" };
    rt.exec(cmd);
    

    查找有关exec 方法here 的更多信息。

    【讨论】:

    • select...LogParser通过标准输入接受的命令。
    • String[] cmd = { "cmd /c", "LogParser", "Select top 10 * into c:\temp\test9.csv from application" };这会在执行时返回编译错误(找不到指定的文件)
    【解决方案4】:

    您首先需要像在前两行代码中那样启动一个进程,但不要使用start,因为这会产生一个单独的进程并立即返回。只使用LogParser 代替,或者任何可以让你的LogParser 进程在不涉及cmd 的情况下启动。之后,您需要检索由exec 创建的Process 对象的OutputStream,并将您的select 命令写入其中。您还需要阅读Processs InputStream 以查看响应。这些都不会在单独的命令提示符窗口中可见;您需要通过 Java 处理所有内容,并且还涉及到一些多线程。

    【讨论】:

    • 谢谢马尔科。你似乎最了解这个问题。我会假设您的解决方案有效,但至少听起来很难说,尽管我有 3 个月的 Java 经验
    • 试试看能否让LogParserselect 作为参数。这会让事情变得简单得多。如果做不到这一点,看看你是否可以让它从文件中读取它的命令。也许你也可以试试echo "select ..." | LogParser
    【解决方案5】:

    正如我在评论中所说的那样 - “它们作为单独的命令执行,它们不相关只是因为您先执行了一个命令”

    来自Runtime.exec( string )javadoc-

    在单独的进程中执行指定的命令和参数。

    您需要将命令链接在一起以让cmd 处理您的命令,我相信您需要使用\k 标志来指定您需要在命令行上执行哪些命令。

    Runtime rt = Runtime.getRuntime();  
    String start = "cmd /k ";
    String cmd = "LogParser;\n" Select top 10 * into c:\temp\test9.csv from application";
    rt.exec(start + cmd);
    

    没有测试,因为我没有windows,但应该和这个差不多。

    【讨论】:

    • OP 需要将select 命令作为输入传递给LogParser
    • 好的,我试过了,编译正常,但似乎什么也没发生 Runtime rt = Runtime.getRuntime();字符串开始 = "cmd /k";字符串 cmd = "LogParser"; String cmd2 = "Select top 10 * into c:\temp\test9.csv from application"; rt.exec(start + cmd + cmd2);
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多