web-dev-qa-db-ja.com

バッチファイルの実行後にcmdが終了しないのはなぜですか?

バッチファイルの実行後にcmdが終了しないのはなぜですか?

私が試してみました:

"C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

そして

@echo off
"C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar
exit
25
Joe

Javaアプリが終了しない場合(たとえば、バッチファイルを使用してJavaアプリ)を起動している場合)、startコマンドを使用しますそれを起動するには:-

start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

これにより、Javaアプリが起動し、Javaアプリの終了を待たずにバッチファイルの実行が続行されます。

31
misterjaytee

説明:

以下がその仕組みです。バッチファイルは一度に1行ずつ処理されます。各コマンドは順番に実行され、バッチプロセッサは1つのコマンドが完了するのを待ってから次のコマンドを開始します。発生している問題は、起動しているJavaアプリケーション(Jilko.jar)が、ウィンドウを起動するプログラムであり、それを起動する行の後でも引き続き実行されるためです。それが実行するツールの場合いくつかのアクションを実行して終了すると、バッチファイルは次のコマンドに進みます(それ以上ない場合は終了します)。プログラムはまだ実行中であるため、バッチプロセッサはウィンドウが閉じるまで待機してから次のコマンドに進みます。 Javaプログラムを終了することによって動作中:バッチファイルを含むコンソールウィンドウが閉じます。


解決策:

それを修正するために必要なことは、プログラムを起動し、そのように待たずに続行するようにバッチプロセッサに指示することです。

start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

言及されたTerrance のように、""は、コンソールウィンドウに使用するタイトルです。ただし、コマンドが引用符で囲まれていない場合のみオプションです。それ以外の場合はが必要です。好きなものを入れたり、空のままにしたりできますが、コマンドが引用符で囲まれている場合は、それが存在している必要があります。そうでない場合、コマンドインタープリターは引用されたコマンドをタイトルとして扱い、そこに待機しているコンソールを開きます。何かをする必要がある。

代わりに次のコマンドを使用できますが、ショートネームがすべてのシステムで同じであるとは限らないため、引用符はより簡単で安全です。

start C:\Progra~2\Java\jre6\bin\javaw.exe -Xmx1024M -Xms1024M -jar Jilko.jar

startコマンドは、プロセスを起動する組み込みコマンドです(基本的に、[スタート]メニューからプログラムを実行するのと同じです)。したがって、このコンテキストでは、バッチプロセッサがstartコマンドを実行して、指定されたプログラムを実行し、終了します(生成されたプログラムではなく、それ自体)。そのため、バッチプロセッサは期待どおりに続行します。最小化されたプログラムの実行(/min)または最大化(/max)、低優先度で実行(/low) 等々。見る start /? 詳細については。

20
Synetech

起動したプログラムの一部はプロセスを実行したままにし、実行可能ファイルを起動して実行しただけではコンソールウィンドウが終了しないことがわかりました。

STARTプログラムはそれを修正しますが、STARTに関する古い問題はまだ残っています。あなただけを使うことはできません:

START "c:\my dir\myfile.exe"

STARTの最初のパラメーターはウィンドウ名のままです。省略した場合は、起動しようとした名前のウィンドウでCMDコンソールボックスを開くだけです。上記の例では、「c:\ my dir\myfile.exe」というタイトルのコンソールウィンドウが表示されます。欲しかった!

ウィンドウ名を省略するには、次のように、二重引用符のペアを使用して空の文字列を定義します。

START "" "c:\my dir\myfile.exe"

最後に、EXITコマンドでバッチファイルを終了して、バッチファイルが確実に閉じられるようにします。

この方法は、Windows 7および8で一貫して機能するようです。

トラブルシューティングのために、私がやろうとしていることのECHOを追加してから、今行ったことのタイムアウトを追加すると、非常に役立つことがわかりました。例えば:

ECHO I'm about to launch the program...
START "" "c:\my dir\myfile.exe"
TIMEOUT 5

タイムアウトはカウントダウンを提供するので、遅延しようとしていることをエコーする必要はありません。

7
AzDayton

また、Windows 7では、以前のバージョンのWindowsと同様に、バッチファイルの終わりに到達しただけで終了するわけではないため、EXIT 常時を使用します。 Windows 7は、以前のNTバージョン(Windows 2000 Professionalなど)よりもこれに敏感です。これは、以前の回答のすべてではないで言及されました。

答えを裏付ける個人的な経験の詳細:

StarSuite5.2インストールをWindows 2000からWindows 7に転送した後、スイートを終了するとメモリスペースエラーが発生しました。これはWindows 2000では見られませんでした。

数年前、私はsoffice.iniが自動的にバックアップおよび復元されるようにバッチファイルを作成し、破損したときに修復できるようにしました(多くの場合、問題になるほど十分です-スイートのロードに失敗します)。ただし、自動バックアップ(Office52\user\config\startupに配置されたバッチファイルへのリンクによってトリガーされる)は、約5秒の遅延後にのみ発生します。バッチファイルが実行される直前にスイートを終了すると、スイートの終了がエラーなしで終了することに気付きました。これにより、バッチファイルに問題があることがわかりました。

