2014-09-05 52 views
0

我正在使用Rhino,並且我有以下函數調用PowerShell,比較兩個文本文件並將差異保存到文本文件。使用Rhino/Java/JavaScript的「使用中的文件」錯誤

function RunPowerShell() 
{ 

var CommandPS= ' $File1 = Get-Content "C:\\Test\\test1.txt"; $File2= Get-Content "C:\\Test\\test2";Compare-Object $File1 $File2 -PassThru >"C:\\Test\\Results.txt"'; 

println(CommandPS); 

var CmdCommand= 'cmd /c PowerShell '+ CommandPS; 

var CmdResults= new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec(CmdCommand).getErrorStream())); 

CmdResults.close(); 

} 


RunPowerShell(); 

該函數工作正常;文件Results.txt被創建,但我無法刪除它,因爲正在使用中。

我在最後關閉了BufferedReader,但我仍然無法刪除該文件,除非我從任務管理器中終止該進程。

由於提前,

回答

0

Runtime.exec()不閉鎖:它叉是異步運行的過程。因此,在進程終止之前,您可能已到達腳本的末尾。

我不知道爲什麼你需要殺死進程退出,但我的猜測是你需要從PowerShell的輸出中消耗一些輸入。所以我會嘗試兩件事:

  1. 獲取過程對象並等待它完成。

    var process = java.lang.Runtime.getRuntime().exec(CmdCommand); 
    var exitCode = process.waitFor(); // blocks until process completes 
    
  2. 如果單獨不起作用,在腳本的末尾發出退出:

    java.lang.System.exit(0); 
    

有,你可以使用會涉及較大變化的其他兩種方法,但會如果你打算在此基礎上幫助你。

  1. 你可以使用java.lang.ProcessBuilder,這是處理過程更方便的API,在Java的後續版本中引入了(但無疑仍包含在您正在運行的產品)。

  2. 你可以使用犀牛的runCommand這是打算做這種事情。我發現它是一個小小的車,但它對大多數情況下效果很好。見Mozilla's Rhino shell documentation

+0

上面#1(「獲取過程對象,並等待它完成」)解決了問題,謝謝你 – user3566591 2014-09-08 18:52:22

相關問題