exeがバッチファイルで完了するのをどのように待ちますか?


43

sp1をインストールするために、シャットダウン時にexeを実行するスクリプトを作成しようとしています。私のスクリプトは次のようなものです(実際のバットスクリプトではありません)。

If installed GOTO END
    Install.exe
END:

私の問題は、インストーラーが異なるプロセスであるため、インストーラーを起動してからスクリプトを終了し、コンピューターがシャットダウンしてシステムをシャットダウンするため、インストールプロセスをシャットダウンすることです(少なくとも、それは私が思うことです)やっています。)

開始したプロセスが完了するまで待ってからシャットダウンするように指示する方法はありますか?

回答:



23

短い方法:

Install.exe|more

また

install|rem

を使用することもできますが、最終的にはコンソール出力をキャッチできるようになります。これが機能する理由です-パイプコマンドは.exeが終了するまで入力を待ちます


そして、なぜdownlvoteはありますか?
npocmaka

これは素晴らしいです!賛成票を投じます。
長王張

2
これは明らかに勝ちます
-Fnord

exeがパラメータを取る場合はどうなりますか?それはどのように機能しますか?
m4l490n

@ m4l490n-それは大丈夫です。リダイレクトと条件付き実行演算子(バッチスクリプトに高い優先順位を有し<>>>&&&|||
npocmaka

13

バッチファイルから直接exeを呼び出すか、またはを使用してstart /wait動作しますが、警告があります。

呼び出したexeが別のexeを呼び出すなど、他のプロセスを作成し、バッチファイルを終了すると、呼び出されたexeが終了した後も処理が続行されます。

あなたの場合、これは本当の問題です。インストーラは通常、exe自体に埋め込まれている何らかの形の圧縮コンテナからファイルを抽出し、抽出されたファイルの1つを起動して終了するからです。一部のインストーラーは、インストール全体が完了するまで元のexeが終了しないように指示するコマンドラインパラメーターを提供するため、調査する必要がある場合があります。それ以外は、バッチファイルだけでこれを回避する方法はなく、プログラムによる解決策が必要です。


シャットダウンルーチンに常にループを追加して、msiexec.exe(またはそれが何であれ)が実行されているかどうかを確認し、待機して再度ループすることができます。
mfinni

@mfinniは、問題をさらに複雑にするために、msiexec他のプロセスも起動します。:(
ジョンガーデニアス

1
実際、どうして必要なのstart /waitですか?私はstart /wait、GUI(コンソールとは対照的に)アプリケーションが終了するまで、バッチファイルをブロックするために使用する必要があると考えました。しかし、今それをテストすると、バッチファイルは実際にはGUIアプリケーションを待っていることがわかります。対応する質問を投稿しました:なぜGUIアプリケーションがバッチファイルをブロックするのですか?
マーティンPrikryl

私はこの問題を抱えていたので、解決策を答えとして追加しました。
FreeSoftwareServers

5

以下は、MATLABを使用した例です!MATLABのパスセットアップが完了し、FileName.mファイルによってMATLAB出口が保証されている(またはユーザーが内部で指定している)と想定しました。

echo off
matlab -nosplash /r "FileName.m"
:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
if errorlevel 1 goto loop
exit

2
Matlabが私にとっては少し奇妙に思える、特にここではサーバーフォールトを想定しています。
エリック14年

これは、MATLAB以外のものでも機能します。「MATLAB.exe」を別のものに変更するだけです。そして、おそらく、2番目の「検索」を修正して、フィルター処理された出力で再びexeを検索します。
オリバーボック14

1

私の問題は、@ John Gardeniersが持っていたか説明していました。私のexeが別のexeを呼び出して終了したため、start / waitが機能しませんでした。「whileループ」を作成して、実行中かどうかを確認し、完了したら先に進みます。ニーズに合わせて時間を調整できます。

TIMEOUT /T 60

SETLOCAL EnableExtensions
set EXE=MYEXETOCHECK.exe
:LOOPSTART
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
goto FIN
:FOUND
TIMEOUT /T 30
goto LOOPSTART
:FIN

0

start / waitコマンドを使用できます。これにより、アプリケーションが起動し、終了するまで待機します。

または、実行にかかる時間を知っている場合は、Windows Server 2003リソースキットツールで提供されるスリープコマンドを確認できます。Sleep.exeを使用してバッチを任意の秒数の間一時停止し、バッチファイルが他の何かをインストールする前にプログラムを完全にインストールできるようにすることができます。プログラム自体が別のプロセスを起動するため、「start / wait」構文を無視するプログラムがいくつかあり、sleep.exeは非常に便利です。

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