プロが教えるわが家の防犯対策術!

バッチが使いたい初心者です。(windows 7)

大量の画像のフォルダをまとめるためにバッチを使いたいです。
助けて頂けないでしょうか。。。

(batの中身)
@echo off
pushd %~dp0
for /f %%i in (namelist.txt) do mkdir %%i
for /f %%j in (namelist.txt) do copy "*%%j*" %%j
exit

(namelistの中身)
あ\A
あ\B
い\C
い\D
い\E
う\F
続く・・・

↑この内容でバッチをまわすと、「あ」の中に「A」まではうまくフォルダができますが
「A」の中身は空っぽになってしまいます。

namelistの中身を以下の内容にすれば中身はきちんとコピーされます。
A
B
C
D
続く・・・

でも、できればフォルダを2段階にしたいのです。どこを直したらいいのでしょうか?
教えていただけると非常に助かります。よろしくお願いいたします。

「画像フォルダをまとめるバッチ作成について」の質問画像

A 回答 (2件)

以下のような感じでいかがでしょうか。



ざっと書いただけなので、スマートではない部分や、不具合、対応出来ないケースもあるかも知れませんが、その場合は、その旨を補足されるか、そちらで修正してみてください。こちらで動作確認はしています。

対象フォルダは、バッチファイルがあるフォルダです。

―――――――――――――――――

@echo off
pushd "%~dp0"
for /f "usebackq delims=" %%i in (`type "namelist.txt"`) do mkdir "%%i"
for /f "usebackq tokens=1-2 delims=\" %%j in (`type "namelist.txt"`) do copy "%%k*" "%%j\%%k\"
pause
exit

―――――――――――――――――

簡単な解説は以下の通りです。詳細はWEB検索なさってください。

―――――――――――――――――

【 usebackq 】
in部分の「`」で囲まれた部分のコマンド実行結果を、対象ファイル(対象データ)とする。

【 delims= 】
取り出した1行内の、「トークン」(区切られた文字列、単語)の「区切りとなる文字」を指定する。「delims=」の後に何も書かなければ「区切り無し」の意味となる。つまり、1行まるごと「%%アルファベット」に入る。この指定(delims=)自体をしない場合は「タブとスペース区切り」となる。「delims=」の記述場所は、「"xxx xxx delims="」のように、最後に書く。(半角スペースを指定する場合もある為。)

【 tokens= 】
何番目のトークンを取り出すか指定する。
「1-3」は「1~3」の意。
「1,3」は「1と3」の意。
「1-3,5」は「1~3と5」の意。
2つ目以降のトークンは、開始アルファベットの次のアルファベットに格納される。
「%%a」開始なら、2つ目は「%%b」に入る。

【 type 】
テキストファイルの内容を表示するコマンド。

【 "%%k*" 】
今回の場合は、「(2番目のトークン)~」を表す。「a*」のような感じ。

【 "%%j\%%k\" 】
今回の場合は、「(1番目のトークン)\(2番目のトークン)\」を表す。「あ\A\」のような感じ。今回のようにコピー先に指定する場合は、最後が「\」で終わっているので、「このフォルダ内にコピーする」という意味になる。ファイル名はコピー元と同じ。逆に、コピー先が「あ\A」のように「\」で終わらない場合は、「ファイル指定」とみなされる。しかし、「同名のフォルダ」が存在する場合は、そのファイルは作成出来ず、エラーとなる。

【 pause 】
一時停止コマンド。

―――――――――――――――――

1つ目のfor文では、取り出した1行をまるごと利用し、フォルダ作成に使っています。

2つ目のfor文では、取り出した1行を、「\」で区切り、先頭から2つトークンを取り出し、2つ目のトークンを「コピー元ファイルの指定」に使い、1つ目と2つ目のトークンを「コピー先フォルダの指定」に使っています。

又、わざわざ「pushd "%~dp0"」や「in (`type "namelist.txt"`)」のように、「"」で囲む書き方にしているのは、ファイル名やパスの記述において、より多くの文字(全角/半角スペース、「&」、「( )」等)に対応する為です。必須ではありません。エラー防止の念の為です。

「in (`type "namelist.txt"`)」は、「in ("namelist.txt")」と記述しても大丈夫なようですが、正式な書式かは分からないです。その場合も「usebackq」は付ける必要があるようです。

又、不具合箇所を探す場合、「do」の後に「echo」入れて、「do echo mkdir "%%i"」のような感じにすると、アルファベットに代入された変数の値が確認出来、分かりやすいかと思います。
    • good
    • 0
この回答へのお礼

できました。。。こんなに詳しく書いてもらって涙が出るほどうれしいです。
1つずつ調べながら理解していきたいと思います。バッジってすごいですね。VBAのコードに比べて
こんなに短い分でこんな事ができるなんて。勉強していきたいと思います。
本当にありがとうございます。

お礼日時:2019/03/13 11:06

最初の


@echo off
を削除かコメントアウトすれば
コマンドがどう展開されてるかわかるし
エラーメッセージなども表示されるので
そうすると大きな手がかりになります
    • good
    • 0
この回答へのお礼

すぐ消えてしまうエラーメッセージを表示させるのにひと苦労するほどの初心者です。。。お返事ありがとうございます。
「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」のエラーでした。

お礼日時:2019/03/12 12:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!