2006年10月22日

そういえば、VISTA のシェルは?

以前、VISTA になれば monad という機能が強化されたシェルが登載されるという観測がありましたが、実際はどうなっているんでしょう・・・

名前が PowerShell に変更になったようですが、標準で搭載されてくるのかは調べきれていません。インフォメーションセンター は見つけましたが、なにぶん英語は苦手なもんで・・・ (^_^;)

おいおい調べて報告していきます。

posted by Woody at 20:03 | 静岡 ☀ | Comment(0) | TrackBack(0) | コマンドプロンプト

2006年05月30日

ほッ・・・(^^ ) IE7のバグでヨカッタ・・・!

IE7 からの HTTP_REFERER が UTF-8 で送信されてくる問題は、やっぱりバグだったんですね。ほんと、どうしようかと思ってたんですが、早い段階で結論が判って助かりました。

日本語ドメイン取得.com 様々です (^^ )


なんか、いろいろな実験を行うみたいだし、チョッと注目してみたいサイトだね。まだ準備中のようだけど・・・

posted by Woody at 01:35 | 静岡 ☁ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年12月11日

TCP/IP 見たことくらいあるよね・・・

メール関連の話が突然出たところで、少しこの辺りの話をしてみよう。

って言っても、一言で済むほど単純ではない。しかし、もう必需品といっても過言でないくらい当たり前に使えるようになったのだから便利になったものだ。

インターネットを通じてやり取りするわけだが、根本には通信技術なども絡んでくる。ボーレートとかパリティービット(ダビスタの繁殖牝馬ではない)といった言葉くらいは聞いたことがあるかも知れない。しかし、ここまでは当ブログで意図した範囲ではないし、語るほど詳しくも無い。ここでは、これらの上に成り立っている部分について取り上げてみる。

具体的には・・・  TCP/IPicmptelnetsmtppophttpftpdns、といった辺りに触れていくことにしよう。

<まずは、TCP/IP と icmp かな>
posted by Woody at 04:49 | 静岡 ☁ | Comment(1) | TrackBack(0) | コマンドプロンプト

2005年12月06日

秘技? 再帰呼出し

