[英]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 returns
或newlines
替換為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.