web-dev-qa-db-ja.com

実行後にコマンドプロンプトが閉じないようにする方法

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

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

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

  1. プログラムを最初に実行し、与えられたプログラムがコマンドプロンプト(Windows Command Processor)で実行されることを知りません。 [スタート]メニュー(または他の場所から)からショートカットを実行するとき
  2. Cmd.exeを常時実行してこれらのコマンドのコードを書き換えて一時停止させる時間や機会​​がないのはちょっと不快です。明示的に終了しないでください。

明示的に開いたときのcmd.exeのデフォルトの振る舞いの変更について 記事 を読んで、 AutoRunエントリ を作成してその内容を操作する場所:

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

(自動実行項目は_String values_...です。)

試しにそれの値としてcmd /d /kを入れましたが、これは上で言及されたものの振る舞いを全く変えませんでした...それはそれを明示的に開いたときコマンドラインウィンドウの振る舞いを変えました-cmd.exe).

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

53
Sk8erPeter

私は.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がある場合は空のコンソールボックスが表示されます。

26
user8228

引用 マイクロソフト

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

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


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

15
grawity

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

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

7
Lee Harrison

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" %*に設定します。

4
Wernight

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

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

私の解決策(Win7でテストしたばかり)として、バッチファイルの最後の行にcmdを追加します。これは親の環境を継承する入れ子になったコマンドプロンプトを実行します。その子シェルは、終了するまでバッチプロセスを開いたままにします。この時点で、バッチは子プロセスを持たずに終了します。

3
kitsu.eb

PAUSEを使用するのではなく(必要に応じてPAUSEを使用するよりもCHOICEまたはTIMEOUTを使用します)、ここでソリューションを使用できます。 886848/how-to-windows-batch-file-pause-whenダブルクリック

このように、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
2
Kevin Fegan

これを回避するために私が見つけた最良の方法はstartを使って別のバッチファイルからあなたのバッチファイルを呼び出すことです。

そのため、通常go.batというファイルを実行すると、go2.batのような名前の2番目のバッチファイルが作成されます

go2.batの内容は

start go.bat

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

1
agradl

これは、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のような名前のファイルに保存して実行します。

1
VumC

自分のインスタンスで起動したい2つのバッチファイルがあり、それらの実行ファイルが存在する場合は開いたままにしておくとします。これら2つのバッチをA.batB.batと呼びましょう。

簡単にするために、両方を起動するためのバッチファイルを用意することができます。その内容をlaunch_both.batと呼びましょう。

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

2つのバッチファイルのいずれかでexitを呼び出すと、期待通りに動作しない可能性があります。それはテストされる必要があるでしょう。

1
Francois

Windows 10を使用しているユーザーの場合、上記の答えはどれも現在Windows 10には有効ではありません。

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

read

そのコードは閉じる前に入力を待ちます。

0
jaycode

PSIXOの格下げに対する回答 - 「この答えはすでに質問で扱われていました。 - Ro Yo Mi 5月6日の16年1月20日」 - いいえ、違います。以前の答えは「一時停止」でしたが、うまくいきませんでした。 PSIXOの答えは「&pause」でした。ダウングレードする前にもっと慎重に解析してください。私はこれをIDLEプロンプトから実行しましたが、うまくいきました。

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

一方:

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

動作しませんでした(cmdプロンプトが飛び越えて、実際にエラー(1)を返しました)。私が必要とした答えについてPSIXOに感謝します。ヘンリー.

0
Henry