2014-09-05 2 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. Вы можете использовать Rhino's runCommand, который предназначен для такого рода вещей. Я нашел, что это крошечный багги, но он отлично работает для большинства случаев. См. Mozilla's Rhino shell documentation.

+0

# 1 наверху («Получить объект процесса и дождаться его завершения») решили проблемы, спасибо – user3566591