我有一个执行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脚本中读取吗?
答案 0 :(得分:1)
PowerShell版本2.0中似乎存在一个错误,一旦我升级到3.0版就可以了。
在我的机器上有5.0版本,这就是它在我的机器上工作的原因。在其他不起作用的机器上有版本2.0。