![](/img/trans.png)
[英]Why does Java allow catching Error types when applications aren't supposed to handle them?
[英]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現在我已經考慮過了。
根據下面的評論,我已經更改了我的代碼,但現在輸出掛起在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());
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.