| Win32 FAQ |
perlwin32faq4 - Windows NT および Windows 95/98
Perl開発者のためのWindows NT および Windows 95/98耳寄り情報
手近なところでは、Windows NTの添付冊子やWindows NT CDのsupport\booksディレクトリでしょう。 Windowsヘルプも役に立ちます。
Windows NT の内部情報は、Windows NTリソースキットで得ることができます。これは、書店やマイクロソフトから入手できます。 Microsoft TechNetも支払いに値するリソースです。
Windows NTのWorld Wide Web サポート:
http://www.microsoft.com/ntserver/
Windows NT Workstation のサポート:
http://www.microsoft.com/ntworkstation/
Windows 95/98の添付冊子やCD-ROM内にドキュメントがあります。また、スタートメニューのヘルプも役に立つでしょう。
Windows 95 リソースキットには、Windows 95の内部情報が含まれています。これは、書店やソフトウェア販売店で入手できます。
Windows 95/98 のWorld Wide Web サポート:
http://www.microsoft.com/windows95/
http://www.microsoft.com/windows98/
残念ながら、Win32環境にはshebang構文やそれに類するものがありません。
コマンドラインからスクリプトを実行するには、以下に示す二つのやり方があります。
うまくいかなかった場合でも、perl myscript.pl のように直接perlインタープリタをコールすれば大丈夫です。
Win32システム自体はshebangを使いませんが、Apache Webサーバは使用します。 Win32システムでApacheを使っている場合、CGIスクリプトの最初の行にshebang行を入れる必要があります。
shebang行は次のようにします。:
#!perl
Windows NT 4.0では、ファイルタイプの関連付けが最もクールな方法です(perlとPerlスクリプトを関連付けるにはどうすればよいのでしょうか?参照)。 拡張子.plとPerlスクリプトを関連付けると、Windows NTが代わりにperl.exeを起動してくれるので、ファイル名を入力するだけで済むようになります。 さらに、下記のように、.plファイルを含むようにPATHENT環境変数を変更すると、拡張子なしのファイル名の入力だけで済みます。これは、Windows NTが同じ名前の.plファイルがないかパスを検索してくれるからで、最初に見つかったものが起動されます。:
SET PATHEXT=.pl;%PATHEXT%
PATHEXTは、コマンドラインではなくシステムコントロールパネルでセットしておく方がよいでしょう。システムコントロールパネルでセットしておかないと、コマンドプロンプト画面を開く度に入力しなければならなくなります。
設定後、以下のようなcat.plというPerlスクリプトを作ったとします。:
while ( <> ) {
print;
}
すると、次のようにコマンドラインから起動できるようになります。:
cat myfile.txt
しかし、次のようなI/Oリダイレクトと一緒には起動できません。:
cat < myfile.txt
cat myfile.txt | more
これは一見可能なように見えますが、(Windows NTの制約のために)うまくいかないのです。 スクリプトはパスの通ったところに置きます。そうでない場合は、ファイルまでのパスを付け加えます。
ファイルの関連づけの方法はWindows 95では使えないので注意してください。 また、Windows NTでもコマンドエクステンションを無効にしている場合は使えません。 しかし、拡張子をPerlと関連付けていれば、エクスプローラからPrelスクリプトを起動することは可能です。
他のオプションとして、Perl for Win32と一緒にディストリビュートされているpl2batユーティリティを使ってPerlスクリプトをバッチファイルに変換する方法があります。 この変換でスクリプトの前にWin32バッチ言語がセットされ、ファイル内のperlインタープリタはシステムからコールされるようになります。 実際、実に見事なバッチコーディングです。
helloworld.plというPerlスクリプトにpl2batユーティリティを適用する場合、以下のようにします。:
C:\> pl2bat helloworld.pl
これは、helloworld.batというバッチファイルを生成します。 このスクリプトは以下のようにするだけで起動できます。:
C:\> helloworld
Hello, World!
コマンドラインパラメータを渡すことも可能です。スクリプトが置いてある場所はPATHにセットされたディレクトリでも、他のディレクトリ(訳注:カレントディレクトリのことと思われます)でも構いません。pl2batコードは通常見つ出して適切に実行します。 ファイルの関連付けに対するこの方法の利点としては、I/Oリダイレクトが正しく機能する点が挙げられます。
pl2batには、どのようにラップを行うか、どのコマンドラインスイッチをperlに渡すか等に影響する便利なコマンドラインスイッチが数多くあります。
コマンドラインでperldoc pl2batとすると、それらのオプションの詳しい内容が表示されます。
pl2exeユーティリティはpl2batに似ていますが、Perlスクリプトに実行可能ファイルのヘッダをセットし、直接編集できないEXEファイルを生成します。 pl2exeを通して作成されたスクリプトでは、リダイレクトは正しく機能します。
Win32システムで、直接chmodの替わりになるものはありません。ファイルの属性 を変更するには、ATTRIBというコマンドラインツールを使います(詳しくはコマンドラインでHELP ATTRIBとタイプしてください)。より複雑なパーミッション については ファイルのパーミッションをセットするにはどうすればよいのでしょうか? を参照してください。
chmod()関数に関する詳細については、
Win32プラットフォームではchmod関数はどのように動作するのですか?を参照してください。
外部のメールプログラムを使ってEメールを送信する、次のようなスクリプトを目にすることがあるかもしれません。:
open(MAIL, '| /usr/lib/sendmail user@there.com') or "die";
print MAIL <<EOF;
To: user@there.com
From: user@here.com
Hello, World!
EOF
この種のスクリプトを見ると、たいてい「Windowsにsendmailの代わりになるものはあるのだろうか?」という疑問が湧いてきます。 しかし、PerlスクリプトからEメールを送る必要がある場合に、わざわざsendmailのような外部プログラムを使う必要はないのです。 libnetバンドルにはNet::SMTPというモジュールが含まれており、このモジュールでメール送信を行うことができるのです。以下はそのサンプルです。:
use Net::SMTP;
$smtp = Net::SMTP->new('here.com'); # SMTPサーバに接続
$smtp->mail( 'user@here.com' ); # ここで送信元のアドレスをセット
$smtp->to('user@there.com'); # 送信先のアドレス
$smtp->data(); # メール本文の開始
# ヘッダを送信。
$smtp->datasend("To: user@there.com\n");
$smtp->datasend("From: user@here.com\n");
$smtp->datasend("\n");
# 本文を送信。
$smtp->datasend("Hello, World!\n");
$smtp->dataend(); # メールの送信を完了
$smtp->quit; # SMTP接続をクローズ
他の方法としてMail::Senderがあります。これは次のように使用します。:
use Mail::Sender;
$sender = new Mail::Sender {smtp => 'mail.yourdomain.com', from => 'your@address.com'};
$sender->MailFile({to => 'some@address.com', subject => 'Here is the file',
msg => "I'm sending you the list you wanted.",
file => 'filename.txt'});
他にも、Mail::Sendmailがあります。これは次のように使用します。:
use Mail::Sendmail;
%mail = ( To => 'you@there.com',
From => 'me@here.com',
Message => "This is a minimalistic message"
);
if (sendmail %mail) { print "Mail sent OK.\n" }
else { print "Error sending mail: $Mail::Sendmail::error \n" }
また、
Robin Chatterjeeの Perl for Win32 のページ(Perl for Win32に関する情報で、World Wide Webでアクセスできるものはありますか?参照)から、外部プログラムを使わずにメールを送信するPerlスクリプト入手することができます。
どうしてもWindowsでsendmailに替わるものが必要な場合、次のような代替品があります。:
BlatはパブリックドメインのプログラムでWindows NTのコマンドラインからEメールを送信します。 Windows 95でも動くと言われていますが、Blatの作者はWindows 95ではテストをしていません。 Blatのホームページは、 http://gepasi.dbs.aber.ac.uk/softw/Blat.html にあります。(訳注:Blatを日本語化したBlatJのページは、 http://www.piedey.co.jp/blatj/index.html)
Microsoftのsendmailのポートが、FTPサイトftp://ftp.microsoft.com/developr/drg/unix-to-windows/ports/sendmail/から入手できます。
商用版のsendmail製品は、MetaInfoから入手できます。 評価版の入手先は、http://www.metainfo.com/です。
他の商用メール製品にSeattle Labsのslmail製品の一部であるwrmailがあります。 フリーバージョンは、 http://www.seattlelab.com/ で入手できます。
UNIXのcronユーティリティはWin32プラットフォームにはありません。
Windows NTでは、ATというスケジューリングツールが利用可能です。 UNIXのcronユーティリティとは異なり、ATではフラットファイルにスケジュールを保存したりはせずコマンドライン引数を使って設定を行います。 以下はその一例です。:
at 23:37 /interactive /every:M,T,W,Th,F,S,Su cmd /c "c:\perl\bin\perl.exe c:\test.pl"
コマンドラインバージョンのATが気に入らない人には、WinATというGUIバージョンがあります。WinATはWindows NTリソースキットに入っています。 (訳注:窓の杜やベクタ等に国産品もあります。) ジョブを起動させるには"Schedule"サービスを開始しておかなければなりません。
ATやWinATを実行している時、"System"が持っているパーミッション以外のパーミッションや特別な権限を必要とするプログラムやスクリプトがスケジューリングされていると問題が生じるので注意してください(たとえば、コンピュータやNTドメインにまたがって動くもの)。 これは、NTが、ネットワーク権限を持ったユーザとして"Schedule"サービスなどのプリインストール済みNTサービスを実行するのを認めていないからです。 ネットワーク権限を持ったユーザとしてログインするようスケジューラをセットできるように思えますが、サービスはユーザの権限やパーミッションを認識しませんし、SystemのユーザIDはローカルのパーミッションしか持っていません。
cronに類似したPerlのソリューションは、 http://www.megadodo.demon.co.uk/perl/ にあります。これは、お馴染みのUNIX竜のcrontabファイルを使っています。 このスクリプトはNTサービスとして実行することができます ( PerlスクリプトをNTサービスとして設定するにはどうすればよいのでしょうか? 参照)。 自分自身のNTサービスを作成しようとすると、NTはユーザIDとパスワードのペアを要求してきます。サービスはそのユーザIDの権限とパーミッションを認識します。 こうして、スケジュールされるプログラムやスクリプトが必要な権限を持つようになるのです。
数は少ないですが、商用版のcron風スケジューラもあります。 ifdef softwareのNTcrondは、 http://www.ifdef.com/で入手できます。 AutoTask2000は、 http://www.cypressnet.com/ で入手可能です。 これらのプログラムは、スケジューリングされたプログラムやスクリプトに必要な権限を与えるためにサービスにセットしたユーザIDの権限や特権を認識するはずです。
Windows 95には、Microsoft Plus!パックに入っているシステムエージェントがあります。 また、有名なLaunchPad や Metz Scheduler などのシェアウェアのスケジューリングユーティリティもいくつか出ています。 これらは、 http://www.shareware.com/などのシェアウェア検索エンジンで見つけることができるでしょう。 また、IE4.01 や Windows 98 にはオプションの「タスクスケジューラ」コンポーネントがあります。
Windows NTでは、スケジューリングされたジョブはサービス(Windows NTサービスとは何ですか?参照)として実行されるので、ファイルや環境変数がスクリプトで使用できるようになっているか念入りに確認する必要があります。
また、Perl内部のsleep関数を使っても、簡単なスケジューリングが可能です。 例)
$seconds = 180;
sub action;
while(1) {
&action;
sleep($seconds);
}
Win32プラットフォーム(でディストリビュートされているもの)に似たような機能がないか、 Windows NT/2000や Windows 95/98のヘルプファイルに目を通してみましょう。 ない場合は、以下のURLを覗いてみてください。:
GNU-Win32 - 数多くのGNUツールと完全な開発環境のWin32ポート http://www.cygnus.com/misc/gnu-win32/
Virtually Un*x! - さまざまなUNIXプログラムのWin32ポート。 http://www.itribe.net/virtunix
また、Windows NTリソースキットにはUNIX風のツールがいくつか入っています。 他にも、Mortice Kerns Systems, Inc.: http://www.mks.com/ のMKS ToolkitやSoftway Systems: http://www.interix.com/のInterix (以前はOpenNTとして知られていたの製品)など、UNIX-to-Win32商用パッケージがいくつか出ています。
UNIXリコンストラクションプロジェクトの下で開発されたPerl Power Toolsもチェックするとよいでしょう。 ここにはすべてのPerlに再実装されつつあるUNIXツールがあります。 最新版については、 http://language.perl.com/ppt/ を参照してください。
Windows NTサービスとは、 バックグラウンドで動作する特殊な 実行プログラムのことです。サービスはネットワークプロトコルや データベースサーバーなど常に動いているプログラムに 用いられます。Windows NT上のWWWサーバーのほとんどはサービスとして組み込まれています。
サービスは幾つかの点で他のプログラムとは異なっています。:
サーバの開始や停止にはNET START や NET STOPコマンドが使われますが、サービスは対話的には動作しません。
サービスを
開始したり、解除したり、停止したりするには、サービスコントロールパネルを使います。
サービスはログインユーザの権限を持たずに動きます。つまり、サービスはユーザの環境変数を参照したり、ログインユーザのみの読み取り権限が設定されているファイルを読んだりすることはできないということです。
サービスはマシンに誰もログインしていない時でも実行されます。
サービスパネルでサービスが使うアカウントを設定することができます。 サービスからリソースが使えるようにするためには 特別な手順を踏まなければならないということを頭に叩き込んでおいてください。 一般的には、ファイルは Everyone グループでも使えるようにする必要がありますし、(PATHのような)環境変数はシステム環境変数とする必要があります。
srvany.exeというプログラムを使うとPerlスクリプトをWindows NTサービスとして実行することができます。 srvany.exeは、Windows NTリソースキットに入っています。 srvany.exeをインストールしたら、添付されているsrvany.wriファイルに目を通します。 このドキュメントには、新しいサービスをレジストリに登録するための手順が記載されています。
設定後、スクリプトをサービスとして実行するには次のようにします。:
x:>srvany perl script.pl
Win32プラットフォームでのファイルのパーミッション設定メカニズムはUNIXのもととは異なっています。 FATパーティションにあるファイル(すなわちWindows95のすべてのファイル)では、そのファイルに対して特にパーミッションを設定する必要はありません。すべてのファイルは全ユーザーから使用可能になっています。
Windows NTのNTFSパーティション上にあるファイルでは、 エクスプローラやファイルのプロパティシートを使ってファイルのアクセス権を設定することができます。エクスプローラーでファイルを右クリックして、ドロップダウンメニューのプロパティを選択します。 ファイルのパーミッションを設定するには、 セキュリティタブを選択してから、アクセス権ボタンをクリックします。詳しくはHelpをクリックしてください。 ●●●●●●●●●
CACLSというコマンドラインプログラムもファイルのパーミッションを変更します。 詳しくはコマンドラインで HELP CACLSと入力してください。
Novellを使って管理されているWindows 95/98機は、NTに似たアカウントやパーミッションを持つことができます。 しかし、そのパーミッションはNovell管理者が設定しなければなりません。
Windowsシステムでは、関連付けとはどのプログラムがどの種類のファイルで使用されるかを指定するプロセスのことをいいます。 ファイルは、JPEGファイルやPerlスクリプトなどのファイルタイプに分類されます。このファイルタイプは、ファイル名の拡張子(ファイル名の一番後にある"."以降の文字すべて)で識別されます。
たとえば、テキストファイルと呼んでいるファイルタイプは、拡張子が.txtでメモ帳プログラムによって処理されるようになっています。
一般的に、Perl for Win32プログラマーは(Perl Scriptのような)ファイルタイプを作成し、それを.plという拡張子に関連付けます。 そして、ファイルタイプに対応するものとして、perlインタープリタ・バイナリperl.exeを指定します。スクリプトとperl.exeの関連付けを行っていないとスクリプトが実行されない Webサーバーもいくつかあります。
Windows 95や Windows NT 4.0で新しいファイルタイプを作成し、さらにそれとperlインタープリタを関連付けるにあは次のようにします。 :
デスクトップにあるマイコンピューターを開きます。 マイコンピューターの画面が現れるはずです。 Open the My Computer icon on the Desktop. The My Computer window should appear.
マイコンピューター画面の表示メニューから、オプションを選択 します。すると、オプションダイアログが現れます。
オプションダイアログボックスで、ファイルタイプタブを選択します。
追加ボタンをクリックします。新しいファイルタイプの追加ダイアログが 現れます。
タイプの説明欄に"Perl Script"と入力します。
関連付けられた拡張子欄に".pl"と入力します。
内容の種類(MIME)はブランクのままにしておきます。
アクション欄の下の追加ボタンをクリックします。 新しいアクションダイアログボックスが現れます。
アクション欄に``Open''と入力します。(アクション用にこの名を使うことが重要です!)
アクションを実行するアプリケーション欄に [full path to perl]\perl.exe %1 %* と入力します。ここで、 [full path to perl] は自機のperl.exeまでのフルパスです。 perlがパス上にあれば単純にperl.exeと入力することもできますが、難解な理由により、ここはフルパスを入力したほうが無難です。また、インタープリタまでのパス中に(C:\Program Files\perl5)のように空白が含まれている場合には、代わりに(C:\progra~1\perl5 のような)DOSパスを入力します。
OKボタンをクリックして新しいアクションダイアログボックスを閉じます。
OKボタンをクリックして新しいファイルタイプの追加ダイアログを閉じます。
OKボタンをクリックしてオプションダイアログボックスを閉じます。
関連付けを確認するには、エクスプローラからperlスクリプトをダブルクリックします。perl.exeが起動して、スクリプトが 実行されれば万事OKです。
Windwos NT 4.0では、こういったややこしい手順を踏む必要はなく、 コマンドラインで次のようにタイプするだけでOKです。:
ASSOC .pl=PerlScript
FTYPE PerlScript=[full path to perl]\perl.exe %1 %*
これらのコマンドに関する詳しい情報は、コマンドプロンプトで HELP FTYPEと入力してください。
但し、これらが動作するには、コマンドエクステンションが有効になっていなければなりません。(デフォルトは有効です。オフにしたかどうかは自分でわかるはずです。)
動きます。それは、(COMMAND.COM、CMD.EXE、4DOSなどの)いくつかのコマンドシェルがコマンドの引数を囲むシングルクォートを受け付けないことによるものです。
perlで一筆書きを行う最も安全な方法は、パラメータ全体を""(ダブルクォート)で囲み、パラメータ内では q() と qq() を使う方法です。
q()やqq()は、それぞれシングルクォート、ダブルクォートで囲むのと同じ効果があります。
例)
perl -e "use LWP::Simple; while(@c = head <>) { $c = join qq(\n\t), @c; print qq(Header info:\n\t$c\n); }"
(これは全部で1行のものです。)
上記をコマンドラインから実行して、
http://www.perl.com/のような適当なWebサイトのURLを入力してみてください。
詳細は、コマンドラインで perlwin32とperlrun PODページを参照してください。(訳注:perldoc perlwin32 等)
Windowsには、Perlを変数するのに十分なエディタ、メモ帳とワードパッドが付属しています。 しかし、楽に編集できる機能が必要な向きには、次のフリー及び商用のエディタがあります。:
この FAQ は、元々Evangelo Prodromou evangelo@endcontsw.comが作成し、保守していたものです。 現在、この文書は、O'Reilly社のBrian Jepson、ActiveState社のDavid GroveとDavid Dmytryshyn、そして Kevin Meltzer と Eric Smithが改訂・更新しています。
このFAQはパブリックドメインですが、使用する場合はオリジナルの作者について明示してください。
| Win32 FAQ |