将字符串传递给Windows命令行

5
请看下面的代码:
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);

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


它们作为单独的命令执行,仅因为您在另一个命令之前执行了一个命令,并不意味着它们相关。 - Tom
1
你离解决方案还有很长的路要走。我认为最好的办法是创建一个文本文件,将这些命令放入其中,并让 LogParser 从中接受命令。 - Marko Topolnik
好的 - 但如果我把它们全部放入一个字符串中,就像 - user2065481
String[] cmd = {"cmd /c start", "LogParser", "Select top 10 * into c:\temp\test9.csv from application" }; 编译器不喜欢它。 - user2065481
顺便提一下,一定要转义反斜杠:"Select top 10 * into c:\\temp\\test9.csv from application" - Theodore Norvell
5个回答

2
选项/C的意思是:执行由字符串指定的命令,然后终止。 因此,其他命令被视为一个单独的命令处理。

1
使用 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在生成一个单独的进程后立即完成。 - Marko Topolnik
你的提案会导致w附加到cmd的标准输入流中,而不是LogParser的--而且你根本没有以任何方式涉及到它。 - Marko Topolnik
我认为这是正确的方向,但需要使用“LogParser”而不是“cmd /K start”。然后可以使用输出流与LogParser进程通信。但是,如果OP希望LogParser在单独的cmd窗口中运行,那是不可能的。 - Theodore Norvell

0

如我在评论中所说:“它们作为独立的命令执行,它们之间没有关联,只是因为你在另一个命令之前执行了一个命令而已。”

根据javadocRuntime.exec( string )方法的说明:

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

您需要将这些命令链接在一起,以便使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”。 - Marko Topolnik
好的,我尝试了一下,编译通过了,但好像什么也没有发生。运行时代码如下:Runtime rt = Runtime.getRuntime(); String start = "cmd /k "; String cmd = "LogParser"; String cmd2 = "Select top 10 * into c:\temp\test9.csv from application"; rt.exec(start + cmd + cmd2); - user2065481

0
为什么不使用这个:
String[] cmd = { "cmd /c", "LogParser",
        "Select top 10 * into c:\temp\test9.csv from application" };
rt.exec(cmd);

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


“select…”是通过标准输入被“LogParser”接受的命令。 - Marko Topolnik
String[] cmd = { "cmd /c", "LogParser", "Select top 10 * into c:\temp\test9.csv from application" }; 在执行时会返回编译错误(找不到指定的文件)。 - user2065481

0

首先,您需要像在代码的前两行中那样启动一个进程,但不要使用start,因为它会生成一个单独的进程并立即返回。而是直接使用LogParser或任何可以使您的LogParser进程启动而不涉及cmd的方法。之后,您需要检索由exec创建的Process对象的OutputStream并将您的select命令写入其中。您还需要从ProcessInputStream中读取响应。所有这些都不会在单独的命令提示符窗口中显示;您需要通过Java处理所有内容,并且还涉及一些多线程。


谢谢Marko。你似乎对这个问题最了解。我认为你的解决方案应该是可行的,但是这听起来至少很困难,尽管我已经有3个月的Java经验了。 - user2065481
尝试将你的“select”作为参数输入,看看是否可以让 LogParser 运行起来。这样会使事情变得简单得多。如果这样做不行,尝试从文件读取命令。或者你也可以尝试使用 echo "select ..." | LogParser 这样的方式。 - Marko Topolnik

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