コマンドプロンプト/スクリプトバッチ入門

[最終更新日2010.4.27]

FOR コマンドを使ってファイル名の変更をする

大量のファイル名をコマンドプロンプトのFORコマンドを使って変更しようと思って
あれこれ調べながら四苦八苦…

FORコマンドのヘルプにあった


 FOR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンド パラメータ]

というのがなんとなくそれっぽい動きをするので、テストディレクトリを作って
適当なファイルを置き、コマンドラインから


> for /L %i in (1,1,100) do echo %i.txt no_%i.txt

と出力してみる「お^ー^なんとかなりそうな…」
しかしそのコマンドは、悲しい結末を迎えることになった

「しまったっー!!ファイル名が・・・」

どうにもLINUXシェルのようにはいかないので
新たなシェルスクリプトを実装したというWINDOWS7が急に羨ましくなった。

昨年購入したばかりのVISTAx64もあるし、資金的にはかなり厳しい状態なので
そこをなんとか自分のスキルをアップグレードして乗り切りたかったが

結局は…無駄に時間だけが過ぎてしまった。

要するに一般的な for とは使い方が全く違うわけで、こんなチープなシェルで
ファイル操作をしようとした自分の方が馬鹿だとわかった。

そこで、以上を十分理解したところで、細かい説明を抜きに早速、作業へ復帰

今回ファイル名を変更したのは、3000枚ほどの画像ファイル

まずファイル名に連番の数字が含まれ>且つ>それが連続していることが条件
間の数字が抜けてしまうと、後で面倒な手作業をしなければならない

これを間違いなく<連番数字入り>のファイル名に一括変更する方法

普通にウィンドウでフォルダを開き
マウスドラッグまたはCtrl + A で全ファイルを選択してから
トップにしたいファイルだけを名前変更する


例えば ieno_boku.JPG を img_.JPG へ名前変更するとその他はこんな風になる

 ieno_boku.JPG  umi_Neko.JPG  yama_Inu.JPG ...
          ↓         ↓            ↓
   img_.JPG   img_ (2).JPG  img_ (3).JPG ...

…その他のファイルはすべて自動的に半角スペース+ ( ) 内に数字を付けて改名される
ただし一番最初に名前変更したファイルだけは、自分で直さないとならない(注意)

まぁ一応はこれでもファイル名の一括変更にはなるのだが、ファイル名にスペースが入っていると
ファイルの呼び出しに何かと面倒な処理が増えたり、不都合が出たりするので、やはりどうしても修正が必要となる

そこで次に、コマンドプロンプトを起動したら目的のディレクトリへ移動


> cd C:\Users\Public\Pictures\JPG

それからファイル個数を確認するために dir コマンドを打つ


> dir

3005 個のファイル 802,082,412 バイト


確認できたらファイルの個数を( )内の終了値にして 以下のコマンドを打つ


> for /L %i in (1,1,3005) do ren "* ?%i?.JPG" no_%i.jpg

※ファイル名にスペースを含んでいるのでダブルクォートで挟む
 * と ? はワイルドカードの指定
 任意のファイル名をつける場合は %i の前後に入れる

以上でコマンド終了

・・・作業開始からわずか10分程度で3000ファイルの名前変更も完了
これで簡単に、いつでも画像整理や差し替え、呼び出しができる。
めでたしめでたし


Windows/ スクリプト(バッチファイル)の作成

Windowsは、その前身、MS-DOS(マイクロソフト・ディスクオペレーションシステム)の時代から、いろいろなコマンドが用意されています。実際ところ、コマンド入力は、よほど慣れている人でもない限り、扱いにくい面倒な作業となるので、現在は、マウスインターフェースによるウィンドウシステム(*コマンドをマウスクリックによって実行させる技術:一般にVBスクリプトまたはGUI・グラフィックユーザーインターフェースと呼ばれる。)が主流となっているのです。さて、ここで解説するバッチファイルはそうした一連のコマンド入力をまとめて扱えるようにした実行ファイルのことです。拡張子.batで表示されたアイコンをクリックするだけでコマンドが自動実行されるので知っておくと便利です。

