1

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 でローカルに実行された場合とは動作が異なります。次の3つの問題に直面しています。

[Running xx%]1) プログラムのコンソール出力は、次の行の出力を次のように上書きするのではなく、次のように異なります。

[Running  1%]
[Running  2%]
[Running  3%]
[Running  4%]
...

これは、プログラムの出力がファイルにリダイレクトされた場合 (単独carriage returnsまたは+の組み合わせnewlinesで置き換えられた場合) に似ています。carriage returnsnewlines

2) プログラムが cout に何かを書き込んだときに、出力が表示されません。実行の最後に一気にやってくる。powershell はリモート プログラムの出力をキャッシュし、呼び出し元に 1 回だけ送信しますか? 2 つの行 (行は 2 つの間のすべての出力を意味するnewline) の間に大きな時間差がある場合、最初の行は次の行をしばらく待機するかのように出力されnewline、受信された場合は、特定の時間内に受信されない場合、再び待機状態になります。期間(〜500ミリ秒)、最後までの出力newline(累積されたすべての出力ではありません)を呼び出し元に送信します。私のコードからわかるように、最後newlineにすべてが[Running xx%]一度に印刷されることはありません。

3) プログラムのある時点で、ユーザーの確認が必要ですが、リモート実行でcin.fail()戻ります。trueでは、そのような実行環境でユーザー入力を取得する方法はありますか? または、プログラムが Powershell を介してリモートで実行されていることを検出する方法はありますか (たとえば、いくつかの環境変数)?

任意の点に関連するヘルプは大歓迎です。:)

4

1 に答える 1

1

1) に関しては、PowerShell Remoting の WinRM プロトコルは、コマンドとそのシリアル化された出力の入出力ストリームにすぎません。端末エミュレーション機能がないため、リモートで実行すると、出力が一度に 1 行ずつ順番にフィードバックされます。powershell.exe のリモート シェルに対して SSH または Telnet を使用した場合は、期待どおりの結果が得られるはずです。

2)に関しては、デフォルトの出力バッファモードは「ブロック」であるように見えるので、これはあなたが見ている動作を説明するでしょう. これをNew-PSSessionOptionコマンドレットで変更して、によって作成されたセッションの構成を作成し、New-PSSessionリモート処理対応コマンドレットの -Session パラメーターに渡すことができます。オプションはOutputBufferingMode. に設定するとNone、目的の動作が得られるはずです。

# default output buffering mode is "none" for default options
$s = new-pssession localhost -sessionoption (new-pssessionoption)
enter-pssession $s

3) については、IIRC で対話的に入力を受け入れることができる必要があります。インタラクティブなものが正しく動作しないようです - これは完全に記憶違いだったのかもしれません。

于 2013-05-09T15:57:52.920 に答える