locked
バッチファイル処理において、「%」を含むパスを別のバッチファイルに引数として渡すと正常に認識しません RRS feed

  • 質問


  • いろいろと調べたりテストしてみたのですが改善方法がわからず、
    バッチ処理に詳しい方にご教示いただければと思っております。

    ■バッチファイルの構成
    ○temp.ini(コピー元とコピー先を|で区切って記述)
    C:\temp\source%|C:\temp\target%

    ○バッチファイルA
    FOR分でtemp.iniのフォルダパスを読み込み、バッチファイルBに引数として渡す
    > for /f "usebackq delims=| tokens=1,2" %%a in ("temp.ini") do call バッチファイルB "%%a" "%%b"

    ○バッチファイルB
    受け取ったパスの引数を変数にセット
    > set source1=%1
    > set target1=%2


    ■問題の現象
    バッチファイルBで正常に引数を受け取れません。
    以下は、実際のバッチファイルAの実行時のコマンドプロンプト画面(抜粋)になります。

    ※●の部分はバッチファイルBでechoコマンドを設定して表示するようにしています
    ----------------------------------------------------
     C:\bat>for /F "usebackq delims=| tokens=1,2" %a in ("..\temp.ini") do call .\hontai.bat "%a" "%b"

     C:\bat>call .\hontai.bat "C:\temp\source%" "C:\temp\target%"

     ●source="C:\temp\source\temp\target"
     ●target=
     続行するには何かキーを押してください . . .
    ----------------------------------------------------

    2つの引数が合体してしまうのですが、何か解決策があれば
    ご教示いただけないでしょうか。
    お手数お掛けしますが、よろしくお願い致します。
    2015年6月19日 8:35

回答

  • call で % を渡すとescapeが必要なので、それをやめたら。

    for /f "usebackq delims=| tokens=1,2" %%a in ("temp.ini") do (
    set source1="%%a"
    set target1="%%b"
    call バッチファイルB
    )

     

    • 回答としてマーク nn_ss_2015 2015年6月24日 4:27
    2015年6月23日 13:13

すべての返信

  • for /f "usebackq delims=| tokens=1,2" %%a in ("temp.ini") do call バッチファイルB "%%a" "%%b"

    for /f "usebackq delims=| tokens=1,2" %%a in ("temp.ini") do call バッチファイルB "%%a%%" "%%b%%"


    %のエスケープは%%

     C:\bat>call .\hontai.bat "C:\temp\source%" "C:\temp\target%"

     ●source="C:\temp\source\temp\target"

    環境変数の文字列置換式

    %名前:文字列1=文字列2%

    で、構文に合致する

    %" "C:\temp\target%

    の部分が削除されて、環境変数「" "C」の値、ないので空に変わる。

    2015年6月19日 15:01
  • ウィンドウズスクリプトプログラマ様

    詳細なご回答ありがとうございます。
    いただいた情報を元にバッチを修正したところ、「%」の付いたパスでも
    正常に変数に渡すことが可能になりました。ありがとうございます。

    ただ、修正後のバッチで複数のフォルダパスを読み込んだ際に「&」を含むフォルダが存在すると、
    修正前のバッチで「%」を含むパスを変数に渡したときのように、変数が合体してしまいます。

    ※修正後のバッチで「&」を含むパスを読み込んだ場合
    ----------------------------------------------------
    C:\bat>for /F "usebackq delims=| tokens=1,2" %a in ("..\temp.ini") do call .\hontai.bat "%a%" "%b%"

    C:\Robocopy\bat>call .\hontai.bat "C:\temp\source&target%" "C:\temp\target&source%"

    source="C:\temp\source&target\temp\target&source"
    target=
    ----------------------------------------------------

    複数のフォルダを読み込む際に、「%」と「&」の両方に対応したバッチを作成することは不可能でしょうか。
    Windowsが「%」や「&」をフォルダ名に設定できることが問題であるとは思っているのですが、
    仕組みとして無理ということであれば別の方法を考えます。

    以上、よろしくお願い致します。
    2015年6月23日 0:38
  • 与件は

    ○temp.ini(コピー元とコピー先を|で区切って記述)
    C:\temp\source%|C:\temp\target%

    であって、だからこそ、

    for /f "usebackq delims=| tokens=1,2" %%a in ("temp.ini") do call バッチファイルB "%%a%%" "%%b%%"

    なのであって、%が付かないなら話が違います。

    ただ、修正後のバッチで複数のフォルダパスを読み込んだ際に「&」を含むフォルダが存在すると、
    修正前のバッチで「%」を含むパスを変数に渡したときのように、変数が合体してしまいます。
    &は" "でescapeされるので、関係ないでしょう。

    2015年6月23日 4:53
  • call で % を渡すとescapeが必要なので、それをやめたら。

    for /f "usebackq delims=| tokens=1,2" %%a in ("temp.ini") do (
    set source1="%%a"
    set target1="%%b"
    call バッチファイルB
    )

     

    • 回答としてマーク nn_ss_2015 2015年6月24日 4:27
    2015年6月23日 13:13
  • ウィンドウズスクリプトプログラマ様

    ご回答ありがとうございます。

    callで呼び出す際に変数として渡さず、バッチファイルAの方で
    変数設定してしまえばよいわけですね!大変参考になりました。

    おかげさまで課題が解決しました。ありがとうございました。
    2015年6月24日 4:27