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


25

バッチファイルの実行後に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

回答:


31

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

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

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


20

説明:

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


溶液:

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

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

以下のようテランスが言及した""コンソールウィンドウに使用するタイトルです。ただし、コマンドが引用符で囲まれていない場合のみオプションです。それ以外の場合は必須です。必要に応じてそこに何かを入れることも、空のままにしておくこともできますが、コマンドが引用符で囲まれている場合は、それが存在する必要があります。何かをする必要がある。

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

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

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


のようなスタートを検討できますか nohup en.wikipedia.org/wiki/Nohup
ムハンマドHewedy

いいえ(nohupおよび&と比較したい場合を除く)。
ヘネス

7

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

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

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


5

また Windows 7では、以前のWindowsバージョンのように、バッチファイルの最後に到達しても必ずしも終了しないため、常に EXIT 使用します。Windows 7は、これに対して以前のNTバージョン(Windows 2000 Professionalなど)よりも敏感です。これはいくつかで言及されましたが、、以前の回答のすべてではなく

回答をサポートする個人的な経験の詳細:

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

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

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


2

アプリが完成したら、終了するはずです。Javaアプリが正常に終了していますか?


2

私はちょうど同じ問題に対処していましたが、バッチファイルにランダムな変更のように見えるものを作成した後、最終的に解決しました-理由はわかりませんが、後で誰かに役立つ場合はここに投稿します。

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プロセスはタスクマネージャーから消え、pskillはcmd.exeの内部から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すべての行に追加した後、それらの一部が応答し、バッチ処理を中断することに気付きましたが、他の行は応答しませんでした。

だから、私はもともと持っていた方法の代わりに、最後にレスポンシブなものの1つを置くだけです。

私が言ったように、私は理由を知りませんが、これで終わってうれしいです。


1
これはとても不要です。
surfasb

&&出口が私の作品
jekcom


0

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

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

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

    System.exit(1);
    

0

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

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

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

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

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


0

EXITコマンドで不明な理由でウィンドウが開いたままになっているときに、バッチファイルウィンドウを閉じるためのソリューションを検索および検索しています。私はついに解決策を見つけました。

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

Taskkill /IM conhost.exe /F

0

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

私はBryanの提案を試みましたが、conhost.exeプロセスがなかったため、Windows 7 32ビットマシンでは動作しません。したがって、次のように変更しました。

Taskkill /IM cmd.exe /F

ネット使用バッチファイルは常に正常に終了するとは限らず、「バッチジョブの終了(Y / N)」確認がランダムに表示されるます。

このスレッドに従って、バッチファイルを次のように変更しました。

@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バッチファイルは、最終的に正常終了します。

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