【发布时间】:2020-11-03 12:30:43
【问题描述】:
我有一个可以接受标准输入的控制台应用程序。它会缓冲数据直到执行命令,此时它会全部执行,并将输出发送到标准输出。
目前,我正在从 Powershell 运行此应用程序,将命令输入其中,然后解析输出。管道输入的数据相对较小;但是这个应用程序被调用了大约 1000 次。每次执行时,它都必须加载并创建网络连接。我想知道将所有命令通过管道传输到控制台应用程序的单个实例中是否更有效。
我已经尝试通过将所有 Powershell 脚本(为控制台制造标准输入)添加到一个函数中,然后将该函数通过管道传输到控制台应用程序。起初这似乎可行,但您最终意识到它正在缓冲 Powershell 中的所有数据,直到函数完成,然后将其发送到控制台的 StdIn。您可以看到这一点,因为我有一大堆 Write-Host 语句闪过,然后您才能看到输出。
例如
Function Run-Command1
{
Write-Host "Run-Command1"
"GET nethost xxxx COLS id,name"
"EXEC"
}
Function Run-Command2
{
Write-Host "Run-Command2"
"GET nethost yyyy COLS id,name"
"GET users yyyy COLS id,name"
"EXEC"
}
...
Function Run-CommandX
{
...
}
以前,我会把它用作:
Run-Command1 | netapp.exe -connect QQQQ -U user -P password
Run-Command2 | netapp.exe -connect QQQQ -U user -P password
...
Run-CommandX | netapp.exe -connect QQQQ -U user -P password
但现在我想做:
Function Run-Commands
{
Run-Command1
Run-Command2
...
Run-CommandX
}
Run-Commands |
netapp.exe -connect QQQQ -U user -P password
理想情况下,我希望将 Powershell 管道行为扩展到外部应用程序。这可能吗?
【问题讨论】:
-
我想这一切都取决于您要通过管道传输到该函数的数据。你可以让它接受一个值数组,也许使用 Splatting 来调用它?我们能看到一些代码吗?
-
那么你试过你的示例函数了吗?这就是我要开始的。
-
部分谜团已解开:PowerShell 端的缓冲行为在 Windows PowerShell 和 PowerShell [Core] v6+(现在流式传输,不再预先收集)之间发生了变化。 marsze 的答案中的函数是一种解决方法,用于消除 PowerShell 端缓冲并使其像在 PowerShell [Core] v6+ 中一样工作,但我不希望这能解决您的问题。
标签: powershell console-application buffer stdin pipeline