お待たせしました。やっと再帰呼び出しです (^^;

前回、チョッと出てきた無限再帰呼出し・・・、試してみた人います? 「黒画面」 が一気に何枚も起動して壮観?ですよね。止めることも出来ずに、ただ Windows がお手上げするのを待つだけですしね。その後 ウィンドウを消すのがまた面倒くさい (^^; そういうときにはタスクマネージャーを起動して、アプリケーションタブから一気に選択して 「タスクの終了」 をすると、チョッとは楽ですよ。

通常は ウィンドウを開く再帰呼出しなんてしませんけどね。でも、ヤバそうだってことは実感出来たと思います。 ・・・なんて、試した人ばっかりのように書いてますが、止めておいたほうがいいですよ (^^;

今回は再帰呼出しで、全てのホルダとファイルにアクセスしてみます。

<続きを読む>
posted by Woody at 01:42 | 静岡 ☀ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年12月04日

cmd.exe と、遅延展開

今まで、コマンドプロンプトと一貫して呼んできましたが、Win98 までは確か 「MS-DOS プロンプト」 って言われていました。そして、Win2000 から 「コマンドプロンプト」 って呼ばれるようになりました。一体何が変わったのでしょう?

って、さも知ったように書いてますが、詳細までは解かりません (^^; が、その実体が command.com から cmd.exe に変わり、機能が追加されたことは解かります。

メニューの 「コマンドプロンプト」 を右クリックしてプロパティを表示すれば、何が起動されているか調べられますよ。 cmd.exe だと思いますが・・・

<じゃぁ、何か便利になったの?>
posted by Woody at 00:43 | 静岡 ☀ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年12月03日

バッチファイルの呼び出し

よ〜く見たら、外部バッチファイルの呼び出し方をやってませんでしたね。「秘技?再帰呼出し」 はもうチョッと伸ばして、今回はコレの話をします。

バッチファイルでは、サブルーチンのような概念がとして、別に作成したバッチファイルの呼出しを使用します。

<呼出し方の詳細>
posted by Woody at 01:08 | 静岡 ☀ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年12月02日

検索ワード %~dp0

アクセス解析を覗いてみました。

いや〜、%~dp0 などというキーワード?とも言えないようなものでヒットしているんですね。結構な数ありましたよ (^^;

<ズバリ!、%~dp0 とは>
posted by Woody at 05:38 | 静岡 ☀ | Comment(1) | TrackBack(0) | コマンドプロンプト

2005年11月28日

並べ替えコマンド sort

久々の更新です。 (^^;

いや〜、実際の作業ってのは、頭に描いた通りには進まないものですね。本日、中間チェックだったんですが、見事に間に合いませんでした (^^;

後半、さらに追い上ていかないといけません。信用なんて元よりあると思っていませんので失いようはありませんが、迷惑だけはかけたくありませんからね。

まあ、そんな訳で、多少更新頻度は落ちると思いますが、続けていきますのでよろしくお願いいたします。

では、今回は以前予告した通り、並べ替えをしてくれるコマンドを紹介します。
< sort コマンドです >
posted by Woody at 01:37 | 静岡 ☀ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年11月18日

あ〜〜ッ、5日もかけたデータを消しちゃった・・・

いや〜、今日は大変なことをしちゃいました。5日くらいかけて作成していたデータに、他のファイルを上書きしちゃったんです。電話に対応しながら操作するもんじゃありませんね。

バックアップを取った記憶もないし、さすがに青くなりましたよ。だって、更に5日かけたら、納期に間に合いませんから・・・ (^^;

でも、今日になって更新した分の損失だけで済みました。
<なぜって? それは・・・>
posted by Woody at 02:35 | 静岡 ☀ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年11月17日

文字列検索コマンド find

膨大な住所録の中から、例えば 「静岡県に住む人をリストアップしたい」 なんて作業はありがちだよね。そんなとき、どうしてますか?

まあ、大概はデータベースから検索で一発なんだろうけどね。でも、いざって時にも、こんなコマンド知ってたら安心だよね。

指定したキーワードを含む行を全て書き出してくれるコマンドだよ。

<この続きを読む>
posted by Woody at 02:52 | 静岡 ☀ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年11月15日

ファイル表示コマンド type

あ〜ぁ、久々になってしまったな〜 (^^;

今回は コマンドプロンプト だよ。

リダイレクトでファイルに書き出すことはやってきたけど、その内容を読み込むのもリダイレクトやコマンドを使ったがけだったよね。

なので、黒画面に表示してみよう。

<この続きを読む>
posted by Woody at 01:38 | 静岡 ☁ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年11月05日

FTP で自動バックアップ(その3)

FTP 自動バックアップの最終回です。今回は サクッ!と行きましょう^^


(その1) で公開しておいたソースについて見ていきますね。

やっていることは、前回行ったダウンロードの手順どおりのことです。応答メッセージを画面の代わりにログファイルに記述しています。

あとは、毎回同じファイル名にバックアップしていたのでは、万一、データが飛んでしまったのを気付かずにいた場合、バックアップデータも空になってしまって意味ありませんので、ここでは1週間分を別名で保存するようにしています。

名前の付け方を工夫すれば、この期間を変更することは可能です。


では、上から見ていきましょう。

@echo off   

バッチ処理で実行されるコマンドの表示をしないように設定しています。これを省略すると、不要な多くの画面出力が発生するため、非常に見にくくなってしまいます。先頭の @ は、その行の実行コマンドを表示しないようにするために使われます。全ての行に @ を付けても結果は同じですが、ソースが見にくいですよね。まあ、おまじない程度に思ってください。

echo Auto FTP Backup Running.....

画面に実行中のメッセージを表示しているだけです。

set BACKUP_FILE=man_cp.txt
set BACKUP_FILE=%BACKUP_FILE% tmp_index.htm
set BACKUP_FILE=%BACKUP_FILE% box01-5.LZH


BACKUP_FILE という環境変数にバックアップで保存するファイル名を設定しています。1行で書いてもいいのですが、変数に値を追加する方法を敢えて使用しました。非常に多くの値をセットしたい場合、無理やり1行で書こうとすると、とっても長くなり見にくくなってしまいますもんね。

set LOG_FILE=ftp_log.txt

環境変数にログファイル名をセットしています。これは長さも変わらないし、そのまま使ってもよさそうに思えますよね。でも、なぜわざわざ変数を使用するかっていうと、出力するログファイルのサイズが大きくなってしまえば、名前を変更したくなったりしますよね。そういった時に直にファイル名を指定していると、ぜ〜〜んぶ書き直さないといけなくなっちゃうんです。変数をつかっておけば、この1箇所を変更するだけで済みますからね。

echo %date% %time% >> %LOG_FILE%
echo. >> %LOG_FILE%


コメントのとおり、ログファイルに日時を書き出しています。%date% %time% は、コマンドプロンプト自体が既に設定している環境変数で、日付、時間の情報が格納されています。そして、echo. は空行を出力します。ピリオドの位置に注意して下さいね。スペースを挟んでしまうとピリオドが出力されてしまいますよ。空行出力の定型だと思って問題ありません。

ftp -i -s:ftp_login.txt >> %LOG_FILE%

いよいよ FTP コマンドですね。 -i オプションで複数ファイル指定時に対話型にしないように指示しています。そして重要なのが -s オプション。これに、ftp_login.txt という FTP セッション中に自動入力するデータを記述したファイルを指定しています。そして、FTP セッションの応答をログファイルに記述するようにリダイレクトしていますね。

では、(その1) で一緒に公開した ftp_login.txt を見てみましょう。前回行った手順も思い出して下さいね。

open example.com
(ユーザー名)
(パスワード)
cd tenukipg
type ascii
get man_cp.txt man_cp.txt
cd ../tmp
type ascii
get index.htm tmp_index.htm
type binary
get box01-5.LZH box01-5.LZH
close
bye


まず、open コマンドで接続するサーバーのドメインを入力しましたよね。これが1行目です。
そうしたら、ユーザー名を尋ねられたので、ログインユーザー名を入力しました。2行目です。
次に、パスワードを聞いてきたので、入力しました。3行目です。お気づきのことと思いますが、このファイルにはユーザー名とパスワードが誰にでも読める形で記述されることになりますので、他人に見られないように保存する必要がありますので、気をつけてくださいね。
その次は、目的のディレクトリに移動しています。ここでは tenukipg というディレクトリに移動する例で記述しています。実際に存在するディレクトリを指定してくださいね。
次に、テキストモードを指定、そして、get コマンドで man_cp.txt をダウンロードしています。
それから、更にディレクトリを移動してモードを指定し、ダウンロードファイルを tmp_index.htm、box01-5.LZH という名前で保存しています。この名前が、BACKUP_FILE に設定した名前と一致していることに注目して下さいね。でも、このままのファイル名を使えってことじゃないですよ^^; 両方とも、実在するファイル名に変更して下さいね。
そして、ダウンロードが済んだら切断して、FTP セッションの終了です。

どおです? 前回に手作業でやったことをそのまま記述しているだけってことが解かって戴けたと思います。


FTP セッションが終了すると、処理はコマンドプロンプトに戻りますので、我々もバッチファイルに戻りましょう。

まず、ログファイルに空行を出力していますね。まあ、これはどおでもいいでしょう。

コメントにもあるとおり、日付より取得できる曜日文字をファイル名に付加することで、それぞれのファイルに7通りのファイル名が作成できますよね。なので、ダウンロードした決まった名前のファイルをこれで変更しています。

for /f "usebackq tokens=1-4 delims=/ " %%i in (
`date /t`
) do (
set EXT_STRING=%%l
)


よ〜く読んでみてくださいね。for コマンドの /f オプションを利用して date コマンドを実行し、その出力を解析して EXT_STRING という環境変数に曜日を取得しています。??? っていう状態でしたら、for ループ(その2) を復習してみてくださいね。


付加する曜日文字が取得できたら、あとはそれぞれのファイルの名前を変更すれば終了です。

for %%i in (%BACKUP_FILE%) do (
if exist %%~ni_%EXT_STRING%.%%~xi (
del %%~ni_%EXT_STRING%.%%~xi
)
ren %%i %%~ni_%EXT_STRING%.%%~xi
)


BACKUP_FILE にセットしたファイル名を for ループで処理しています。%%~ni_%EXT_STRING%.%%~xi が変更するファイル名になります。この名前のファイルが既に存在したら、そのファイルを削除しています。その後に ren コマンドでファイル名を変更して完了です。

所々に出てくるログファイルへの記述部分は、各自の好みで設定すれば問題ありません。この例では、単に私自身が見やすいように、欲しい情報と空行を挿入しているだけですので・・・


どおでしたか? 説明してしまえば、そんなに難しいことをやっている訳じゃないことが解かってもらえると思います。

そろそろ自分自身の要求を満たすものが書きたくなってきてはいませんか?

えッ? そんな必要ないって??

・・・そッ、そうですよね・・・(^^;)
使いやすいフリーソフトがいっぱいありますもんね・・・


まあ、その気になって、何か解からないことでもあったら、コメントにでも書き込んでくださいな。例え、解からないことでも必ずお答えしますよ。・・・「解からない」って ・・・ヾ(- -;)モシモシ


とりあえず、今はネタが思いつかないので、次回はまた便利コマンドを紹介しますかね・・・

posted by Woody at 02:10 | 静岡 ☁ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年11月04日

FTP で自動バックアップ(その2)

どうでしょう、ソースを読んでみましたか?

今回は、手動操作での FTP 手順を詳しく説明していきます。ソースファイルと見比べてみて下さいね。FTP コマンドでは、セッション開始後に自動実行してくれる機能があります。ソースファイルでは、その機能を利用しているだけで、処理手順は手動操作と全く変わりません。ただ、ログファイルは作成していますけどね・・・

では、早速 コマンドプロンプト を起動しましょう。そして、実際に各自のサーバーに接続してみましょう。ヘルプも表示しておくといいかもしれませんね。

FTP コマンドは、コマンドプロンプト自身が持つコマンドではなく、ftp.exe という実行ファイルを呼び出しているのです。そのために、英語で、しかも help 単発のコマンドでは表示されず、ftp --help という他と違った形式じゃないとヘルプが表示出来なかったんです。私もよく入力ミスをしますが、中には ftp help と入力した方もいるのではないですか?

Unknown host help.
ftp> _


こんな状態になって困ったことでしょう。説明不足でした。
ゴメンなさい ^^;

ヘルプの構文を見ていただけばわかると思いますが、この場合、help というホストが指定されたと判断しちゃった訳です。なので、「help なんてホスト、知らねーよ!」 って怒っていたんですね。でも、律儀に FTP にセッションを開始してくれていたので、余計に訳がわからない状態に陥ってしまったのです。多少の予備知識があったなら、全然問題ない場面ですが、素直に ftp --help を実行してくれた方は、きっと始めての方でしょうから・・・

今後、慌てないように書いておきます。セッションが始まったら、セッション中のコマンドを使用してください。サーバーに接続するなら open コマンド、終了するなら bye を入力しましょうね。


では、サーバーに接続してみましょう。ホストも指定出来ますが、まずは ftp とだけ入力してみてください。

ftp> _   と、プロンプトが変わりましたよね。

ftp.exe とのセッションが始まったことを意味しています。次に、先ほども出てきましたが、ここで open とだけ入力してみましょう。もちろんここでもホストを指定することもできますが・・・

To   と表示されるハズです。「どこに繋ぎゃ−いいんだ?」 って聞き返してきました。

example.com (あなたの使用しているサーバーのドメイン名)

を入力してください。

200番台の応答があれば、接続成功です。User: と、ユーザー名を尋ねられているハズです。もし、Unknown host ・・・ という応答であれば、サーバーが見つかっていません。入力を確認して open コマンドからやり直しましょう。

では、ユーザー名を尋ねられているので、あなたのログインユーザー名を入力しましょう。

サーバー側の設定にもよりますが、多くの場合、ここでユーザー名を間違ってもそのままパスワードを尋ねてきます。パスワードを入力してください。ここでも、200番台の応答は、ログイン成功を意味します。500番台なら失敗です。パスワードの入力ミスだけではなく、ユーザー名もチェックしてくださいね。

さあ、ログイン出来ましたよ。dir コマンドを入力して、いつものディレクトリと同じか確認してみてください。

どうですか、いつもと同じディレクトリでしょ? 隠しファイルも表示したいときには dir -aa オプションを付けてあげてください。

折角ですから、何かダウンロードしましょうか?

cd [directory] コマンドを使って、目的のディレクトリに移動してください。そして、ローカル側も lcd コマンドで目的のホルダに移動しておきましょう。

最後に、ダウンロードするファイルのタイプを指定しておきます。デフォルトはテキストモードのハズですが、指定しておいたほうが確実ですから・・・。テキストファイルなら type ascii 、バイナリファイルなら type binary です。

さて、準備が出来たら、いよいよダウンロードです。


get [filename]  (サーバー側のファイル名を指定して実行)


保存ファイル名を変えたい場合には、filename2 も指定してくださいね。

結果を確認して見ましょう。ローカル側で指定したカレントホルダを見てください。ダウンロードしたファイルがありますよね。テキストファイルなら、中身も確認してくださいね。

もちろん、アップロードも可能ですよ。get コマンドの代わりに

put [filename]  (ローカル側のファイル名を指定して実行)

を実行するだけですから・・・。ぜひ試してみてください。

サーバーから切断するには、close コマンドを使います。でも、最近はこの手続きが省略されていることが多いみたいですね。プロトコル上は、切断を要求して、サーバーからの応答を確認後に FTP を終了するのですが、いきなり終了する場合が多くなっているみたいです。なので、実質上、いきなり終了しても何も起こりませんが、一種のマナーと捉えておきましょうね。

FTP を終了するには bye を使います。FTP セッションが終了して コマンドプロンプト に戻ります。プロンプトの変化に注目してくださいね。


どおでしたか? FTP 用のソフトも出回っているし、何だか FTP ってムズカシそうなことをやっているって思っていませんでしたか?

実は、内部的にはかなり複雑なことをやっているのですが、転送自体は Windows の標準機能で実現できるんですね。
折角ある物ですから、使わない手はありませんよね。ぜひ、色々試してみてください。


次回こそ・・・(^^;) ソースファイルの内容を説明しますね。

posted by Woody at 01:10 | 静岡 ☁ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年11月02日

FTPのヘルプ

前回の記事の中で書いた程度のヘルプじゃぁ、FTP の全貌はとても解からないと思ったので、表にまとめてみました。参考にしてみてください。

コマンドプロンプト FTP ヘルプ


これ、まとめてたら遅くなっちゃったので、続きの記事はまた次回ってことで・・・^^;

posted by Woody at 04:30 | 静岡 ☔ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年11月01日

FTP で自動バックアップ(その1)

今回から3回くらいになるのかな?  FTP コマンド の説明と、これを利用した自動バックアップの話をしますね。

まだまだ、とっても便利なコマンドがあるので説明していこうかと思ってたのですが、コマンドの説明ばっかりじゃ飽きちゃいますもんね。


では・・・って、始める前に、ちょっと念を押しておきます。いくら FTP で自動バックアップできるといっても、環境によっては不可能なこともあります。今すぐ思いつく点を2つ程挙げておきますね。

まず、対象のサーバーに FTP 接続 が出来ること。実を言うと、ここ Seesaa さんは入れないみたいなんですよね。livedoor さんの有料版は入れるみたいなので、心が揺れてたりしています ^^;
まあ、まだまだコメントやトラックバックもありませんので、たいした問題にはなっていませんが・・・

そしてもうひとつ、奥さん、または旦那さん、あるいは、お父さんお母さんが障害になるかもしれません。パソコンの電源を入れっ放しに出来ることでしょうか。

この方法では、これらを解決しないと自動バックアップは実現できません。っていっても、他の方法ででも、これらの問題をクリア出来るものだあれば、是非とも知りたいところですけどね・・・


なんて、バカなこと言ってないで始めましょう。


コマンドプロンプトでは、FTP (ファイル転送プロトコル) をサポートしたコマンドが標準でインストールされています。ftp --help と入力するとヘルプを表示できます・・・ が、


え、英語じゃね〜か ^^;


構文はわかりますよね。実際に打ち込んで参照してくださいね。
ここでは、簡単にオプションの意味を列挙しますね。

 -v       サーバーからの応答を非表示
 -n       自動ログインしない
 -i       複数ファイル転送時に確認しない
 -d       デバッグモードで実行
 -g       ワイルドカードを無効にする
 -s:filename  実行する FTP コマンドの書かれた
          ファイルを指定する
 -a       任意のローカルインターフェースを使用
 -A       匿名ユーザーでログインする
 -w:buffersize バッファーサイズを指定する
 host      ホスト名または IP アドレスを指定
 

といったところだが、英訳には自信がないので、過信しないこと^^;

自動実行に重要になるポイントは、実行する FTP コマンドの書かれたファイルを指定することと、複数ファイル転送時に確認しないことだ。これは当然だが、コマンドを自動実行してくれないと具合悪いし、また、途中で確認を求められても困る。host の指定は、FTP コマンドからでも指定できるので、どちらでもよい。


FTP コマンドは、ftp を実行し、ftp> というプロンプトの状態で help または ? を入力すると一覧が表示される。また、これらにコマンド名を与えると、簡単なヘルプが表示できる。結構な数があるが、とりあえず、主なものだけを説明しよう。

 open  ホスト名を指定し、接続する
 user  ユーザー名を指定する
 pass  パスワードを入力する
 close  ホストから切断する
 bye   FTP を終了する
 cd   カレントディレクトリを移動する
 ascii  転送モードをテキストモードにする
 binary 転送モードをバイナリモードにする
 dir または ls  ファイルリストを取得する
 get   1個のファイルをダウンロードする
 mget  ワイルドカードを使用して
      複数のファイルをダウンロードする
 put   1個のファイルをアップロードする
 mput  ワイルドカードを使用して
      複数のファイルをアップロードする
 rename ファイル名を変更する
 delete ファイルを削除する
 mkdir  ディレクトリを作成する
 rmdir  ディレクトリを削除する

といったところだ。まあ、これだけあれば、今回のソースは理解できるだろう。


だいぶ長くなったので、今回はこの辺で区切りとしよう。ソースをアップしておくので、よかったらダウンロードして勉強してみてください。

例によって、このソースが原因で生じる何事にも責任を負えませんので、自己責任の範囲内で活用して下さい。

ftp_backup.bat.txt
ftp_login.txt

(注)バッチファイルは実行してしまうと具合悪いのて、txt 拡張子を追加してあります。

次回は、このソースの内容に触れていきますね。


posted by Woody at 02:17 | 静岡 ☔ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年10月30日

for ループ(その2)

さあ、for コマンドの /f オプションだね。

これは、うまく使うと色々出来て便利なんだ。
構文については、help for を実行して参照してね。


まず、このオプションは、in で与えられたセットから
ひとつずつの文字列を受け取り、これを解析してから、
変数に格納するんだ。

ファイルセットが指定された場合には、
ファイルの内容を1行ごとに受け取る。

リテラル文字列で与えられた場合には、引数の受け取りと
同様に、スペースで区切られた文字列単位で受け取る。
usebackq を使う形式では、2重引用符が使用できるので、
スペースを含む文字列も扱える。

コマンドで与えられた場合には、通常、画面に出力される
結果を、1行ずつ受け取ってくれる。


これだけでも、かなり融通が利くようになるのだが、
受け取ったデータを更に解析してくれるのが嬉しい。

キーワードを含まないデフォルトの解析では、
スペース区切りで、最初の文字列を変数に格納する。

ここでは、スペースを判りやすく (SP) と記すが、
例えば、名前(SP)性別(SP)年齢(SP)・・・ といった
データファイルがあったとしよう。

この場合、デフォルトの解析では、名前のフィールドのみを
変数に格納してくれる。


たびたび言ってしまうが、これだけでもかなり便利だ。
でも、更に細かい解析をしてくれる。

まずは、eol キーワード

例えデータファイルであっても、コメントなどが
書かれている場合もあるだろう。行頭にある決まった
文字を挿入することでコメントとして扱うのが一般的だ。
この文字を指定することで、コメント行と判断してくれる。

eol=#

を指定した場合、先頭に # が書かれた行はスキップする
ということだ。「+Lhaca でサブホルダ毎に一括圧縮」 では
ホルダ名の先頭に _ (アンダースコア) の付いたものを
圧縮処理をしないホルダにすることを、このキーワード
を利用して実現している。

次に、skip キーワード

これについても、ファイルの先頭には、コメント的な様々な
情報が書かれている場合も多い。これらをまとめてスキップ
するために使用するのであろうが、実を言うとは、筆者は
このキーワードを重宝して使用した経緯はない。

次に、delims キーワード

デフォルトではスペース区切りだと話したが、このキーワード
で変更することが出来る。一般的なデータベース形式の CSV
では、区切りに , (カンマ) が使用されている。その場合

delims=,

を指定すれば、区切り文字が変更できる。また、データ形式
によっては、複数の区切り文字を指定したい場合もあるだろう。
その時には指定したい区切り文字を続けて指定してやればいい。
逆に、スペースで区切らず、1行全部を変数に格納したい場合、
このキーワードで区切り文字として何も指定せずに与えると、
スペース区切りをキャンセルして、1行全部を格納できる。
「+Lhaca でサブホルダ毎に一括圧縮」 で使用しているので、
参考にしてみてください。

次は、tokens キーワード

これはややこしいが、非常に便利だ。

前記と同様に、名前(SP)性別(SP)年齢(SP)・・・ というデータから
性別と年齢のデータが欲しいような場合、これで実現できる。

しかし、for 文の変数に指定できるのはひとつだけだ。
どうやって複数のデータを取得するのだろうか?

まあ、これは暗黙的・・・っていうか、勝手に決めて格納してきます。
この場合、2番目、3番目 が欲しいので

tokens=2,3

と指定します。受け取る変数は2つ必要になりますよね。
変数に i を指定した場合には、その上の j が暗黙的に確保されます。
4つ必要で、変数に a を指定した場合には a b c d になりますね。


実際に試したほうが判りやすいでしょう。

for /f "usebackq tokens=2,3 delims=/ " %i in (`date /t`) do echo i=%i j=%j
(改行せずに入力してくださいね)


date /t のコマンドをセットに指定しています。
これも実行してみて、比較するといいですね。

スラッシュ と スペース を区切り文字として指定したので
i には月が、j には日が格納されていますよね。

まあ、この例では1行より出力のないコマンドを使用しましたが、
dir /b コマンドなんか使うと便利ですよ。

このあたりが使えるようになると、あんなことや、
こんなことまで、出来ちゃいますよ。


あんなこと? こんなこと??

そんな言い方じゃ分んね〜よ〜



あはは・・・^^; そうですね。
それじゃぁ、次回からは少し実用的に行きましょうか。

FTP で自動バックアップ なんていうのはどうですか?




posted by Woody at 19:40 | 静岡 ☔ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年10月29日

for ループ(その1)

今回は for ループ を見ていきましょう。

このループも、とっても利用価値があるんですよ。

前回、goto 文を使った単純なループの話をしました。
出口を作ってあげないと大変なことになるんですよね。

だったら、予め必要な回数だけループしてくれたら
便利だと思いませんか?


それを実現してくれるのが for ループなんです。
与えられた範囲の内、それぞれの値について、指定された
処理を実行します。構文は、

FOR [オプション] %変数名 IN (セット) DO (コマンド)

の形式を取ります。(help for も参照してね^^)


もう、最初の頃から説明もなしに使ってましたよね ^^;

変数名は、基本的に、1文字の英字を使用します。
大文字、小文字が区別されるため、52 種類が存在します。

バッチファイルで使用するときには、コマンドプロンプトに
for コマンドの変数であることを判って貰う必要があります。
% は、バッチファイルの中で変数を展開させるために使用
されてるので、変数名を展開してしまい、うまくいきません。

この場合、% をもうひとつ付けることによって対応します。
%% は、一文字の % に展開されます。%0 〜 %9 が引数に
展開されるのと同様に、このように定義されていると
思えばいいでしょう。なのでバッチファイル内では、

%%変数名  の形になります。

これも、うっかりすると発見しにくいバグになりますよ。
見つけたとき、「なぁ〜〜んだ」 と思うと同時に、
腹立たしくなってきます・・・(経験談より ^^;)


コマンド部には、実際に行いたい処理を記述していきます。
バッチファイルでは、括弧で括ることによって、複数行に
渡って処理を記述することが出来ます。
この処理の間だけ、変数が有効ですので、その値を利用して
処理を書いていくことになります。まあ、変数の使用は
必須じゃないんですけど、殆ど無意味になっちゃいますので・・・


オプションの無い一般的な形式では、セットには
引数を渡すのと同様に、スペース区切りでリストアップするか、
あるいは、ワイルドカードを使ったファイル名を指定します。

例えば、* とすれば、カレントホルダの全てのファイルに
一致しますし、*.txt とすれば、全ての txt 拡張子のファイル
????.* とすれば、4文字以内の名前をもつファイルに一致します。

これらでピックアップされたそれぞれが、変数に格納され、
コマンド部 で定義された処理に渡されます。そして、
すべての値を処理し終わったら、ループを抜けてくれます。


変数に何が代入されているかを確認するには、コマンド部に

@echo %変数名

を指定して実行してみてください。
処理される全ての変数名を列挙してくれますよ。


さて、オプションを指定する場合ですが・・・


/D および /R は、単なるファイルセットの指定ではなく、
ホルダを処理する場合や、指定したホルダ以下のサブホルダを
再帰的に検索し、全ての対象ファイルを処理する場合に使用します。

/L は、セットに 開始数値、ステップ量、終了数値 を指定
することを宣言します。変数には、これらの与えられた数値に
したがって数字が格納されます。

@echo コマンドで実際に試してみればすぐに判りますよ。


/F オプションはチョッとややこしいんですよね。
でも、それだけ色々なことが出来るってことなんですよ。
簡単な解析なら実現できますね。

私の場合、今では、usebackq による形式を基本的に使用します。
usebackq については、help for を参照してくださいね。

なぜなら、usebackq を指定しない形式では、スペースを含む
ファイル名などを2重引用符を使って指定できないので、
その場合だけ usebackq による形式を使用するよりも、
この形式を基本に考えておいたほうが判りやすい
っていう理由なんですがね・・・


おッ、それは 『手抜き』 だね?


うッ・・・否定できませんです・・・ハイ ^^;


この部分は非常に有用なので、次回に改めて
じっくりとお話していきますね。

posted by Woody at 19:38 | 静岡 ☔ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年10月27日

条件分岐とループ処理

さて、今回は余談なしでいきなり行きますよ。

まずは、「条件分岐」 です。
使うことは非常に多いです。ぜひ、覚えちゃいましょう。


もし、○○ ならば、☆☆ を実行、違うなら、△△ を実行

というように、○○ の条件に当てはまるかどうかで
違う処理をしたい場合に利用します。

基本的には、

if ○○ ☆☆ else △△

でいいのですが、help if を実行したヘルプにも出てますが
中にはこの構文では失敗してしまうものもあります。

ですから、私は、無条件で括弧で括るようにしています。

if ○○ (☆☆) else (△△)

としています。また、括弧を使った場合、便利なのは
複数のコマンドが実行できることです。

私が覚えたばかりのとき、コレを知らずに、
数行のバッチファイルを作成し、それを呼び出すことで
対応していました。バッチファイルが大量に出来てしまって
結構、修正が大変でした ^^;

「+Lhaca でサブホルダ毎に一括圧縮」 のソース では、
4回使用していますね。参考にして下さい。

最初は、引数がホルダかどうかの判定の際の for 文の中、
引数の親ホルダ (%1¥..) の中のサブホルダをピックアップし、
「それと引数の名前部分が一致したら」 IS_DIRECTORY に
そのときのホルダ名を代入し直しています。
for 文については、次回に詳しくやりますね。

次は、「IS_DIRECTORY の値が元のままだったら」
実際の圧縮処理部分をスキップしています。

その次は、「サブホルダ一覧用の一時ファイルが存在したら」
そのファイルを削除しています。

最後は、前回にも説明してますが、「引数が空になったら」
end ラベルに飛んでいます。


自動で処理を行おうとした場合、その時点での値を調べて、
それに応じた処理を行う必要があります。場合によっては、
if 文の中に、更に if 文を書く必要も出てきます。

自動処理には欠かすことの出来ない、非常に重要な命令
である事を肝に銘じておいてください。


それでは、今度は 「ループ処理」 についてですが、
引数の処理のところで、shift コマンドを使うと便利だという
話をしたと思います。何故なのかは、たぶん想像どおりですが、
全く同じ処理を繰り返せばいいからです。
書き込む量が少なくなりますので、ミスを減らすことも出来ます。

では、このループの作成の仕方を詳しく説明致します。


えッ? 「goto 文で手前のラベルに飛ぶんだろう」 って?


そっ、その通りです。
行の先頭に : を付加すると、ラベルを定義できます。

いや〜、このループは単純でしたね。
でも、注意しないといけないのは、必ずループの出口を
作ってあげないといけないことです。この場合には
「引数が空になったら」 end ラベル という命令で
ループ外に脱出しています。

もし、出口がなければ、永遠にそのループを回り続けます。
そのような状況になってしまったら、Break キー を押すか、
Ctrl+C キー で処理を中止させてくださいね。


実を言うと、for 文もループ処理なのですが、
少々高度で複雑なので、次回に廻すことにしました。


あ〜ッ! タイトルの 『手抜き』 ってこのことだな〜!!


ちッ、違います・・・ ^^;

posted by Woody at 01:48 | 静岡 ☁ | Comment(0) | TrackBack(0) | コマンドプロンプト

2005年10月23日

環境変数(他、%~dp0 等)

さて、今回は 「環境変数」 について話そう。

まず、環境変数とは何か・・・っていうと、
前にも出てきてるけど、%systemroot% とか %path% とか、
システムの動作に必要なものを定義した変数なんだ。

マイコンピュータ を右クリックで 「プロパティ」 を
ポイントしてみよう。そして 「詳細タブ」。
その画面にある 「環境変数ボタン」 を押下してください。

起動したウィンドウの中で見られるのが、システム起動時に
定義される環境変数だ。%systemroot%%path% も見つかるよね。
ここで新規に環境変数を作成すると、起動時に設定されるようになる。
編集、削除も可能だが、システムの動作に深く関わるので
充分な理解が出来るまでは、あまりお勧めできない。

バッチファイルを作成するにあたっては、特に必要ないとも言える。

set コマンドを使用して、局所的な変数を設定できるからだ。
ただし、ここにある変数と重ねると大変なことになる場合がある。

Windows 2000, XP での コマンドプロンプト では、
さほどの問題にならないようだが、MS-DOS プロンプト では
当方に既にその環境が無いために確認が出来ていない。

極端な例だが、 set path=

などとやってしまうと、再起動を余儀なくされることも予想されるので
重複を避けておいた方が無難である。


では、前回同様に、「+Lhaca でサブホルダ毎に一括圧縮」
ソースを例としてみてみよう。


set LHACA_PATH="C:¥Program Files¥Lhaca¥Lhaca.exe"
set TEMP_FILE=dircomp.$$$
set LOG_FILE_NAME=%~dp0SubDirLhaca.log
set IS_DIRECTORY=NULL



この4個の環境変数が使用されている。

LHACA_PATH  は、+Lhaca の実行ファイルの完全パス、
TEMP_FILE   は、サブホルダ一覧を保存する一時ファイル名、
LOG_FILE_NAME は、実行履歴を保存しておくファイル名、
IS_DIRECTORY は、与えられた引数がホルダか否かを
          判定するための変数

として使用されている。set コマンドは、
指定された変数名に値を代入するのに使用されている。

格納された値を呼び出すには、% で挟んでやれば良い。
%TEMP_FILE% とすれば、これをそのまま dircomp.$$$
置き換えてくれる。

変数の指定時には、% を付加してはならない。また、
代入される値は、= のすぐ右側から行末まで全てであり、
見やすいからと言ってスペースを空けたりすると、先頭にスペースを持った文字列になるので、気を付けなければならない。

もちろん、2重引用符もそのまま格納される。この場合、
"%LHACA_PATH%" とすると、2重引用符が2個連続する
事になる。見つけにくいバグになるので、
これにも充分気をつけたい。

LOG_FILE_NAME には、変数を使って値を設定している。
%~dp0 は、「%0 の引数をドライブとパス名に展開せよ」 という意味だ。
help for を実行すると、参照変数の置換について記されている。
いろいろ試してみると面白い。

そして、%~dp0 の実行結果の末尾が、¥ になることを
確認しておこう。そうすれば、%~dp0SubDirLhaca.log は、
%~dp0 の部分が展開された結果、完全パスに
なっていることが解かるだろう。


IS_DIRECTORY では、最初に NULL という値を格納している。
しかし、次の for 文でホルダか否かをチェックしている。

%1 に格納された文字列をホルダと仮定して、その親ホルダ内の
サブホルダを全てチェックし、一致するものが見つかったら
IS_DIRECTORY にそのときの変数名を代入している。

つまり、ホルダではなかった場合には、IS_DIRECTORY
NULL のままだ。そこで、次の文で条件分岐、
%IS_DIRECTORY%NULL と同じだったら
jump ラベルに飛べ」
と言う命令で処理をスキップしている。



っと、チョッと語調を変えて書いてみたけど、どうだろう?
どっちが読みやすいのかなぁ〜?

えっ? 一緒? どっちも解かんな〜〜い って??


うぅ〜〜、面目ない・・・


なんか、順番が滅茶苦茶になっているけど、
次回は、条件分岐、ループ処理 あたり、もうチョッと詳しく話そう。



posted by Woody at 22:41 | 静岡 ☁ | Comment(1) | TrackBack(0) | コマンドプロンプト

引数の受け取り方

早速、今回は 「引数の受け取り方」 だったよね。

今、仮に C:¥test¥test.bat というバッチファイルを
呼び出すこととしよう。そして、これに
arg1, arg2, ・・・ arg10 までの文字列を渡すとしよう。

えっ? そんなに渡していいのかって??

ん〜〜、いい質問だね ^^;
Windows では、パスの長さがで 256 文字程度(注1)まで
という制約があるんだ。短い文字列なら、数が多くても大丈夫。
あとは呼び出された側で対応するんだからね。


さあ、話を元に戻して、

呼び出し方は解かるよね。もし、スペースを含む文字列なら
2重引用符で囲むんだよ。変数を使って呼び出すなら
囲っておいたほうが確実だよ。

C:¥test¥test.bat "arg1" "arg2" ・・・ "arg10"

って感じだよ。

あとは、この引数をどうやってバッチファイルの中で受け取って、
どう使用するかなんだけど、実は、何もしなくっていいんだ ^^;

既に決まった変数に格納されているんだよ。

バッチファイルでは、% を変数を表すのに使うんだけど、
%0%9 という変数は引数用に予約されていて、この中に
格納済みなんだよ。

%0 には、呼び出されたコマンドが完全パスで格納されている。
%1%9 には、それぞれ、コマンドに続いて渡された引数が
格納されているんだ。

あれ? じゃあ、arg10 はどおすんの??

うッ・・・ そ、そのままじゃぁ使えないんだ ^^;
でも、 shift っていうコマンドがあって、これを使うと
引数の格納位置をズラしてくれるんだ。

%2%1 に、・・・ %9%8 に、その外から %9 にって具合に

だから、10 以上の引数が予想されるときには、shift
使って処理しておかないとマズイんだよ。

参考用に記載した 「+Lhaca でサブホルダ毎に一括圧縮」
ソースでも shift を使っているよ。逆にいえば、
順番に処理するなら shift させてしまえば、必要最小限の
引数 (この場合 %1) だけで処理することができるんだ。

引数が無くなったら、その変数は空文字になる。
shift の次の行にある

if "%1"=="" goto end

は、その空文字のチェックをしてるんだ。
もし、"%1" と "" が同じだったら end ってラベルに飛んでね。
っていう意味の命令だよ。

プログラムするのには、こういった条件分岐は重要に
なってくるから、if 文、覚えちゃおうね。



じゃあ、次回は環境変数あたりの話をするね。
また、参考用のソースを例にして進めていきます。




(注1) VC で include する windows.h には MAX_PATH として
    260 が定義されています。この値を基準に作成されている
    アプリケーションが多いと思います。


posted by Woody at 05:09 | 静岡 ☁ | Comment(0) | TrackBack(0) | コマンドプロンプト
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。