通过Powershell远程会话执行时,程序输出是不同的
Program output is different when executed through Powershell remote session
我正在开发一个Windows控制台应用程序,使用Visual Studio 2010,它在屏幕上打印进度百分比,使最后一个数字被当前数字覆盖。我使用回车来实现这一点,像这样:
std::wcout
<< "[Running: "
<< std::setw(3)
<< std::setprecision(3)
<< percent
<< "%]"
<< 'r'
;
当我在远程主机上使用psession通过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 returns
或newlines
被替换为carriage returns
+ newlines
组合)。
2)当程序向cout写入内容时,输出不显示。它在执行结束时立即出现。powershell是否缓存远程程序的输出并只发送一次给调用者?如果两行之间有明显的时间差(行意味着两个newline
之间的所有输出),那么第一行就会被打印出来,好像它等待另一个newline
一段时间,如果收到,它再次进入等待状态,如果在一定时间内(~500ms)没有收到,它将输出发送到最后一个newline
(而不是所有累积的输出)到调用者。从我的代码中可以看出,没有newline
导致所有[Running xx%]
在最后一次打印。
3)在程序的某一点,我需要用户的确认,但cin.fail()
返回true
在远程执行。那么,在这样的执行环境中是否有办法接受用户输入呢?或者是否有任何方法可以检测到程序正在通过Powershell远程执行(例如。一些环境变量)?
任何有关任何一点的帮助将是非常感激的。:)
相对于1),PowerShell Remoting的WinRM协议实际上只是命令及其序列化输出的输入/输出流。它没有终端仿真功能,因此当您远程运行时,它们的输出是按顺序一次一行地反馈的。如果您使用SSH或Telnet到powershell.exe的远程shell,您可能会看到您所期望的结果。
对于2),默认输出缓冲模式似乎是"Block",所以这可以解释您所看到的行为。您可以使用New-PSSessionOption
cmdlet更改这一点,为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输入。看起来交互的东西不能正常工作——我可能完全记错了。
- 如何从Windows应用程序输出到标准?
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- 而循环:简单的除法程序输出零,不明白为什么
- Qt creator 4.11,在应用程序输出面板中创建一个链接
- 使用复制构造函数的程序输出错误
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- 为什么在 Direct X 11 中没有我的程序输出?
- 我怎样才能阻止我的程序输出时间,它使我的程序难以阅读
- 程序输出奇怪的字符
- 程序输出"nan"
- 为什么我的C++程序输出不同的数字来将米转换为英尺?
- 3D 纹理大小会影响程序输出,而不会引发错误
- C++,程序输出无效输入,但继续通过循环
- 如何连接C++和Excel(从C++程序输出到Excel电子表格)
- 为什么我的C 程序输出乱码代码
- QT小部件应用程序输出到控制台
- 混淆了具有虚拟继承的程序输出
- 为什么我的C++程序输出这个
- 为什么我的程序输出不断变化?EAX寄存器不断更改值