&引用;“正在使用的文件”;使用Rhino/Java/JavaScript时出错

&引用;“正在使用的文件”;使用Rhino/Java/JavaScript时出错,java,javascript,powershell,rhino,Java,Javascript,Powershell,Rhino,我正在使用Rhino,我有以下函数调用PowerShell,比较两个文本文件并将差异保存到一个文本文件中 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"';

我正在使用Rhino,我有以下函数调用PowerShell,比较两个文本文件并将差异保存到一个文本文件中

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,但我仍然无法删除该文件,除非我从任务管理器中终止该进程

提前感谢,

Runtime.exec()不会阻塞:它派生一个异步运行的进程。因此,在进程终止之前,您可能已经到达了脚本的末尾

我不确定为什么需要终止进程才能退出,但我猜您需要使用PowerShell输出中的一些输入。所以我想尝试两件事:

  • 获取流程对象并等待其完成

    var process = java.lang.Runtime.getRuntime().exec(CmdCommand);
    var exitCode = process.waitFor(); // blocks until process completes
    
  • 如果仅此一项不起作用,请在脚本末尾发出退出:

    java.lang.System.exit(0);
    
  • 您还可以使用另外两种方法,这将涉及更大的更改,但如果您要在此基础上继续发展,这将对您有所帮助

  • 您可以使用
    java.lang.ProcessBuilder
    ,这是一种更方便的处理流程的API,在java的更高版本中引入(但毫无疑问,它仍然包含在您正在运行的程序中)

  • 您可以使用Rhino的
    runCommand
    ,它旨在完成这类工作。我发现它有点小毛病,但在大多数情况下效果都很好。看

  • #上面的1(“获取流程对象并等待其完成”)解决了问题,谢谢