実行後にコマンドプロンプトが閉じないようにするにはどうすればよいですか?


54

私の問題は、Windowsには、実行後すぐに閉じるコマンドラインウィンドウがあることです。これを解決するために、デフォルトの動作として、ウィンドウが開いたままになるようにします。通常、この動作は、私の頭に浮かぶ3つの方法で回避できます。

  1. 置くpause終了する前にキーを押すようにユーザに促すために、バッチプログラムの後にラインを
  2. (Start-Run-cmd.exe)net start xy内で、これらのバッチファイルまたは他のコマンドライン操作ツール(サービスの起動、再起動など、または同様のもの)をcmd.exe実行します。
  3. これらのプログラムを次のcmd /kように実行します。 cmd /k myprogram.bat

しかし、ユーザーが他にもいくつかのケースがあります。

  1. プログラムを最初に実行し、特定のプログラムがコマンドプロンプト(Windowsコマンドプロセッサ)で実行されることを知りません。たとえば、[スタート]メニュー(または他の場所)からショートカットを実行する場合、または
  2. cmd.exeを常に実行することは少し不快であり、これらのコマンドのコードをどこにでも書き直して一時停止したり、明示的に終了しないようにする時間/機会はありません。

AutoRunエントリを作成し、これらの場所でそのコンテンツを操作することで、明示的に開くときのデフォルトの動作を変更することに関する記事を読みましcmd.exe

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun

(自動実行アイテムは_String values_...)

cmd /d /kはそれを試してみるために値として入れましたが、これは上記のものの動作をまったく変更しませんでした...明示的に開いたときのコマンドラインウィンドウの動作を変更しました(Start-Run- cmd.exe)。

それでは、どのように機能しますか?この問題を解決するためのアイデアを教えてください。


10
すべての説明とあなたの質問は私の頭が爆発したいと思いました。次のようなことを言うことができます。この「例」コマンドでバッチファイルを実行し、終了したらコマンドボックスを開いたままにしておきます。それはあなたが求めていることですか?コードの近いサンプルを入れてください。
-KCotreau

1
+1合意。少し詳しく説明しますが、質問を再考し、可能であれば例を使用して、より簡潔な質問を作成してください。
-slotishtype

2
これは通常の動作であり、あなたの質問は確かに有効ですが、なぜコマンドプロンプトを開いたままにしておく必要があるのか​​疑問に思う必要があります(ほとんどのユーティリティはこの警告を念頭に置いて作成されています)。
ブレークスルー

1
私の意見では、これは本当の質問ではありません。代わりにバッチファイルを使用するようユーザーに指示します。それが質問の意図でない場合は、紛らわしい情報を削除して質問を明確にし、実際の目標を説明してください。それは...不明だ場合、それは正しい答えを考え出すのは難しい
タマラWijsman

1
@Randolf Richardson、これは、これらのツールがエンドユーザーに見られることはないからです(結局、GUIを使用する理由です)。そのような情報が必要な場合、ほとんどのITグループはバッチファイルを送信して適切なシステム情報を収集し、表示します。この質問の解決策が見つかった場合、それが解決するよりも少ない問題を引き起こす可能性がある方法はありません- stdout正当な理由で決して表示されることを意図していなかった多くのものが絶えず送信されます。
ブレークスルー

回答:


27

とにしか適用できないソリューションが.cmdあり.batます:

開いてregedit、次のそれぞれに移動します。

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
[HKEY_CLASSES_ROOT\cmdfile\shell\open\command] 

ここで、「デフォルトのキー値」をに変更しcmd.exe /k "%1" %*ます。これで、すべてのバッチスクリプトウィンドウは実行後も開いたままになります。

これはを使用cmd.exe /c cmd.exe /k program.batすることに似ていることに注意してください。つまり、別のCMDインスタンスが親インスタンスで起動されます。最初の/c引数を上書きする方法が見つかりませんでした。

を使用してこれを行うこともできますが[exefile]、実行可能ファイルにGUIがある場合は空のコンソールボックスが表示されます。


