【发布时间】:2016-10-26 06:16:49
【问题描述】:
我有一个执行 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 脚本中读取?
【问题讨论】:
标签: java powershell