簡體   English   中英

如何從java執行批處理文件?

[英]How to execute a batch file from java?

我想從一個java程序執行一個批處理文件。

我正在使用以下命令。

Runtime.getRuntime().exec("server.bat");

但問題是我想給出一個反應路徑而不是絕對路徑,這樣我就可以在任何comp上部署那個java項目。

項目的dir結構如下:

com
   |
  project
   |
   ------ parser
   |         |_____ Main.java
   |
   -------util
             |_____ Server.bat

我想從“parser”目錄中的“Main.java”文件中運行“util”目錄中的“Server.bat”文件。

您可以為此使用ProcessBuilder 它提供比exec更多的控制。 特別是,它允許使用方法directory

例子:

ProcessBuilder pb = new ProcessBuilder("server.bat");
pb.directory(new File(deployDir + "\\com\\project\\util"));
Process p = pb.start();
int exitStatus = p.waitFor();

當然,您的應用程序必須從某個地方獲取 deployDir。 它可以在環境中設置,在應用程序配置文件中,它可以是當前用戶目錄或其他任何東西。

您必須使用參數“/c”和“server.bat”運行“cmd.exe”:

Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" } );

當 Java 正在運行並且您使用帶有相對路徑的 Runtime.exec() 時,相對意味着相對於調用 JVM 的當前用戶目錄。

這可能有效

Runtime.getRuntime().exec("cmd.exe", "/c", "./com/projct/util/server.bat");

如果您從 com 的父目錄啟動 java。

或者你必須計算一個絕對路徑:

Runtime.getRuntime().exec("cmd.exe", "/c", 
System.getProperty("user.dir")+"/com/projct/util/server.bat");

我忘記了,請閱讀When Runtime.exec() won't

如果支持,您可以使用 Desktop 進行嘗試 (Java 1.6)

    File file = new File("server.bat");
    Desktop.getDesktop().open(file);

Plexus utils提供了一種命令行類型,可以調用任意命令行並處理輸出解析。

Commandline cl = new Commandline();

cl.setExecutable( "cmd.exe" );
cl.createArg().setValue( "/c" );

cl.setWorkingDirectory( new File(System.getProperty("user.dir"), 
    "/com/project/util/Server.bat"));

cl.createArg().setValue( "/c" );

StreamConsumer consumer = new StreamConsumer() {
    public void consumeLine( String line ) {
        //do something with the line
    }
};

StreamConsumer stderr = new StreamConsumer() {
    public void consumeLine( String line ) {
        //do something with the line
    }
};

int exitCode;

try {
    exitCode = CommandLineUtils.execute( cl, consumer, stderr, getLogger() );
} catch ( CommandLineException ex ) {
    //handle exception
}

最好的辦法是將應用程序的安裝目錄存儲在系統上,然后使用它在應用程序中構建路徑。 System.getProperty("user.dir") 應該在 Windows 和 Unix 平台上工作以獲取當前工作目錄,但它取決於系統,因此請注意這一點。

exec 的第二個參數是環境設置的 args 的 String[](null 表示繼承進程的當前參數), exec 的第三個參數應該是提供工作目錄的文件。 嘗試這個:

Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util"));

暫無
暫無

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

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