
バッチスクリプトを作成しました(全文はこちら) は、最初にいくつかのサービスを開始し、次にアプリケーションを開始します。アプリケーションが完了したら、バッチはGOTO somewhere
プログラムが終了するのを待って、さらに続行するはずです。
アプリケーションを起動して続行するためのヘッダー:
:vmSTARTAPP
"C:\Program Files (x86)\VMware\VMware Workstation\vmware.exe"
IF NOT %BACK%==NULL GOTO %BACK%
GOTO STARTAPPCONT
このヘッダーは別のヘッダーから呼び出されます:
:STARTAPP
cls
echo Starting Application
GOTO %BATCH%
%BATCH%
次のヘッダーの名前が含まれます - 上記の場合は、 ですvmSTARTAPP
。
新しいコマンド プロンプト ウィンドウから実行すると正常に動作しますが、このバッチでは動作しません。
何が間違っているのでしょうか?
PS この質問を私の以前の質問に関連付けないでください。これはまったく別のケースです。
答え1
表示されている行を置き換えてみてください
:vmSTARTAPP
"C:\Program Files (x86)\VMware\VMware Workstation\vmware.exe"
と
:vmSTARTAPP
start "Starting VMWare" /B "C:\Program Files (x86)\VMware\VMware Workstation\vmware.exe"
VMWare をサイレントに起動し、停止せずに続行したいと想定しており、理論的にはこれがその目的を果たすはずです。
このstart
コマンドは、渡されたコマンド (この場合は「C:\Program Files (x86)\VMware\VMware Workstation\vmware.exe」) を実行するように DOS に指示し、デフォルトでは渡されたコマンドが返されるのを待たずに別のプロセスで実行します。
デフォルトでは、バッチ ファイル内のすべての行が順番に実行され、すべての行が実行されて返されるまで待機してから次の行に進みます。コマンドは、start
渡されたプログラムを別のプロセス (DOS ウィンドウ) で起動することでこれを回避します。そのため、バッチ ファイルはこの行を検出すると、通常どおり実行し、コマンドがstart
返されたことを確認し (コマンドを実行するための新しいプロセスを作成した後)、予期しない事態が発生しなかったかのようにバッチ ファイルを続行します。
タイトル"Starting VMWare"
は単なるタイトルです。新しい DOS ウィンドウを表示しないように指示する引数がなければ、新しく作成された DOS ウィンドウにはそのタイトルが表示されます/B
。タイトルは必須であると同時にオプションでもあり、タイトルのないスクリプトで WTF な瞬間が時々ありましたが、そのようなときは例外です。
スタートコマンドの詳細については、http://ss64.com/nt/start.html