4
ここで与えられた質問に実際に答える唯一の解決策があるため、+ 1。残念ながら、これは起こるのを待っているメモリリークかもしれません。サービスがCMD行にCMD.EXEを指定せずに新しいバッチファイルを起動するとどうなりますか?その場合、このコードは使用されませんか?これにより、非対話型デスクトップに新しいウィンドウが作成され、再起動するまで開いたままになりませんか?
krowe2 14年

@APersonあなたの編集は*。を含めないことでコマンドを壊しました。編集するときは注意してください!
-not2qubit

@ not2qubit申し訳ありませんが、2つではなく3つのアスタリスクを削除したことに気付きませんでした。しましょう。
APerson

17

マイクロソフトの引用:

コンソールは、最後に接続されたプロセスが終了するか、FreeConsoleを呼び出すと閉じられます。

つまり、Win32コンソールウィンドウは、内部で実行されている最後のプログラムが終了すると常に閉じられ、これを変更することはできません。


(16ビットMS-DOSプログラムの場合、Windowsはプロパティダイアログに[終了時に閉じる]オプションを提供しますが、これは上記の動作の例外ではありません。ウィンドウを開いたままにするのはNTVDMプロセスです。再びプログラムごとに。)


13
コンソールウィンドウを閉じる方法理由を理解するための+1 (「OMGなぜITを開けないでください!!!!!!!!!!! 1111one」とだけ言う人とは対照的です)。それは設計どおりに動作し、私見のままであるはずです。これが、最初に標準ストリームとバッチファイルがある主な理由です。
ブレークスルー

27
@Breakthrough問題はHow can I do X、ではありませんIn your opinion, should I do X。この答えは役に立たない、それはXが不可能であることを暗示している、部分的な解決策がすでに他の場所で提示されているとき。(-1)
スーパーベスト14年

7

バッチファイルの場所でコマンドプロンプトを開き、バッチファイルの名前を手動で入力して、そのウィンドウ内で実行します。

1.実行可能ファイルが存在するフォルダーに移動します
2.Shiftキーを押しながら右クリックして、[ここからコマンドウィンドウ]を選択します3. 実行可能ファイル
の名前を入力してEnterキーを押します
4.プロセスが実行されますが、ウィンドウは開いたままです


1
Shift +右クリックについては知りませんでした。ただし、exeをcmdウィンドウにドラッグアンドドロップして、パスを自動的に設定することもできます。
スーパーベスト14年

1
これは通常私にとっては有効ですが、現在の状況では機能していないために解決策を探しているため、確かなことではないようです。
-RenniePet

これが最も簡単な解決策であり、正解としてマークする必要があります
ヴィッキーカパディア

4

cmd.exe /kいくつかのバッチで問題が発生します。バッチexit 1(なし/B)の場合、コンソールは閉じられます。トリックは以下を使用することです:

cmd.exe /k cmd /c ...

、すべてのバッチファイルのためにデフォルトでこれを使用して設定するHKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)HKEY_CLASSES_ROOT\batfile\shell\open\command\(default)します"%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*


1
私はそれが思った"%*"かつてのように、完全なパラメータリストを渡すので、これが二回最初のパラメータを渡していないでしょう"%1"し、再びの最初のパラメータとして"%*"
ケビンフェガン

1
@KevinFegan理由を確認していませんが、%1は引用符を保持する必要があります。との間には違いが%1 %2 %3 ..あり%*ますが、今は覚えていませんが、失敗%1 %2 %3する場合もあり%*ます。
ワーナイト

3

grawityの答えを読んだ後、私は愚かな解決策を見つけました。

私のユースケースは、より合理的なソリューションがすべてブロックされる職場でのコンソール環境のセットアップでした。必要なのは、PATHを設定し、いくつかのdoskeyエイリアスを構成して、シェルにダンプすることだけです。

私のソリューション(Win7でテスト済み)cmdは、バッチファイルの最後の行として追加します。これにより、親の環境を継承するネストされたコマンドプロンプトが実行されます。その子シェルは、終了するまでバッチプロセスを開いたままにします。終了すると、バッチには子プロセスがなく、終了します。


2

むしろPAUSEを(私は必要なときにPAUSEを使用してCHOICEまたはTIMEOUTを好む)使用するよりも、あなたはここで解決策を使用することができます:886848 /どのように対-Windowsのバッチファイルポーズとき-ダブルクリックします

