PowerShell脚本停留在ReadLine()

时间:2016-10-26 06:16:49

标签: java powershell

我有一个执行PowerShell脚本的java应用程序 在我的java代码中,我从输入流(来自脚本的数据)中读取并写入输出流(转到脚本的数据)。我也分别处理错误流 在PowerShell脚本中,我使用以下命令从脚本的标准输入流中读取:

$Line = [Console]::ReadLine()

当脚本到达代码中的这一点时,它会挂起在ReadLine()上,直到将某些内容写入流中,这就是java应用程序所在的位置。
在java中我写的是以下内容到输出流(这段代码不是整个代码,但一般而言只是它的重要部分):

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();
           ...
       }
       ...
   }
}

您是否可以看到我正在开始写入outStream然后我调用flush()实际将所有内容刷新到流中,但此时脚本被卡住并挂起在ReadLine()上我的java代码到达receive()方法并等待脚本响应并编写一些标准输入,但在这种情况下,java代码将永远挂起,因为脚本永远停留在ReadLine()上。然后过了一段时间我有超时机制杀死进程并释放程序。
在我做的实验中,我在开始时重复了对outStream的写作,它有时会工作,有时也不会。意思是,第二次刷新写入流和脚本得到它。
我必须说我使用相同的代码来运行Perl,VB和Python脚本没有问题 此外,此代码在我的机器上运行(Windows 10),而不是在Windows 7,Windows Server 2008等其他机器上运行。也许它与PowerShell版本有关? 问题是怎么来的? 我该怎么做才能克服这个问题?
我没有成功在PowerShell中使用Read-Host命令,我得到了相同的行为,还有另一种方法可以在PowerShell脚本中读取吗?

1 个答案:

答案 0 :(得分:1)

PowerShell版本2.0中似乎存在一个错误,一旦我升级到3.0版就可以了。
在我的机器上有5.0版本,这就是它在我的机器上工作的原因。在其他不起作用的机器上有版本2.0。