バッチ プログラムが正常に機能しません。

バッチ プログラムが正常に機能しません。

バッチスクリプトを作成しました(全文はこちら) は、最初にいくつかのサービスを開始し、次にアプリケーションを開始します。アプリケーションが完了したら、バッチは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

関連情報