バッチのForループで括弧を含む引数を使いたい。

Anonymous
2016-04-27T08:05:16+00:00

任意のファイルに対する処理を自動化するため、

バッチに各ファイルをドラッグ&ドロップして実行するようなバッチを作成しようとしています。

サンプルとして次の2行のみのバッチを作成し、ドロップしてみました。

for %%i in (%*) do (echo %%i)

pause

すると引数として取得したファイルパスに半角括弧が含まれている場合に強制終了してしまいます。

調べてみたところ、 「%*」の展開時に右括弧を含む引数があるとエラーが生じるようです。

(ドロップするファイル名が「hoge.txt」なら問題なし。「hoge(fuga).txt」だとエラー)

これのエラーを回避することは出来ないでしょうか。

「"%*"」としたり、「/f "usebackq"」 をつけても上手くいきませんでした。

宜しくお願いします。

家庭向け Windows | 以前の Windows バージョン | アプリ

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。 プライバシーを保護するために、移行された質問のユーザー プロファイルは匿名化されます。

0 件のコメント コメントはありません
{count} 件の投票
Answer accepted by question author
  1. Anonymous
    2016-04-28T15:10:06+00:00

    © ウィンドウズスクリプトプログラマ - Windows Script Programmer 2016


    半角括弧だけなら、こんなのも。

    setlocal enabledelayedexpansion

    set x=%*

    for %%i in (!x!) do (echo %%i)

    pause

    15 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません

3 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2016-04-27T08:26:22+00:00

    © ウィンドウズスクリプトプログラマ - Windows Script Programmer 2016


    無理。

    ファイル名かディレクトリ名の中に空白を入れて、回避。

    どうしてもなら、vbsに変える。

    他にもうまく行かないケース。 

    全角空白を含む。

    回避、対処は同じ。

    for 全角空白 site:scripting.cocolog-nifty.com - Google 検索

    2 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  2. Anonymous
    2016-04-28T03:31:47+00:00

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

    Forだと無理な様ですので、Forを使わずにループさせました。

    :LOOPSTART

        if "%~1" == "" goto LOOPEND

        echo %~1

        shift

        goto LOOPSTART

    :LOOPEND

    これであれば半角括弧を含んでいても処理ができました。

    しかしご指摘のように、引数に全角スペースを含むとそこで引数を区切ってしまうので

    その場合はやはり問題が生じます。(強制終了しないだけマシですが)

    そのためvbsを検討しました。

    なお、既に運用中のバッチがあるため、バッチからVBSに渡す形にしました。

    test1.bat ###Start

    test2.vbs %*

    ############End

    test2.vbs ###Start

    For Each arg In WScript.Arguments

        wscript.echo arg

    Next

    #############End

    これで無事解決しました。ありがとうございます。

    0 件のコメント コメントはありません
  3. Anonymous
    2016-05-02T02:04:12+00:00

    なるほど、遅延展開を利用するんですね。

    先に構文(for ... in (...) do ...)を読ませた後に変数x(=%*)を展開すれば引数の内容は構文には影響しないと。

    勉強になりました。ありがとうございます

    因みに、今回調べて見たらDosコマンドには全角スペース以外にも文字列に関する不都合な仕様がいくつかあるようですね。

    であればファイルを個別に扱う様な処理はバッチではなくやはりVBS等で扱った方が良いと思い至りました。

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません