c++ - 通过 Powershell 远程 session 执行时程序输出不同

标签 c++ visual-c++ powershell powershell-remoting

我正在使用 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+换行符组合)。

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

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

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

最佳答案

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

至于 2),默认输出缓冲模式似乎是“ block ”,因此这可以解释您所看到的行为。您可以使用 New-PSSessionOption cmdlet 更改此设置,为 New-PSSession 创建的 session 创建一个配置,该配置可以传递给远程处理 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。 看起来交互的东西不能正常工作——我可能完全记错了。

关于c++ - 通过 Powershell 远程 session 执行时程序输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16463273/

相关文章:

powershell - 如何在Powershell中将开关参数标记为必选

C++ - 方法实现取决于是否设置了成员引用变量

c++ - std::set 和 < 运算符重载的奇怪行为?

c - Windows 中 char * 和 LPSTR 的区别

C++,需要错误 : cannot convert parameter 1 from 'char *' to 'const char *&' 的原因

powershell - Powershell 中的管道

c++ - constexpr 指针值

html - 如何在 HTML 文本字段(表单中)中将包含空格的字符串设置为默认值?

c# - 将 Json 反序列化为类

powershell - where-object Powershell 的输入参数中的连字符