Windows で高優先度のプロセスを開始し、その標準出力をリダイレクトする

Windows で高優先度のプロセスを開始し、その標準出力をリダイレクトする

プロセスを高い優先度で開始し、同時にその標準出力 (stdout) をファイルにリダイレクトするにはどうすればよいでしょうか?

これは動作しません:

start /HIGH my_little_proggy.exe > output.txt

答え1

/B フラグが探しているものです。以下は機能します (少なくとも Windows 10 では)。

start /HIGH /B my_little_proggy.exe > output.txt

答え2

[編集#2 - 大幅な訂正] @TarnayKálmán (OP) がコメントで指摘したように、シェルは子プロセスを独自の優先度で開始するのではなく、デフォルトの通常優先度で開始します。APIレベルでは、cmd は次のように呼び出しているようです。プロセスの作成PRIORITY_CLASSに何も設定せずにdwCreationFlags(独自の を渡すのではなくGetPriority())、子プロセスはデフォルトの で実行されますNORMAL_PRIORITY_CLASS

その結果、次のようなコマンドはstart /HIGH call my_little_proggy.exe ^> output.txtセカンダリcmd.exeシェルを起動します。高い優先度は、リダイレクトを処理して実行しますがmy_little_proggy.exe、通常の優先度で実行します。そのため、次の投稿では、 の場合に出力をリダイレクトするという元の質問には答えていませんstart /HIGH

前回の投稿からスイッチ部分を編集し/HIGH、残りを以下に残しました。このテクニックは一般的には機能しstart、誰かの役に立つかもしれないからです。


記述方法により、リダイレクトは実際に実行されるコマンド(例では) ではなく、コマンド自体>に適用されます。これは、子プロセスが同じコンソールを共有するため (もコンソール アプリであると想定)、が機能する理由も説明しています。startstartmy_little_proggy.exestart /Bmy_little_proggy.exe

'ed コマンドの出力をリダイレクトするには、(a) セカンダリ シェル (または単に)start経由でコマンドを実行し、(b) をエスケープして、行によって特殊文字/リダイレクト文字として解釈されずに、 が保持されて を実行する子シェルに渡されるようにする必要があります。次のいずれかを実行すると、それが実行されます ( に注意してください)。cmd /ccall>startmy_little_proggy.exe^>

start call my_little_proggy.exe ^> output.txt
start cmd /c my_little_proggy.exe ^> output.txt


[編集 #1]上記の段落にcallor要件を追加しました。理由は、出力のリダイレクトはターゲット プログラム自体ではなくコマンド ライン インタープリターによって処理されるため、これを機能させるには、ターゲットを直接実行するのではなく、コマンド シェルによって起動する必要があるためです。cmd /c>my_little_proggy.exe

関連情報