2016-10-26 4 views
1

Ich habe eine Java-Anwendung, die ein PowerShell-Skript ausführt.
In meinem Java-Code lese ich aus dem Eingabestrom (Daten, die aus dem Skript kommt) und schreibe in den Ausgabestream (Daten, die an das Skript geht). Ich handle auch den Fehlerstrom getrennt.
In der Powershell-Skript, das ich den folgenden Befehl bin mit von der Standardeingabe-Stream des Skripts zu lesen:
PowerShell-Skript hängt auf ReadLine()

$Line = [Console]::ReadLine() 

Wenn das Skript diesen Punkt im Code erreicht er auf der Readline hängt() bis etwas das ist in den Stream geschrieben, wo die Java-Anwendung kommt
in Java ich folgendes in den Ausgabestream schreibe (Dieser Code ist nicht der gesamte Code, sondern im allgemeinen und nur die wichtigen Teile davon).

public void runMain() 
{ 
    String[] params = "the command and arguments here"; 
    Process process = r.exec(params, null); 
    outStream = new BufferedOutputStream(process.getOutputStream()); 
    inStream = new BufferedInputStream(process.getInputStream()); 
    errStream = new BufferedInputStream(process.getErrorStream()); 

    startCmd  = "some text here\r\n"; 
    wtByte  = startCmd.getBytes(); 
    outStream.write(wtByte, 0, wtByte.length); 
    outStream.flush(); 

    while (!isScriptTerminated && !wasError && !isScriptFinished) 
    { 
     if (errStream != null) 
     { 
      // handle error 
     } 

     if (inStream != null) 
     { 
      // read the data from the STDOUT of the script (our input) 
      readBuffer = receive(); 
      ... 
     } 
     ... 
    } 
} 

Haben Sie Ich kann sehen, dass ich gleich zu Beginn in den outStream schreibe, und dann rufe ich flush() auf, um alle in den Stream zu pushen, aber an diesem Punkt hängt das Skript und hängt an der ReadLine() und mein Java - Code erreicht die receive() -Methode und warten auf das Skript zu reagieren und schreibe etwas so Standard-Eingabe, aber in diesem Fall wird Java-Code für immer hängen, weil das Skript auf der ReadLine() für immer fest ist. Dann habe ich nach einer Weile einen Timeout-Mechanismus, der den Prozess beendet und das Programm freigibt.
In den Experimenten, die ich gemacht habe, habe ich am Anfang die Schrift zum outStream dupliziert und es funktionierte manchmal und manchmal nicht. Bedeutung, der zweite Flush schrieb in den Stream und Skript bekam es.
Ich muss sagen, dass ich den gleichen Code verwende, um Perl, VB und Python-Skripte ohne Probleme auszuführen.
Darüber hinaus funktioniert dieser Code auf meinem Computer (Windows 10) und funktioniert nicht auf einigen anderen Computern wie Windows 7, Windows Server 2008. Vielleicht hat es etwas mit der PowerShell-Version zu tun?
Die Frage ist, wie kommt es?
Was kann ich tun, um dieses Problem zu lösen?
Es ist mir nicht gelungen, Read-Host-Befehl in PowerShell zu verwenden, und ich habe das gleiche Verhalten, gibt es eine andere Möglichkeit, in PowerShell-Skript zu lesen?

Antwort

1

Es scheint, dass es einen Fehler in der PowerShell-Version 2.0 gibt, nach dem Upgrade auf Version 3.0 funktionierte es.
Auf meiner Maschine gibt es Version 5.0, deshalb funktionierte es auf meiner Maschine. Auf den anderen Rechnern, die nicht funktionierten, gab es Version 2.0.