'EXIT'コマンドがバッチファイルの最後の行として配置された後、バッチファイルが実行されたかどうかにかかわらず、Officeスイートは常にメモリ空間エラーメッセージなしで終了し始めました。

5
RonCam

アプリが完了すると、終了します。 Javaアプリは正常に終了していますか?

2
Azz

私は同じ問題を扱っていましたが、バッチファイルにランダムな変更のように見えたものを加えた後、最終的には解決しました-理由はわかりませんが、後で他の誰かを助けるためにここに投稿します。

XP Homeにはコマンドライン機能の点で多くは含まれていません。 SysInternals Pskill ユーティリティと sleep ユーティリティを利用しています。


これは、完了後に実際に閉じるバッチファイルです。

@echo off
start /min C:\Progra~1\PsTools\pskill.exe Explorer.exe
start /min C:\Progra~1\PsTools\pskill.exe Powermenu.exe
start /min C:\Progra~1\PsTools\pskill.exe PWGen.exe
start /min C:\Progra~1\PsTools\pskill.exe redshiftgui.exe
start /min C:\Progra~1\PsTools\pskill.exe clipx.exe
sleep 2
start Explorer.exe
sleep 3
start C:\Progra~1\ClipX\clipx.exe
sleep 1
start C:\Progra~1\Powermenu\PowerMenu.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe
sleep 1
start C:\Progra~1\RedshiftGUI\redshiftgui.exe && exit

最後の数行をこのように変更した場合、隅にある「X」をクリックするまで、cmdウィンドウは開いたままになります。

start C:\Progra~1\RedshiftGUI\redshiftgui.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe && exit

自分自身を殺すためにpskillを起動しようとした場合でも、cmd.exeプロセスがタスクマネージャから消え、そのcmd.exeの内部からpskillがcmd.exeプロセスが強制終了されたと報告しますが、cmd.exeウィンドウは、隅にある「X」をクリックするまで表示されたままになります。

start C:\Progra~1\RedshiftGUI\redshiftgui.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe
sleep 1
C:\Progra~1\PsTools\pskill.exe cmd.exe

追加した後&& exitすべての行に、それらの一部がそれに応答してバッチ処理を中断することに気づきました-他の人はそうしませんでした。

したがって、元々持っていた方法ではなく、応答性の高いものを最後に置いただけです。

言ったように、理由はわかりませんが、これで終わりです。

2
NginUS

試してください:

cmd /c "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

1

EXITコマンドがウィンドウを開いたままにしておくと、不明な理由でバッチファイルウィンドウを閉じるための解決策を探していました。ようやく解決策を見つけました。

バッチファイルの最後からEXITを削除し、次を使用します。

Taskkill /IM conhost.exe /F
0
Bryan

Windows 7 32ビットマシンでNet Useバッチファイルを作成しましたが、バッチファイルのcmdが実行後に終了しません。同じバッチファイルを別のWindows 7 64ビットマシンで実行すると、バッチファイルのcmdが正常に終了します。

私は ブライアンの提案 を試しましたが、そのWindows 7 32ビットマシンでは動作しません。conhost.exeプロセスがないため、次のように変更しました。

Taskkill /IM cmd.exe /F

Net Useバッチファイルは常に正常に終了するわけではなく、「バッチジョブの終了(Y/N)」確認がランダムに表示されます

これによると thread バッチファイルを次のように変更しました。

@echo off

if "%~1"=="-FIXED_CTRL_C" (
   REM Remove the -FIXED_CTRL_C parameter
   SHIFT
) ELSE (
   REM Run the batch with <NUL and -FIXED_CTRL_C
   CALL <NUL %0 -FIXED_CTRL_C %*
   GOTO :EOF
)

Net Use \\Server\folder

Taskkill /IM cmd.exe /F

Net Useバッチファイル最終的に正常に終了します。

0
w10

ここに私がそれをした方法があります:

  1. 次の内容のバッチファイルを作成します。

    Java -Xms512M -Xmx512M -jar yourFileName.jar -o true
    EXIT
    
  2. Exit入力ストリーム内に、次を追加します。

    System.exit(1);
    
0
mishael

Windows 2003のデフォルトでは、コントロールパネルに「ユーザーアカウント」はありません。ユーザーアカウントを開くための短いバッチを作成しました。

@echo off  
rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll  
exit

正常に機能し、ユーザーアカウントは開きましたが、CMDウィンドウも開いたままでした。ここでいくつかの調査を行った後、次のように追加しました:START ""を2行目の先頭に追加します。

@echo off  
Start "" rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll o
exit

これで、[ユーザーアカウント]ウィンドウが開き、開いたままになり、CMDウィンドウが閉じます。イージーピージー。

0
user510236