2014-09-05 38 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

相关问题