プロセスを高い優先度で開始し、同時にその標準出力 (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
、誰かの役に立つかもしれないからです。
記述方法により、リダイレクトは実際に実行されるコマンド(例では) ではなく、コマンド自体>
に適用されます。これは、子プロセスが同じコンソールを共有するため (もコンソール アプリであると想定)、が機能する理由も説明しています。start
start
my_little_proggy.exe
start /B
my_little_proggy.exe
'ed コマンドの出力をリダイレクトするには、(a) セカンダリ シェル (または単に)start
経由でコマンドを実行し、(b) をエスケープして、行によって特殊文字/リダイレクト文字として解釈されずに、 が保持されて を実行する子シェルに渡されるようにする必要があります。次のいずれかを実行すると、それが実行されます ( に注意してください)。cmd /c
call
>
start
my_little_proggy.exe
^>
start call my_little_proggy.exe ^> output.txt
start cmd /c my_little_proggy.exe ^> output.txt
[編集 #1]上記の段落に
call
or要件を追加しました。理由は、出力のリダイレクトはターゲット プログラム自体ではなくコマンド ライン インタープリターによって処理されるため、これを機能させるには、ターゲットを直接実行するのではなく、コマンド シェルによって起動する必要があるためです。cmd /c
>
my_little_proggy.exe