私の問題は、Windowsでは、実行後すぐに閉じるコマンドラインウィンドウがあるということです。これを解決するために、デフォルトの動作はウィンドウを開いたままにしておくことです。通常、この動作は私の頭に浮かぶ3つの方法で回避することができます。
pause
行を追加するnet start xy
(Start - Run - cmd.exe)内でこれらのバッチファイルまたは他のコマンドライン操作ツール(cmd.exe
または同様のものでサービスの開始、再起動など)を実行する。cmd /k
を使用してこれらのプログラムを次のように実行します。cmd /k myprogram.bat
しかし、ユーザーが他にもいくつかの場合があります。
明示的に開いたときの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).
それでそれはどのように動作しますか?この問題を解決するためのアイデアを教えてください。
私は.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がある場合は空のコンソールボックスが表示されます。
引用 マイクロソフト :
最後に接続したプロセスが終了するかFreeConsoleを呼び出すと、コンソールは閉じられます。
言い換えると、Win32コンソールウィンドウは、その内部で実行されている最後のプログラムが終了すると常に閉じられ、これを変更することはできません。
(16ビットのMS-DOSプログラムの場合、Windowsはプロパティダイアログに "終了時に閉じる"というオプションを提供しますが、これは上記の動作の例外ではありません。これもプログラムごとです。)
バッチファイルの場所でコマンドプロンプトを開き、手動でバッチファイルの名前を入力してそのウィンドウ内で実行します。
1.実行ファイルが存在するフォルダに移動します
2. Shiftキーを押しながら右クリックして、「ここからコマンドウィンドウ」を選択します。
実行可能ファイルの名前を入力してEnterキーを押します。
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" %*
に設定します。
grawity
の答えを読んだ後、私はただダムな解決策を見つけました。
私のユースケースは、より合理的な解決策がすべてブロックされている、コンソール環境を職場でセットアップすることでした。必要なのは、PATHを設定し、いくつかのdoskeyエイリアスを設定してシェルにダンプすることだけです。
私の解決策(Win7でテストしたばかり)として、バッチファイルの最後の行にcmd
を追加します。これは親の環境を継承する入れ子になったコマンドプロンプトを実行します。その子シェルは、終了するまでバッチプロセスを開いたままにします。この時点で、バッチは子プロセスを持たずに終了します。
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
これを回避するために私が見つけた最良の方法はstartを使って別のバッチファイルからあなたのバッチファイルを呼び出すことです。
そのため、通常go.batというファイルを実行すると、go2.batのような名前の2番目のバッチファイルが作成されます
go2.batの内容は
start go.bat
最初のウィンドウはすぐに閉じますが、go.batを実行しているウィンドウは開いたままです。
これは、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つのバッチファイルがあり、それらの実行ファイルが存在する場合は開いたままにしておくとします。これら2つのバッチをA.bat
とB.bat
と呼びましょう。
簡単にするために、両方を起動するためのバッチファイルを用意することができます。その内容をlaunch_both.bat
と呼びましょう。
start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"
2つのバッチファイルのいずれかでexit
を呼び出すと、期待通りに動作しない可能性があります。それはテストされる必要があるでしょう。
Windows 10を使用しているユーザーの場合、上記の答えはどれも現在Windows 10には有効ではありません。
Windows 10の場合、スクリプトにアクセスできる場合は、最後に次のコードを追加する必要があります。
read
そのコードは閉じる前に入力を待ちます。
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に感謝します。ヘンリー.