我可以在Powershell中准备无缓冲的程序输出吗?

问题描述 投票:1回答:1

我正在尝试将Putty的plink.exe用作Powershell脚本的一部分,并且在准备输出时遇到了麻烦。

某些命令调用交互式响应(例如:输入密码)。具体来说,我正在针对Isilon进行测试。

示例代码:

$command = '&"C:\Program Files\Putty\plink.exe" [email protected] -pw "password" -t -batch "isi auth users create testuser --set-password"'  
iex $command

预期结果:

  • 我得到提示password:
  • 我输入密码
  • 我得到提示confirm:
  • 我再次输入密码
  • 命令结束

如果我尝试使用iex $command | tee-object -variable result来准备输出,或者甚至只是使用iex $command *>test.log重定向,则提示文本直到我响应后才显示。尽管在技术上仍然可以正常运行,但是如果您不确切知道期望什么提示,那么它就没有用。

我已经尝试过使用Start-Transcript,但这根本无法捕获输出。我也尝试过使用plink的-sshlog参数,但是它记录的方式太多了,而且格式不易读。

有什么方法可以在控制台中将stdout取消缓冲,也可以将其存储在变量中?

回答一些潜在的问题:

-这将在不允许使用模块的环境中运行,因此不能使用Posh-SSH。

-可用的Powershell版本不够新,无法使用内置的openssh功能。

powershell stdout putty plink
1个回答
0
投票

这全部与重定向流有关。

使用重定向时,所有输出从流中重定向,并传递以写入文件。执行时:

Write-Host "Some Text" *>out.txt

您看不到任何输出,并且所有输出都重定向到文件。

主要说明:重定向以逐行为基础(简化),如下重定向通过一次向文件写入一行来实现。

类似地,当您使用Tee-Object时,所有输出从流重定向到管道。这被传递到cmdlet Tee-ObjectTee-Object接受输入,然后将该输入写入所需的变量/文件和屏幕。发生这种情况After收集并处理了输入。

这意味着重定向和Tee-Object命令都逐行工作。 这很有意义重定向和Tee-Object命令都以这种方式工作,因为在尝试同时编辑和维护打开的文件时,很难处理诸如删除字符,四处移动和动态编辑文本之类的事情。仅在语句完成后才输出,仅用于单向。

在这种情况下,当以交互方式运行它时,password:提示将写入屏幕,您可以进行响应。

[重定向/准备输出时,password:文本提示将被重定向并缓冲,以等待您的响应。 这很有意义,因为该语句尚未完成。您不想发送可能会更改的一半声明,也不希望在管道中发送一半的对象。只有完成语句(例如,输入密码+ Enter)后,整个语句才沿流/管道传递。整个语句发送完毕后,便会重定向/输出Tee,并可以显示。@ Bill_Stewart是正确的,在某种意义上,您应该选择交互式提示或全自动解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.