none
コマンドプロンプトでBATファイルを非同期実行する場合の引数の渡し方について RRS feed

  • 質問

  • いつも参考にさせていただいております。

    Windows7でBATファイルの中から別のBATファイルを非同期で呼び出すときに、Startコマンドを使っていますが、 この呼び出される側のBATファイルに引数を与えたいと考えています。引数は親BATで作られる値なので、変数になります。
    2個のBATファイルは同じフォルダにあります。

    Start %0\..\child.bat %arg1% %arg2% %arg3%

    親BATを上記のようにして実行すると、以下のエラーになります。

    The system cannot find the file [ %arg1%の内容].

    これは、%arg1% が引数ではなく実行ファイルとして認識された結果に見えます。

    Startの使い方が悪いのかと思いますが、どなたかご存知の方がいらっしゃいましたら教えてください。

    宜しくお願い致します。

    2016年7月26日 2:33

回答

  • 状況をあまり想像できないまま答えてみますが、例えば以下のようにするとどうでしょう?

    START CMD /K "%0\..\child.bat "%arg1%" "%arg2%" "%arg3%""

    2016年7月26日 4:13

すべての返信

  • バッチ ファイルが配置されたフォルダー パス (%0 に入るもの) のどこかに空白が含まれていませんか?

    2016年7月26日 2:58
  • ご返信ありがとうございます。

    %0は展開すると自動的に””で括られるので、スペースの問題は無いと考えていました。

    ところがこの仕様が罠だったようで、Start の後の最初のパラメータにダブルクォーテーションがある場合、それは実行プログラムではなく、ウインドウタイトルとして認識していました。そのため引数の認識がずれてarg1が実行ファイル扱いになっていました。

    そこで、記述を改めて、

    start "" %0\..\child.bat ”%arg1%" "%arg2%" "%arg3%"

    のようにしたところ、arg1を実行しようとする挙動は無くなりました。

    しかし、child.bat は正しく実行されず、 %arg1% の一部を含む 文字列を実行しようとしています。 

    具体的には %arg1%には日付が入り、これはスペースを含んでいます。

    実行結果のエラーは、'C:\temp\master.bat"\..\child.bat  "Tue' is not recognized as an internal or ext
    ernal command,operable program or batch file.

    このようになり、ダブルクオーテーションの括りがおかしなことになっています。

    うまくchild.batを呼び出せるといいのですが。しばらく試行錯誤してみます。

    もしお分かりのことがありましたら、助言いただけますと幸いです。


    2016年7月26日 3:32
  • 状況をあまり想像できないまま答えてみますが、例えば以下のようにするとどうでしょう?

    START CMD /K "%0\..\child.bat "%arg1%" "%arg2%" "%arg3%""

    2016年7月26日 4:13
  • ご返信ありがとうございます。

    お知らせ頂いた方法で Child.bat を実行できるようになりました。

    ありがとうございます。

    引数のスペース対応のためにつけたダブルクオーテーションがChild.batの環境変数にそのまま入っています

    (Echo %1 の内容が hoge ではなく クオーテーション付きで "hoge" になっている) が、

    Child側でダブルクオーテーションを外す文字列操作で対応しようと思います。

    ありがとうございました。


    2016年7月26日 5:11