*バッチファイルは、Winodowsコンソールコマンドをファイルに記述したもので IFステートメントを使った条件処理やforステートメントによるループ制御などのコマンド入力をファイルを使って行うことができます。例えば、多くのファイルの中からテキストファイルだけをフォルダにコピーする場合は例: copy *.txt c:\My Documents  と記述したバッチファイルをクリックするだけで簡単にコピーができてしまうのでとても便利です。またショートカットのようにプログラムやアプリケーションを呼び出すこともできます。

□ FINDコマンドで集計してリンク集を作る  [戻る]

例えば、あるフォルダ内のWebファイルに記載されているすべてのURLをひとつのファイルにまとめてHTMLへ出力したい時など、FINDコマンドを使えば簡単にできてしまいます。以下は参考例です。


    @echo off
    type *.html | find /i "<a href" > list.html

上記の例では、ワイルドカードを使ってフォルダ内のすべてのHTMLファイルを標準出力させ、パイプでFINDコマンドへ渡します。大文字・小文字の区別をしないで検索させるためにiオプションつけ、文字列はアンカータグ <a href までを指定します。最後にリダイレクションでHTMLへ出力させればリンク集が自動で生成されます。ただし検索文字列は行単位で行われるので、不要な部分も含んでしまうことになります。また出力されたHTMLはヘッダーなどが記述されないので公開ファイルとして使うためには編集が必要となります。

□ HTMLをバッチファイルで自動生成する  [戻る]

スクリプト・バッチ サンプルファイルのダウンロード 圧縮zipファイル (561 バイト)

HTMLをタグ打ちする人にとっては、新しい文書を作る度、同じ書式を書くことが億劫だったりもします。そんなときバッチファイルを使うとワンクリックで基本的な書式パターンを生成させることができます。…と言ってもWindowsには、任意の文字列を実行可能なファイルとして生成するコマンドはありません(*ただしNT系には拡張機能として空のファイルを生成するfsutilコマンドがあります。)

そこで操作の流れとしては、予めHTMLタグを記述したテキストファイルを用意しておき、これを参照元データとしてCOPYコマンドで複製→ファイル変換します。または、FINDコマンドを使って検索→文字列を抜き出し一旦データをテキストファイルに出力させてから、RENコマンドで拡張子を書き換えるという方法も考えられます。(…とややこしい説明ですが…^^;)

まず最初に、参照データとなるHTMLのフォーマットを作成します。ファイル拡張子はなんでも構いませんが、ここではテキスト形式として解説します。中身は基本的なタグを書いて置けば十分だと思います。またスタイルシートを使う場合は、別ファイルにした方が、後の編集も楽になるかと思います。参照データとなるファイルは任意のフォルダに保存してください

html.txt  HTMLの基本フォーマットファイル

□html.txt□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

  <html><head>
  <meta http-equiv="content-type" content="text/html;charset=shift_jis">
  <link rel="stylesheet" href="copy.css" >
  <title></title></head>
  <body>
  </body></html>

次にスクリプト・バッチの作成です。バッチ/bat(batchの略)ファイルはテキスト形式なのでメモ帳などのテキストエディターを使って簡単に作成・編集することができます。生成するHTMLファイル名を(ここでは仮に copy.html として置きました。)任意のファイル名で出力させたい場合は、バッチファイル内の文字列 copy.html の部分を好きな名前に書き換えてください。以下のコマンドを記述したものを、上の参照データファイルと同じ場所へ拡張子.batとして保存します。フォルダ内にバッチファイルのアイコンができていればOKです。

copy.bat  以下スクリプト1・2・3の実行結果は同じです。

   スクリプト1

□copy.bat□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    @echo off
    copy html.txt copy.txt
    ren copy.txt copy.html

   スクリプト2

□copy.bat□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    @echo off
    type html.txt > copy.txt 
    ren copy.txt copy.html

   スクリプト3

□copy.bat□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    @echo off
    find "<" < html.txt > copy.txt
    ren copy.txt copy.html

バッチファイル アイコンをクリックすれば以下の書式でHTMLが自動生成されます。

copy.html

