last update

パスに空白を含む複数ファイルを一括処理するバッチを書く(for~in~do)

3d man and gear pyramid

ようは、「難しいことを考えずにドラッグアンドドロップで使えるバッチファイルの作り方」です。

ファイル名やパスに空白が入っていてもOKです。

複数ファイルの一括処理に対応していないプログラムでも、これで一括処理できるでしょう。

大昔は、空白付きの複数ファイルをまとめてバッチファイルにドラッグアンドドロップしてもうまくいかなかった気がしますが、久しぶりにやったら普通にできたのでメモ。

※2013/1/22 文章ブラッシュアップ

正直、空白のための特殊な処理はしておらず、適切なところで””(ダブルクォート)で囲んでいるだけです。

Windows XP(SP3) / 7(SP1) / 8 でしか動作確認してません。

空白入り複数ファイルを一括処理するバッチファイルの例

ある変換プログラム「kindlestrip.exe」を例に、<infile>に複数ファイルを喰わせるバッチ処理(.batファイル)を書きます。

なお、この変換プログラムの使い方は以下の通り。

Kindlestrip.exe <infile> <outfile> <strippeddatafile>
<strippeddatafile> is optional.

バッチファイルと Kindlestrip.exe は同じディレクトリにあるものとします。

一番シンプルな例はこんな感じ。

for %%q in (%*) do kindlestrip.exe %%q "Strip_%%~nxq"

ただ、これだと環境によって動かないので、ドラッグアンドドロップ向けに気を付けるとこんな感じ。

<バッチファイルの場所に出力>

cd /d %~dp0

@rem バッチファイルの場所に出力 
for %%q in (%*) do kindlestrip.exe %%q "Strip_%%~nxq"

応用として、こんな書き方も。

<ドラッグアンドドロップしたファイルの場所に出力>

cd /d %~dp0

@rem 変換元ファイルの場所に出力 
for %%q in (%*) do kindlestrip.exe %%q "%%~dpqStrip_%%~nxq"

なお、これらのバッチファイルをネットワーク越しに直接叩く場合は、ネットワークドライブの設定が必要です。

バッチファイル中の特殊な表記の解説

正直、特殊でもないんですが、Windows のバッチファイルって若干ロストテクノロジー化してる気がしたので解説。

  • 「%*」は全引数を含む文字列。
    引数が複数の場合、「”D:\foo\bar 1.mobi” “D:\foo\bar 2.mobi”」みたくダブルクォートで括って、かつスペースで分離した形で入ってくる
  • 「%%q」はforループ中の一時変数「q」
    例で言うと、1回目=”D:\foo\bar 1.mobi”、2回目=”D:\foo\bar 2.mobi”
  • 「%%~dpq」はforループ中の一時変数「q」のうち、ドライブレター部分+パス部分を連結した文字列
    例で言うと、1回目=”D:\foo\”、2回目=”D:\foo\”
  • 「%%~nxq」はforループ中の一時変数「q」のうち、ファイル名+拡張子を連結した文字列
    例で言うと、1回目=”bar 1.mobi”、2回目=”bar 2.mobi”
  • 「%~dp0」はバッチファイルがある場所のドライブ名付きフルパス

齟齬が生まれそうな表現もありますが、ざっくりと言えばこんな感じです。

今ならWSHとかWindows PowerShellとか使えばいいんでしょうけど、自分用ならこんな手もありますよ。と。

環境によっては実行時に警告が出ますんで、適当に流してください。

ちなみに僕はこの手のロストテクノロジー的なスクリプティングは好みません。が、生産性とかなんやかんやで必要があれば読み書きくらいはします。

はい!よろこんでー!

この記事への1件のコメントがあります

  1. GG says:

    1年前

    違うソフトでバッチファイルの作成をしようと思ったのですがうまく動かず、検索してこちらの記事を拝見しました。
    こちらの記事のおかげで問題なく動くバッチファイルが出来ました。
    特に、説明をも付け加えていただいていて、自分のような知識のないものにとってとてもありがたかったです。

コメントを記入