1

我正在使用 Visual Studio 2010 开发一个 Windows 控制台应用程序,它会在屏幕上打印进度百分比,以便最后一个数字被当前数字覆盖。我正在使用回车来实现这一点,如下所示:

std::wcout
    << "[Running: "
    << std::setw(3)
    << std::setprecision(3)
    << percent
    << "%]"
    << '\r'
;

当我使用 PSSesion 在远程主机上通过 PowerShell 执行此程序时:

Enter-PSSession WWW.XXX.YYY.ZZZ -credential <UserName>
[WWW.XXX.YYY.ZZZ]: PS C:\> .\test.exe

与在 PowerShell 或 cmd.exe 中本地执行时相比,它的行为有所不同。我面临以下三个问题:

1)程序的控制台输出是不同的,而不是[Running xx%]像这样覆盖下一行的打印:

[Running  1%]
[Running  2%]
[Running  3%]
[Running  4%]
...

这类似于将程序的输出重定向到文件(单独carriage returnsnewlines替换为carriage returns+newlines组合)时发生的情况。

2)当程序向 cout 写入内容时,输出不会显示。它在执行结束时立即出现。powershell 是否缓存远程程序的输出并仅发送给调用者一次?如果两行之间存在显着的时间差(行表示两个newlines 之间的所有输出),则打印第一行,就好像它等待另一个时间一样newline,如果收到,它再次进入等待状态,如果在一定时间内没有收到时间段(~500ms),它将输出直到最后newline(而不是所有累积的输出)发送给调用者。从我的代码中可以看出,最后一次打印newline所有内容并没有结果。[Running xx%]

3)在程序的某个时刻,我需要用户的确认,但在远程执行中cin.fail()返回。true那么,有没有办法在这样的执行环境中获取用户输入呢?或者有什么方法可以检测到程序正在通过 Powershell 远程执行(例如,一些环境变量)?

任何与任何点相关的帮助将不胜感激。:)

4

1 回答 1

1

关于 1),PowerShell 远程处理的 WinRM 协议实际上只是命令及其序列化输出的输入/输出流。它没有终端仿真功能,所以当你远程运行时,它们的输出一次一行地按顺序反馈。如果您使用 SSH 或 Telnet 连接到 powershell.exe 的远程 shell,您可能会看到您所期望的。

至于 2),默认输出缓冲模式似乎是“块”,因此这可以解释您所看到的行为。您可以使用 cmdlet 更改此设置,以便为由该New-PSSessionOption会话创建的会话创建配置,该会话New-PSSession可以传递到远程感知 cmdlet 上的 -Session 参数。选项是OutputBufferingMode。如果将其设置为None,则应该获得所需的行为。

# default output buffering mode is "none" for default options
$s = new-pssession localhost -sessionoption (new-pssessionoption)
enter-pssession $s

对于 3),您应该能够以交互方式接受输入 IIRC。看起来交互的东西不能正常工作——我可能完全记错了。

于 2013-05-09T15:57:52.920 回答