━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ いざというときに役立つMS−DOS 執筆:速星 千里 第71号(2005.11.26) フォルダ名を自動設定するバッチファイル ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ <目次> ■ はじめに ● Gmailアカウントプレゼント ● おすすめメルマガ ■ フォルダ名を自動設定するバッチファイル ● 概要 ● バッチファイルの動的生成 ● 文字列の整形 ● カレントドライブ、カレントディレクトリ ─ PR ──────────────────────────────── ――――トレイダーズ証券 WEBセミナー開催! =参加費無料=――――  ◆◇ 06年、ドルの行方を大胆予想 〜90分でわかる為替動向〜 ◇◆   【講師】  UFJ総合研究所 調査部長 五十嵐 敬喜 氏   【日時】  2005年12月5日(月)19:30〜21:00  お申込・詳細はこちら→ http://211.10.20.135/a/a.cgi?k05455Bm01507 ─ PR ──────────────────────────────── ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ はじめに ------------------------------------------------------------------------ 皆さん、お久しぶりです。速星です。 前回・前々回の特別企画は楽しんでいただけましたでしょうか? 今回は、先日掲示板でいただいた質問への回答で、ファイルの更新日時をフォルダ 名に設定するバッチファイルをご紹介します。 少々難しく、しかも長い内容となりますが、柔軟で実用的な処理を実行できる バッチファイルを作るためには重要なポイントが詰まっています。すぐには理解 できなくても、ぜひメールを保存しておいて、いざというときに役立てて下さい。 ------------------------------------------------------------------------ ● Gmailアカウントプレゼント Gmailアカウントの招待希望、随時受け付けております。 なお、応募から招待メール送付までに2週間程度かかる場合もありますので、 ご了承下さい。 何度も応募される方がいらっしゃるようですが、なるべく多くの方にアカウントを 差し上げられるよう、招待は、お1人につき1回のみとさせていただいております。 もし、何らかの手違いで招待メールが届いていないということがありましたら、 その旨を書き添えて再応募していただくか、あるいは、直接私にメールして いただければ、個別に対応いたします。 Gmailアカウントプレゼント 応募フォーム → http://otd5.jbbs.livedoor.jp/2026867/bbs_plain ※注意事項※ 応募フォームの送信内容の確認画面などは用意しておりません。送信ボタンを 押した後、フォームの内容が全て消えたら、送信は正常に行われています。 ------------------------------------------------------------------------ ● おすすめメルマガ「オークションとメルマガで稼ぐ方法」 みなさんは高額なノウハウ本と言うのを買った事がありますか? 一見ごもっともなようでも実際使えない。痛い経験をお持ちの方はいませんか? このメルマガは情報が濃い上に直ぐ使える内容で、何と「全て無料!!」 あなたは、まだPRばかりで中身のないメルマガを読み続けるのですか? http://www104.sakura.ne.jp/~revenge/FirstClass/mel.htm ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ フォルダ名を自動設定するバッチファイル ------------------------------------------------------------------------ デジカメで毎日たくさんの写真を撮る、という方から、掲示板で、大量の画像 ファイルをうまく整理ながらハードディスクに移動するためのバッチファイルを 作りたい、というご相談をいただきました。 −−−−−(掲示板より一部引用 ここから)−−−−− 写真ファイルの中で作成された日付と時刻(分単位)が一番古いものの日付と 時刻をフォルダ名に作成し、そのフォルダに移動をかけたいのですが、どのように 作成すればいいのでしょうか?  たとえば、デジカメ内のフォルダにある写真の日付と時刻が一番古いものが "2005/11/10 17:35”であれば、フォルダ名を”051110_1735"としたいのです。 −−−−−(掲示板より一部引用 ここまで)−−−−− 引用元: http://otd9.jbbs.livedoor.jp/dos/bbs_tree?range=1&base=415 つまり、特定の日時をフォルダ名に設定するバッチファイルが必要なわけですね。 このバッチファイル、なんとか作ってみましたので、皆さんにもご紹介します。 ------------------------------------------------------------------------ ● 概要 今回ご紹介するバッチファイルは、Windows2000,XP用です。 「A.BAT」「B.TXT」「C.BAT」という3つのファイルを用意しておいて、実際の 作業時には「A.BAT」を起動することになります。 下に、各ファイルの内容を順に示します。 なお、ここでは、説明のため、「A.BAT」と「C.BAT」には行番号を付けてあります。 ブログ「DOS使用簿」では行番号のないものを公開しておりますので、すぐに使って みたい、という方はご利用下さい。 http://d.hatena.ne.jp/tetrahedrane/20051115#p1 −−−−−(A.BAT ここから)−−−−− 01> ::環境設定(実行環境に合わせて適宜変更する・ディレクトリ名の最後には「\」を書かない) 02> SET SRCDIR=F: 03> SET DESTDIR=C:\PICT 04> 05> ::環境設定(変更不可) 06> SET BATDIR=%CD% 07> 08> ::タイムスタンプ取得用バッチファイルの生成 09> DIR %SRCDIR%\*.JPG /B /OD > FILELIST.TMP 10> COPY /Y B.TXT + FILELIST.TMP B_BAT.TMP 11> FINDSTR "^CALL C " B_BAT.TMP > B.BAT 12> 13> ::主処理 14> CALL B 15> 16> ::バッチファイル起動時のカレントドライブ・カレントディレクトリに移動 17> %BATDIR:~0,2% 18> CD %BATDIR% 19> 20> ::後始末 21> DEL FILELIST.TMP 22> DEL B_BAT.TMP 23> DEL B.BAT −−−−−(A.BAT ここまで)−−−−− 普段の作業時に起動するのが、この「A.BAT」になります。 8〜11行目で「B.BAT」というバッチファイルを生成し、14行目の「CALL B」で 呼び出しています。 21〜23行目は、「B.BAT」を生成する途中で使用した一時ファイルを削除する ための記述です。 −−−−−(B.TXT ここから)−−−−− CALL C −−−−−(B.TXT ここまで)−−−−− このファイルを作る際には、注意するべきことが2つあります。それは、最後に 半角スペースを入れることと、改行を入れないことです。 正しく作成すれば、ファイルサイズは7バイトになるはずですので、ファイルの プロパティを確認してみて下さい。 −−−−−(C.BAT ここから)−−−−− 01> ::コピー元をカレントドライブ・カレントディレクトリに設定 02> %SRCDIR:~0,2% 03> CD %SRCDIR% 04> 05> ::タイムスタンプを取得し、"YYMMDD_HHMM"の形式に整形 06> SET STAMP=%~T1 07> SET STAMP=%STAMP:/=% 08> SET STAMP=%STAMP::=% 09> SET STAMP=%STAMP: =_% 10> SET STAMP=%STAMP:~2% 11> 12> ::主処理 13> MD %DESTDIR%\%STAMP% 14> MOVE %SRCDIR%\*.JPG %DESTDIR%\%STAMP%\ −−−−−(C.BAT ここまで)−−−−− 「B.BAT」から呼び出され、メインの処理を行うのがこの「C.BAT」です。 5〜10行目でタイムスタンプ(※)を「051110_1735」のような形式の文字列に 整形し、13行目でその文字列をフォルダ名に設定しています。 14行目では、デジカメから先ほど作ったフォルダへ、画像ファイルを移動して います。 (※)用語解説 ・タイムスタンプ ファイルやフォルダと関連付けられている時刻情報のこと。 Windowsの場合、作成日時、更新日時およびアクセス日時の3種類がある。 今回のバッチファイルで利用しているのは、ファイルの更新日時。 ------------------------------------------------------------------------ ● バッチファイルの動的生成 今回のバッチファイルで一番重要なポイントは、「A.BAT」の8〜14行目です。 8〜11行目で「B.BAT」を作成し、それを14行目で呼び出しています。 08> ::タイムスタンプ取得用バッチファイルの生成 09> DIR %SRCDIR%\*.JPG /B /OD > FILELIST.TMP 10> COPY /Y B.TXT + FILELIST.TMP B_BAT.TMP 11> FINDSTR "^CALL C " B_BAT.TMP > B.BAT 12> 13> ::主処理 14> CALL B まず9行目で、指定されたフォルダにあるJPGファイル名を、更新日時の古い順に 並べたテキストファイル「FILELIST.TMP」を作成しています。 なお、リダイレクト「>」については第42号をご確認下さい。 http://www.geocities.jp/tetrahedrane/column/dos/dos42.txt 09> DIR %SRCDIR%\*.JPG /B /OD > FILELIST.TMP このときできる「FILELIST.TMP」は、例えば、次のような内容になります。 −−−−−(FILELIST.TMP 生成例 ここから)−−−−− P1080024.JPG P1080025.JPG P1080026.JPG P1080027.JPG P1080028.JPG P1080029.JPG P1080030.JPG P1080031.JPG P1080032.JPG P1080033.JPG P1080034.JPG P1080035.JPG −−−−−(FILELIST.TMP 生成例 ここまで)−−−−− 10行目では、「B.TXT」と「FILELIST.TMP」をつなぎ合わせて、「B_BAT.TMP」を 作成しています。 なお、COPYコマンドでのファイルの結合については、第35号をご確認下さい。 http://www.geocities.jp/tetrahedrane/column/dos/dos35.txt 10> COPY /Y B.TXT + FILELIST.TMP B_BAT.TMP −−−−−(B_BAT.TMP 生成例 ここから)−−−−− CALL C P1080024.JPG P1080025.JPG P1080026.JPG P1080027.JPG P1080028.JPG P1080029.JPG P1080030.JPG P1080031.JPG P1080032.JPG P1080033.JPG P1080034.JPG P1080035.JPG −−−−−(B_BAT.TMP 生成例 ここまで)−−−−− 先ほど、「B.TXT」の最後に半角スペースを入れる、改行はしない、と注意書き したのは、つなぎ合わせたときに、1行目が「CALL C P1080024.JPG」という形に なってほしかったからです。 11行目は、「B_BAT.TMP」から「CALL C 」で始まる行(1行目)だけを抽出して、 「B.BAT」に保存しています。 11> FINDSTR "^CALL C " B_BAT.TMP > B.BAT FINDSTRコマンドは、第35号でご紹介したFINDコマンドの正規表現(※)版で、 Windows2000,XPにのみ付属しています。検索文字列「^CALL C 」のはじめの「^」 は、行頭を意味する特殊文字です。 これで、「B_BAT.TMP」の1行目だけが取り出され、「B.BAT」に保存されます。 −−−−−(B.BAT 生成例 ここから)−−−−− CALL C P1080024.JPG −−−−−(B.BAT 生成例 ここまで)−−−−− ここまでで、「B.BAT」が作り出されました。「B.BAT」中の「P1080024.JPG」の 部分は、「C.BAT」を呼び出すときのオプション(引数)となったわけです。 そして、作られた「B.BAT」を14行目で呼び出します。 なお、CALLコマンドについては第39号をご確認願います。 http://www.geocities.jp/tetrahedrane/column/dos/dos39.txt 14> CALL B この後は、「B.BAT」内の記述「CALL C P1080024.JPG」に従って「C.BAT」が 呼び出され、処理が続いていきます。 このように、「B.BAT」をはじめから用意しておくのではなく、「A.BAT」中で 作り上げて、実行する、という一手間をかけることにより、状況に応じて異なる 内容のバッチファイルを実行することができるようになります。 この、バッチファイルの中で新しいバッチファイルを作り出し、実行するという 方式を、私は「バッチファイルの動的生成」と呼んでいます。 (※)用語解説 ・正規表現 文字列を柔軟に検索するための表記法。通常の文字以外に「^」(行頭)、 「.」(任意の1文字)などといった特殊文字も用いて、文字列のパターンを 記述することができる。 ------------------------------------------------------------------------ ● 文字列の整形 「C.BAT」にも、重要なポイントがあります。 それは、5〜10行目、ファイルの更新日時を取得し、指定の形式の文字列へと整形 する作業です。 これらは全て、SETコマンド(第23号)によって行われています。 http://www.geocities.jp/tetrahedrane/column/dos/dos23.txt Windows2000,XPでは、SETコマンドが大幅に拡張されているため、文字列に対する 様々な操作が、簡単に行えるのです。 05> ::タイムスタンプを取得し、"YYMMDD_HHMM"の形式に整形 06> SET STAMP=%~T1 07> SET STAMP=%STAMP:/=% 08> SET STAMP=%STAMP::=% 09> SET STAMP=%STAMP: =_% 10> SET STAMP=%STAMP:~2% 6行目の「%~T1」は、ファイル「%1」のタイムスタンプ、という意味です。 06> SET STAMP=%~T1 すなわち「%~T1」は、「C.BAT」の起動時にオプションとして指定したファイル (上の例でいえば「P1080024.JPG」)の更新日時に展開されます。 このとき、環境変数「STAMP」の中身は、例えば「2005/11/10 17:35」のような 形式になります。 7〜9行目では、文字列の置換を行っています。 文字列の置換を行いたいときに用いるSETコマンドは、以下の書式です。 SET 変数名2=%変数名1:置換対象文字列=置換後文字列% 置換後文字列には、空の文字列を指定することもできます。 では、環境変数「STAMP」がどう加工されていくか、追いかけてみましょう。 7行目実行前の「STAMP」の中身:「2005/11/10 17:35」 07> SET STAMP=%STAMP:/=% →「STAMP」の中身:「20051110 17:35」 08> SET STAMP=%STAMP::=% →「STAMP」の中身:「20051110 1735」 09> SET STAMP=%STAMP: =_% →「STAMP」の中身:「20051110_1735」 10行目のSETコマンドでは、「STAMP」の頭の2文字を取り除いています。 10> SET STAMP=%STAMP:~2% →「STAMP」の中身:「051110_1735」 以上で、フォルダ名に設定したい文字列「051110_1735」が、環境変数「STAMP」に 格納されました。 この後、12〜14行目で、フォルダを作成し、画像ファイルの移動を行っています。 12> ::主処理 13> MD %DESTDIR%\%STAMP% 14> MOVE %SRCDIR%\*.JPG %DESTDIR%\%STAMP%\ ------------------------------------------------------------------------ ● カレントドライブ、カレントディレクトリ DOSのコマンドを実行するときは、カレントディレクトリ(カレントフォルダ)が どこになっているかをよく考える必要があります。 特に、今回のようにドライブをまたがって作業を行う場合は、注意が必要です。 というのは、CDコマンドはカレントディレクトリを変更するだけで、カレント ドライブまでは変更しないからです。 きちんとCDコマンドでカレントディレクトリを移動し、カレントディレクトリに あるファイルを扱っているはずなのに、バッチファイルの動作がおかしい場合は、 カレントドライブが合っているかどうか、確認してみて下さい。 今回のケースでは、「A.BAT」の16〜18行目、「C.BAT」の1〜3行目が、カレント ドライブおよびカレントディレクトリの移動を行っている部分です。 ------------------------------------------------------------------------ 今回はここまでです。ずいぶん長くなってしまいました。 お疲れ様でした! 次回は、ネットワーク系コマンドの入門編として、PINGコマンドについて説明 しようかと思っています。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ コメントをお待ちしています ------------------------------------------------------------------------ 皆さんからの感想・質問・要望をお待ちしています。 「こんなテーマを扱ってほしい」 「こんなことはできるの?」 「このへんが分かりにくかった」 「1回の分量を増やしてほしい/減らしてほしい」 など、掲示板(下記URL)まで気軽にお願いします。 http://otd9.jbbs.livedoor.jp/dos/bbs_thread (スレッド表示) http://otd9.jbbs.livedoor.jp/dos/bbs_tree (ツリー表示) メールでもコメントを受け付けておりますので、そちらもご利用下さい。 tetrahedrane@yahoo.co.jp なお、いただいたコメントは、本マガジン上で引用する場合があります。 (メールアドレスやお名前は一切公開いたしません) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● 感想・質問宛先 http://otd9.jbbs.livedoor.jp/dos/bbs_tree tetrahedrane@yahoo.co.jp ● 広告募集 当メルマガへの広告掲載をご希望の方は、下記アドレスまでお願いします。 tetrahedrane@yahoo.co.jp ● メルマガ交換広告募集 当メルマガとのメルマガ交換広告をご希望の方は、下記アドレスまでどうぞ。 tetrahedrane@yahoo.co.jp ● 登録・解除・バックナンバー http://www.geocities.jp/tetrahedrane/column/dos/ このメールマガジンは、『まぐまぐ』を利用して発行しています。 http://www.mag2.com/m/0000106066.htm (c) 2005 Chisato Hayahoshi