簡體   English   中英

通過Powershell遠程會話執行時,程序輸出是不同的

[英]Program output is different when executed through Powershell remote session

我正在使用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是否緩存遠程程序的輸出並僅發送給調用者一次? 如果兩行之間存在明顯的時間差(該行表示兩個newline之間的所有輸出),則打印第一行,就像它等待一段時間等待另一個newline ,如果收到,則再次進入等待狀態(如果未收到)在特定時間段(約500ms)內,它將輸出發送到最后一個newline (而不是所有累積的輸出)給調用方。 從我的代碼可以看出,沒有newline導致所有[Running xx%]都一次打印在末尾。

3)在程序中的某些點上,我需要用戶確認,但是cin.fail()在遠程執行中返回true 那么,在這種執行環境中,是否有任何方法可以接受用戶輸入? 還是有什么方法可以檢測到該程序正在通過Powershell遠程執行(例如,某些env變量)?

與任何問題有關的任何幫助將不勝感激。 :)

關於1),用於PowerShell Remoting的WinRM協議實際上只是命令及其序列化輸出的輸入/輸出流。 它沒有終端仿真功能,因此,當您遠程運行事物時,它們的輸出一次會依次反饋到一行。 如果您使用SSH或Telnet到powershell.exe的遠程外殼,則可能會看到期望的結果。

對於2),默認的輸出緩沖模式似乎是“阻止”,因此可以解釋您所看到的行為。 您可以使用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輸入。 似乎交互式內容無法正常工作-我可能完全忘記了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM