※ 本記事はマイクロソフト社員によって公開されております。
こんにちは。 Windows プラットフォーム サポート担当のロベルトです。
本記事では、Windows Server 2019 や Windows Server 2022 でコマンド プロンプト(以降 cmd.exe と記述します)が、異常終了する問題と回避方法ついてご紹介します。
事象
コンソール プログラムを繰り返し実行すると稀に conhost.exe が例外コード 0xC0000142 で異常終了し、それに伴い cmd.exe も異常終了するという問題が報告されております。
原因
1 つのバッチ ファイルなどのコンソール プログラムから並行して同時にコマンドを実行すると、複数の cmd.exe が起動します。これらの cmd.exe から同時に コンソール出力を行うと、 1 つの conhost.exe に対して、コンソール出力の要求が発生し、稀にコンソール出力の競合が発生してしまう場合があります。
このような競合が発生すると conhost.exe が、誤った情報を参照し、異常終了をしてしまいます。また、conhost.exe が異常終了してしまうと cmd.exe も正常に処理できず、異常終了をしてしまいます。
弊社での対応状況
本問題については、2023 年 5 月 9 日(米国時間)に公開された以下の更新プログラムに修正が含まれております。ご利用の環境にて本問題が発生している場合には、以下の更新プログラム以降を適用いただくことで、事象が解消されます。
なお、2023 年 2 月 14 日(米国時間)以降に公開された更新プログラムを適用し、専用のグループ ポリシーで本問題への修正を手動で有効化した環境については、上記の更新プログラムを適用するとポリシーの設定が「無効」であったとしても修正が適用されます。専用のグループ ポリシーをアンインストールする必要はありませんが、更新プログラムの適用後は、「有効」と「無効」を制御することはできません。
回避策
この問題は、cmd.exe の設定を変更することで回避が可能です。また、バッチ ファイルをご利用の場合は、cmd.exe の設定を変更せずとも、バッチ ファイルを変更することで回避が可能です。
cmd.exe の設定を変更する方法
以下の手順でコンソール モードを変更することで、回避できます。
- コマンド プロンプトを起動します。
- 左上のアイコンをクリックし、 [既定値] を選択します。
- [オプション] タブを開き、 [レガシー コンソールを使用する(再起動が必要で、すべてのコンソールに影響します)] をチェックします。
- [OK] をクリックします。
- すべての cmd.exe を再起動します。
上記の手順で cmd.exe の既定のコンソール モードは変更されますが、既にショートカット ファイル毎に設定を変更している場合は、設定が反映されません。その他場合は、対象の cmd.exe のショートカット ファイルを起動後、手順 2 で、[プロパティ] を選択し、以降の手順を実施ください。
なお、この設定の留意点として、一部で UTF-8 の処理が行われなくなるため、文字化けに関する問題が発生する可能性があります。
レガシー コンソールの概要については、こちらの公開情報をご参照ください。
バッチファイルを変更する方法
バッチ ファイルから複数のコマンドを同時に実行する方法としては、start コマンドに /b オプションを使用します。 /b オプションを利用すると新しいウィンドウを生成をしないため、コンソール出力は、1 つの conhost.exe が処理し、並行して複数コマンドが実行するため、この問題の発生条件を満たしてしまいます。
このため、start /b を使用しなければ、回避できます。
また、start /b の代替の方法として、cmd.exe /k を使用する方法があります。cmd.exe /k を使用すると新しいウィンドウを生成せず、バッチ ファイルがシーケンシャルに実行するため、本問題の発生条件を満たしません。ただし、並行して実行されないため、すべてのコマンドが完了するまで、時間を要することがあります。
もし、処理時間を優先して実行する場合は、start コマンド (/b なし) を使用します。start コマンド (/b なし) を使用すると新しいウィンドウを生成して、ウィンドウ毎に conhost.exe が起動するため、この問題の発生条件を満たしません。
まとめますと、以下の方法のいずれかで回避することができるため、ご利用の方法に合わせて、代替方法をご検討ください。
start /b の代替となる起動方法 | 新しいウィンドウの作成有無 | 並行実行の有無 |
---|---|---|
start (/b なし) | 新しいウィンドウを作成する | 並行して実行される |
cmd.exe /k | 新しいウィンドウを作成しない | 並行して実行されない |
本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。