□copy.html□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

  <html><head>
  <meta http-equiv="content-type" content="text/html;charset=shift_jis">
  <title></title></head>
  <body>
  </body></html>

バッチ・スクリプトの応用
次に、上述のスクリプト処理を使って、同じ書式のHTMLを複数ファイル作る方法について解説します。まず処理の流れを簡単に説明すると、HTML出力→ファイル変換→コピー×回数となります。これをCOPYコマンドを連続して実行させるというものです。一般的に各コマンドの連結には、|(パイプ)や&(アンパサンド)を使いますが、プログラム処理が長い場合(2行以上)複数ファイルの処理などが、うまく動作しないことがあるので、各コマンドを改行して一行づつ実行させます。またコピーするファイル数を増やしたい場合はcopy copy.html copyX.htmlの部分を追加すればOKです。

xcopy.bat

   スクリプト1

□xcopy.bat□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    @echo off
    copy html.txt copy.txt
    ren copy.txt copy.html
    copy  copy.html copy1.html
    copy  copy.html copy2.html
    copy  copy.html copy3.html

   スクリプト2

□xcopy.bat□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    @echo off
    find "<" < html.txt > copy.txt
    ren copy.txt copy.html
    copy copy.html copy1.html
    copy copy.html copy2.html
    copy copy.html copy3.html

*スクリプト・バッチのサンプルファイルについて*
解凍すると、copybatchフォルダと、中にはhtml.txt copy.bat xcopy.bat の3つのファイルができます。メモ帳などで適宜編集して使ってください。

スクリプトでファイルを自動転送する   [戻る]

  スクリプト・バッチ サンプルファイルのダウンロード 圧縮zipファイル (325 バイト)

■ FTPコマンドを記述したスクリプト(バッチファイル)を使えば、ファイル転送処理を自動実行できます。例えば、頻繁に更新するindex.htmlやログファイルのダウンロード等は、オートスクリプトを作成し、タスクスケジュールに登録すれば、他の作業中でもバックグラウンドで行うことができます。

ファイルはコマンド用バッチファイルと転送用スクリプトファイルの2種類を作成します

 1.バッチファイルの作成

   まずテキストエディター(メモ帳)で以下ように記述し、拡張子.batとして
   適当な名前を付けて 例:ftp.bat 作業ディレクトリに保存してください
   (作業ディレクトリとは、転送したいファイルが置いてあるフォルダのことです)

   *ftp -s: の後は呼び出しファイル名を記述します。
    転送処理スクリプト ( 例:update ) と同じファイル名を記述してください。

   *呼び出しスクリプトファイルは、特に拡張子を付ける必要はありません
   (ファイルを関連付けしたい場合は適当な拡張子.txtや.ftpなどを付けてください)

  *1)MS-DOSプロンプトを使用する場合は、exitコマンドを追加してください

□ftp.bat□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    ftp -s:update
*1) exit

 2.転送処理スクリプトの作成

   次にバッチファイルに読み込むスクリプトファイルの作成です。
   以下の内容に従ってFTPコマンドを一行づつ記述してください
   ファイル名は前述で指定したものと同じ名前にして保存します。

   *転送の設定

    FTPSever は接続先のホスト名(例:ftp.artopix.jp)
    User はサーバーに登録しているユーザー名(例:artopix)
    Password にはパスワードを記述します(例:abc45fg)

    hash は転送の進行状況を#で表示します。
    ascii はアスキーモード(テキスト形式)で転送し
    転送ファイルが画像の場合はbinary と記述します。

    put の後に半角スペースを空け、転送するファイルを記述し
    ファイルが他の場所にある時は、フルパスまたは相対パスで記述します。

    例: put C:\My Documents\topics\newfile.html

   転送の終了はbye または quitコマンドを送ってエスケープします。

□update□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    open FTPSever (ftp.artopix.jp)
    User (artopix)
    Password (abc456gh)
    hash
    ascii
    put index.html
    bye (or quit)


  3.複数ファイルを転送する

    *1) put ファイル名 を改行して追加します。
    *2) mput ファイル名1 ファイル名2 …でも同じ結果が得られます。
