簡體   English   中英

Java:無法使用參數執行外部exe

[英]Java: Can't execute external exe with arguments

我正在嘗試運行帶有參數的外部程序。 該程序可以使用不同類型的參數,例如avl tip.avlavl < test.ops

我可以通過運行avl tip.avl

try {
    String[] list = {"avl", "test_0.avl"};
    ProcessBuilder pb = new ProcessBuilder(list);
    pb.command(list);
    final Process p = pb.start();
    BufferedReader br = new BufferedReader( new InputStreamReader( p.getInputStream() ) );
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (Exception ex) {
    System.out.println(ex);
}

但是當我嘗試

String[] list = {"avl", "<", "test_0.ops"};
ProcessBuilder pb = new ProcessBuilder(list);
pb.command(list);
final Process p = pb.start();

程序運行后, "<"不會作為參數發送,而是作為輸入發送。 avl < test.ops在命令行中嘗試正常,但無法通過ProcessBuilder使其正常工作。

我認為avl tip.avl有效,是因為運行avl tip.avl與運行avl然后輸入tip.avl 這似乎是ProcessBuilder實際上正在做的...

我認為這些論點將一並通過。 什么是執行命令提示符輸入所做的正確方法avl < test.ops + ENTER

您不能從Java重定向輸入。 使用<是特殊的外殼管道重定向命令。

您將必須使用processBuilder.getOutputStream()將數據寫入進程,否則可以使用redirectInput。

"<"不會作為參數發送,而是在程序運行后作為輸入發送

不,那是不對的。 就像test_0.avltest_0.ops一樣,它作為參數傳遞。

[…]與只運行avl ,然后鍵入tip.avl

不,殼中永遠不會發生這種情況。 外殼將傳遞tip.avl作為第一個參數。

也就是說,是您的shell特殊處理<符號,就像特殊處理>| 當您使用ProcessBuilder ,將不會進行特殊處理。 您的第二次調用等效於shell中的此調用:

avl '<' test_0.ops

這將禁用<的特殊含義。 當然,這不是您想要的。

謝謝你們,下面的工作按預期進行。

File pipe = new File("test_0.ops");
ProcessBuilder pb = new ProcessBuilder("avl");
pb.redirectInput(pipe);
final Process p = pb.start();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM