簡體   English   中英

為什么Java執行時我的Windows批處理文件不能處理?

[英]Why aren't my Windows batch files processing when Java executes them?

我有2個文件夾,每個文件夾包含幾十個批處理文件( *.bat )。

批處理文件包含與之相似的文本

del /f/q F:\MEDIA\IMAGE99\2010\270\z\4034\123.tif > nul
del /f/q F:\MEDIA\IMAGE99\2010\266\z\3025\456.tif > nul
del /f/q F:\MEDIA\IMAGE99\2010\267\z\3025\789.tif > nul
del /f/q F:\MEDIA\IMAGE99\2010\286\z\9025\101.tif > nul
del /f/q F:\MEDIA\IMAGE99\2010\272\z\6029\112.tif > nul
del /f/q F:\MEDIA\IMAGE99\2010\258\z\4034\134.tif > nul

要么

rmdir /q F:\MEDIA\IMAGE99\2010\270\z\4034
rmdir /q F:\MEDIA\IMAGE99\2010\266\z\3025
rmdir /q F:\MEDIA\IMAGE99\2010\267\z\3025
rmdir /q F:\MEDIA\IMAGE99\2010\286\z\9025
rmdir /q F:\MEDIA\IMAGE99\2010\272\z\6029
rmdir /q F:\MEDIA\IMAGE99\2010\258\z\4034

在Java中,我列出每個File夾中的每個批處理File ,並循環遍歷列表,執行每個批處理文件,如下所示:

public static boolean batch(File file) {

    boolean handled = false;
    Process process = null;
    try {

        process = Runtime.getRuntime().exec("cmd /c start " + file);
        handled = process.waitFor() == 0;

    } catch (Exception ex) {
        // handling removed for example purposes
    } 

    return handled;
}

方法返回后,我刪除批處理文件。

問題是,我的批處理文件中沒有命令運行(我請求刪除或刪除的文件和文件夾不是),Java進程只是繼續並刪除批處理文件本身。

批處理文件位於文件夾d:\\working\\spaced folder\\purge\\batch_files\\

寫完之后,我懷疑我的問題是我將帶有空格的文件路徑傳遞給exec()方法。

我的懷疑是否正確? 如果是這樣,我該如何解決? 如果沒有,問題可能是什么?

我將調查Java:執行/ cmd / c啟動path-with-spaces \\ program.exe現在我已經考慮過了。


UPDATE

根據下面的評論,我已經更改了我的代碼,但現在輸出掛起在waitFor()並且批處理文件沒有被處理(我請求刪除的文件仍然存在)。

碼:

        String commandString = "cmd /c \"" + file +"\"";
        logger.info("COMMAND " + commandString);
        process = Runtime.getRuntime().exec(commandString);
        logger.info("WAITING FOR " + commandString);
        handled = process.waitFor() == 0;
        logger.info("HANDLED " + commandString + " = " + handled);

輸出:

COMMAND : cmd /c "d:\working\spaced folder\purge\deleteBatch\F_140.bat"
WAITING FOR : cmd /c "d:\working\spaced folder\purge\deleteBatch\F_140.bat"

現在輸出掛起在waitFor()

使用Runtime.exec從Java啟動外部進程時,必須讀取進程生成的任何輸出,否則進程可能會阻塞( 源:java.lang.Process的JavaDocs )。

請改用ProcessBuilder ,並調用redirectErrorStream來合並標准輸出和錯誤流,然后讀取process.getInputStream()所有內容,直到達到EOF。 只有這樣才能安全地調用waitFor

ProcessBuilder還將幫助解決空間問題,因為您必須自己將命令行拆分為單個單詞

ProcessBuilder pb = new ProcessBuilder("cmd", "/c", file.getAbsolutePath());

使用成功解決方案的代碼,基於Ian Roberts的回答:

使用Apache Commons-IO

package com.stackoverflow.windows;

import java.io.File;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.NullOutputStream;

public class Command {

    private Command() {}

    public static boolean batch(File file) {

        boolean handled = false;
        Process process = null;
        ProcessBuilder pb = new ProcessBuilder("cmd", "/c", file.getAbsolutePath());
        pb.redirectErrorStream(true);

        try {

            process = pb.start();
            IOUtils.copy(process.getInputStream(), new NullOutputStream());
            handled = process.waitFor() == 0;

        } catch (Exception ignore) {

            // Only throws an IOException we're trying to avoid anyway, 
            // and an expected InterruptedException 
            // handled will be false

        } finally {

            if (process != null) {

                IOUtils.closeQuietly(process.getInputStream());
            }           
        }

        return handled;
    }
}

暫無
暫無

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

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