2013-05-09 160 views
1

我正在開發使用Visual Studio 2010的Windows控制檯應用程序,該應用程序在屏幕上打印進度百分比,以便最後一個數字被當前數字覆蓋。我使用回車來實現這一目標,像這樣:當我通過PowerShell的遠程主機上使用PSSesion執行這個程序當通過Powershell遠程會話執行時,程序輸出不同

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

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變量)?

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

+0

你爲什麼把它標記爲「C++」和「visual-C++」? – Solaflex 2013-05-09 15:03:14

+0

@Solaflex:希望可能有一些可以控制這種行爲的c或C++庫api。 – anni 2013-05-09 15:07:53

回答

1

關於1),PowerShell Remoting的WinRM協議實際上只是命令及其串行輸出的輸入/輸出流。它沒有終端仿真功能,所以當你遠程運行時,它們的輸出一次一個地按順序反饋。如果您使用SSH或Telnet到powershell.exe的遠程shell,您可能會看到您的期望。

至於2),默認輸出buffermode顯示爲「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。 看起來像互動的東西不工作的權利 - 我可能完全誤解了這一點。

+0

對於1)如果簡單地反饋輸出,'\ r'如何替換爲'\ r \ n'序列?對於2)是否有任何方法可以關閉程序或可以清空程序中的輸出? 3)如我所說,cin流處於無效狀態。你知道如何處理這個? – anni 2013-05-10 05:06:16

+0

對於1),它可能是xml序列化/反序列化過程的人工產物。對於2)和3),我會盡量在POC之後回覆你。 – x0n 2013-05-10 14:09:17

+0

用示例更新 – x0n 2013-05-10 14:25:09

相關問題