このように、Windowsエクスプローラー内からバッチファイルまたはリンク(ショートカット)をクリックすると、バッチファイルプログラムが終了する前に一時停止できるため、プログラムの出力とエラーメッセージを表示できます。

CHOICEを使用すると、ユーザーが実行するさまざまなアクションを選択する機能をプログラムできます。TIMEOUTを使用すると、時間遅延(無人)後にウィンドウを閉じることができます。コマンドプロンプトウィンドウ内からバッチファイルを実行すると、これらの一時停止が煩わしい場合があります。

リンクされたソリューションでは、バッチファイルがコマンドプロンプトウィンドウから実行された場合、一時停止をスキップするかどうかを決定できます。

提供されているリンクで詳細を読むことができますが、基本は環境変数を使用することです:

%cmdcmdline%

バッチファイルがコマンドウィンドウから実行されたかどうかを判断します。

したがって、次のように使用します。

バッチファイルが終了する時点で、次のようなコードを追加します。

echo %cmdcmdline:"=-% | find /i "cmd /c --%~dpf0%-"
if %errorlevel% NEQ 0 goto :EOF
pause
goto :EOF

rem if %errorlevel% EQU 0 batch-file: %~dpf0 was executed from Windows Explorer, ...
rem if %errorlevel% NEQ 0 batch-file: %~dpf0 was executed from within a Command Prompt

1

これを回避するための最良の方法は、startを使用して別のバッチファイルからバッチファイルを呼び出すことです。

したがって、通常go.batというファイルを実行する場合、go2.batのような名前の2つ目のバッチファイルを作成します。

go2.batの内容はただ

start go.bat

最初のウィンドウはすぐに閉じますが、go.batを実行しているウィンドウは開いたままです


これは機能します。コマンドプロンプトの実行可能ファイルの名前を1つのbatファイル(1.bat)に入れるだけです。このファイルは、2番目のbatファイル「start 1.bat」からstartコマンドを使用して呼び出されます。コマンドウィンドウは開いたままです。
エジェクタメント

1

これは、Windowsレジストリエディターのバージョン5.00で機能します。

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

[HKEY_CLASSES_ROOT\cmdfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

上記のコマンドを次のようなファイルに保存してcmdbatfile-open.reg実行してください!


2
Stack Exchangeへようこそ!回答の書式を修正しました。書式設定のヘルプについては、こちらをご覧ください。また、コードを投稿するときは、正確に何をするのかを忘れずに説明してください。また、回答に関するハウツーを読むこともできます。
ブラックライトシャイニング

1

独自のインスタンスで起動する2つのバッチファイルがあり、実行可能ファイルが終了しても開いたままにしておくとします。これらの2つのバッチA.batとを呼び出しましょうB.bat

簡単にするために、両方を起動するバッチファイルを用意することができます。これlaunch_both.batをコンテンツで呼び出しましょう。

start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"

exit2つのバッチファイルのいずれかを呼び出すと、期待どおりに動作しない可能性があります。それをテストする必要があります。


0

Windows 10を使用しているユーザーの場合、上記の回答はいずれも現在Windows 10では機能しないことに注意してください。

Windows 10の場合、スクリプトにアクセスできる場合は、最後に次のコードを追加する必要があります。

read

そのコードは入力を待ってから閉じます。


質問(5年前)は、Windows 10の前に頼まれた、より多くの情報をあなたの答えを編集してください覚えている
ヤスの

0

PSIXOのダウングレードへの対応として-「この回答はすでに質問で取り上げられていました。-Ro Yo Mi 16年1月20日5時6分」-いいえ、そうではありませんでした。以前の回答は「一時停止」でしたが、機能しませんでした。PSIXOの答えは、「&pause」でした。ダウングレードする前に、より慎重に解析してください。私はこれをIDLEプロンプトから実行しましたが、うまくいきました:

    >>> os.system('dir ^ & pause')
    0
    >>> 

一方:

    >>> os.system('dir ^ pause')
    1
    >>>

動作しませんでした(cmdプロンプトがひっくり返り、実際にエラー(1)を返しました)。必要な答えをくれたPSIXOに感謝します。ヘンリー。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.