□update□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    open ftp.artopix.jp
    artopix
    abc456gh
    hash
    ascii
*1)
    put index.html
    put next1.html
    put next2.html
*2)
    mput next3.html next4.html
    bye (or quit)

   *mputコマンドは、サーバーとの対話形式でコマンドが進むので
    ファイル処理される度にENTERキーを入力する必要があります。
    その場合は、バッチファイルのコマンドオプションに -iを追加すると
    サーバープロンプトを表示しなくなります。
□ftp.bat□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    ftp -s -i:update
    exit


  4.ワイルドカードの使用

    *3-1) 任意のディレクトリ内のファイルをすべて転送したい場合は
     mputコマンドでワイルドカードを使います。

     例1:mput *.html
     例2:mput *.*

    *3-2) *.* は、同じディレクトリ内に、バイナリ形式のファイル(画像)があると
     転送する際にデータが書き換わってしまいますので、画像は予め別フォルダ等に
     まとめて置く必要があります。ローカル側のディレクトリをスクリプト内で変更
     しバイナリモードにセットしてから転送します。

□update□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    open ftp.artopix.jp
    artopix
    abc456gh
    hash
    ascii
    put index.html
    put next1.html
    put next2.html
    mput next3.html next4.html
*3-1)
    lcd C:\My Documents\topics
    mput *.html
*3-2)
    lcd C:\My Documents\img
    binary
    mput *.jpg *.gif
    bye


  5.複数のサーバーにファイルを転送する

    管理しているドメインが複数ある場合、disconnectコマンドを使えば
    サーバーを巡回してファイル転送させることができます。

    *1) disconnectコマンドを追加します
    *2) 次の接続先を記述します。
    *3) 以下、他サーバーがある場合は、同じようにコマンドを追加してください

□update□□□
 ファイル(F) 編集(E) 書式(O) 表示(V) ヘルプ(H)

    open ftp.artopix.jp
    artopix
    abc456gh
    hash
    ascii
    put index.html
*1)
    disconnect
*2)
    open ftp.domain1.jp
    artopix
    123def78
    hash
    ascii
    put index.html
*3)
    disconnect
    open ftp.domain2.jp
    artopix
    123def78
    hash
    ascii
    put index.html

    bye


  7.スクリプト・ファイルの保存

    転送するファイルのあるフォルダであることを確認し
    必ず同じ場所に、2つのファイルを保存してください

  *FTPコマンド

   ■コマンド一覧表

■ 転送スクリプト・バッチファイルの使い方

.batの拡張子の付いたアイコンをクリックするとコンソールウィンドウが起動し、自動でファイル転送が行われ、終了後は自動で画面が閉じます。何かが原因でウィンドウが閉じない場合は、コンソール画面の>(プロンプト)に exit と打って画面を終了させてください
*リソース不足や回線が混雑したことが原因で転送がストップしてしまった場合は、 Ctrl + C と入力してエスケープし、再度接続を試みて下さい。)

□C:/Home/ftp/help.html □□□
 220 Yahoo!
 User (ftp.geocities.jp:(none)): artopix
 331-Enter your Yahoo! JAPAN GeoCities member password
 331
 Password:
 230-You are using 5.0% of your subscribed disk space
 230 You have 14.244 MB of space available
 ftp> put index.html
 200 PORT command successful.
 150 Opening ASCII mode data connection for /artopix/object.html .
 226-You are using 5.3% of your subscribed disk space
 226 You have 14.212 MB of space available
 ftp: 33080 bytes sent in 0.00Seconds 33080000.00Kbytes/sec.
 ftp> bye
 221-You have transferred 32195 bytes in 1 files
 221-Total traffic for this session was 32846 bytes in 1 transfers.
 221-Thank you for using the FTP service on ftp3.geo.yahoo.co.jp.
 221 Goodbye.
 C:\>exit

*スクリプト・バッチのサンプルファイルについて*
解凍すると、ftpbatフォルダ/中に ftp.bat update の2つのファイルができます。updateファイルの*の部分は利用しているサーバーに合わせてアカウント・パスワード・転送ファイル名などを適宜編集して使ってください。

[最終更新日2010.4.27]