PARでPerlスクリプトをexe化 @ ActivePerl 5.10.1 build 1007

久々に環境を作り直したら、PARの導入が恐ろしく簡単になってた。

まずは、PAR::Packerのインストールの前に、必要モジュールをPPMでインストールしておく1。必要なのは以下の6つだ。

  • Module::ScanDeps
  • Win32::Exe
  • Parse::Binary
  • Getopt::Argvfile
  • PAR
  • PAR::Dist

cpanコマンドでPAR::Packerをインストール

以前はここからが厄介だった。別のリポジトリからインストールしようとしてバージョン違いに泣いたり、以下のリンクなどを参考にしてMinGWやnmakeと格闘したりした。

BdP – PPM Repository
http://www.bribes.org/perl/ppmdir.html

Vista/XPのActivePerl 5.10.0でPAR::Packerをビルド ハードなソフトの話/ウェブリブログ
http://hardsoft.at.webry.info/200801/article_4.html

ところが今や、やることはこれだけである2

C:\>cpan -fi PAR::Packer

これだけでcpanコマンドが勝手にMinGWをダウンロードしてきてPAR::Packerのコンパイル&インストールをやってくれる。

Continue reading

【Perl, Windows】WMIに接続する(応用編)

前回はWMIへの接続の基本を書いた。

$wmi  = Win32::OLE->GetObject( "winmgmts:/root/CIMV2" );
$items = $wmi->ExecQuery( $sql );

しかし、この構文ではローカルのPC、しかも現在のユーザー資格情報で接続しようとする。別の資格情報を使ったり、他のPCの情報が欲しいときは次の構文を使う。

$locator = Win32::OLE->CreateObject( "WbemScripting.SWbemLocator" )
$wmi = $locator->connectserver( "サーバー名", "root/CIMV2", "ユーザー名", "パスワード" );

前回の例(デスクトップの壁紙のファイル名を得るスクリプト)を書き直してみよう。

Continue reading

Exchange Serverでメールボックスをエクスポートする

Exchange Serverで管理しているメールボックスをバックアップしたり別のアカウントにリストアするときは次のユーティリティを使う。

Download details: Microsoft Exchange Server Mailbox Merge Wizard (ExMerge)
http://www.microsoft.com/downloads/details.aspx?familyid=429163ec-dcdf-47dc-96da-1c12d67327d5&displaylang=en

ここから「Exmerge.exe」をダウンロードして実行するとExmergeというフォルダにプログラムが解凍される。

フォルダの中のExmerge.exeをダブルクリックするとプログラムが起動!……するはずだが、そのままではダメだ。

exmerge1.png

exchmem.dllというファイルが足りないらしい。このファイルはC:\Program Files\Exchsrvr\binにある。これをExmergeフォルダにコピーした後、もう一度Exmerge.exeをダブルクリックする。

exmerge2.png

後は基本的に「次へ」のボタンをクリックしていくだけなので迷うことはないだろう。途中には、

  • Exchange Serverのホスト名
  • メールボックスをエクスポートしたいアカウント
  • エクスポートしたファイルを保存するフォルダ

を指定する画面がある。予め用意しておこう。

エクスポートが成功すると、指定したフォルダに.pstファイルが作成されている。これをインポートしたいPCにコピーし、Outlookでインポート操作を行う。このやり方は詳しく書いてあるサイトが多数あるので改めてここに載せるまでもないだろう。

ファイルをインポートする – Outlook – Microsoft Office Online
http://office.microsoft.com/ja-jp/outlook/HP030737381041.aspx

注意点としては、予めインポート先のフォルダを作成(「ファイル」メニュー→「新規作成」→「フォルダ」)しておくことである。そうでないと中身がごちゃ混ぜになって非常に困る(困った)。

【Perl, Windows】WMIに接続する(基本編)

前回のネタについて細かく見て行こう。

そもそもWMIとは何か。

Windows Management Instrumentation – Wikipedia
http://ja.wikipedia.org/wiki/WMI

Windows Management Instrumentation(WMI)は、Windows Driver Modelへの拡張の一種で、システムの構成要素について情報収集と通知を行うオペレーティングシステムのインタフェースを提供する。

これだけではなんだかよくわからないが、要するに、OSから得られる様々な情報に対する統括的なインターフェイスだ。Windowsの状態について知りたいならばこれで全て賄えるのである。

PerlからこのWMIへのアクセスにはWin32::OLEモジュールを使う。基本的な構文はこうだ。

$wmi = Win32::OLE->GetObject( "winmgmts:/root/CIMV2" );
$items = $wmi->ExecQuery( $sql );

$sqlにはSQL(みたいな)構文が入る。例として、デスクトップに使っている壁紙のファイル名を得るプログラムを書いてみよう。

Continue reading

【Perl, Windows】使っているコーデックの一覧を得る

WMIを使ってコーデックの一覧を得るスクリプト。かなり煩雑で独自表記っぽくなってるけど、これもMooseの勉強の一環ってことで。コマンドプロンプトからperl codec.plとすると次のような結果が得られる。

C:\> perl codec.pl
No.1
Manufacturer: Microsoft Corporation
Name: C:\Windows\system32\MSRLE32.DLL
Path: \windows\system32\
Version: 6.1.7600.16490
Caption: c:\windows\system32\msrle32.dll
Drive: c:
Extension: dll
FileType: Application Extension
Group: Video
CreationDate: 2010/02/11 16:41:07
InstallDate: 2010/02/11 16:41:07
LastModified: 2009/12/19 18:47:46

No.2
Manufacturer: None
Name: C:\Windows\system32\FF_ACM.ACM
Path: \windows\system32\

    〜以下省略〜

表示する情報を制限したり、管理者権限のあるユーザー名とパスワードがわかれば、他のPCにアクセスしてリストを取り出すこともできる。

C:\> perl codec.pl --server コンピューター名 --user ユーザー名 --password パスワード --prop Name --prop Manufacturer
No.1
Name: C:\Windows\system32\MSRLE32.DLL
Manufacturer: Microsoft Corporation

No.2
Name: C:\Windows\system32\FF_VFW.DLL
Manufacturer: None

No.3
Name: C:\Windows\system32\FRAPSV64.DLL
Manufacturer: Beepa P/L

    〜以下省略〜

使っているテクニックについては、日を改めて説明しよう。(一度に書いたらネタが無くなるしね!)

Continue reading

【Perl,Windows】コマンドプロンプトで色付き文字を使う

l_3e0774cbecb97d5f081d3f535740e885_orig_3576.png

Unix系OSのコンソールと比べると途方もなく貧弱に見えるWindowsのコマンドプロンプトだが、文字に色を付ける機能くらいはちゃんとある。これを、Unix系OSで書き慣れた書式のまま使えるWin32::Console::ANSIというモジュールがお気に入りだ。

Win32::Console::ANSI – search.cpan.org
http://search.cpan.org/~jlmorel/Win32-Console-ANSI-1.04/lib/Win32/Console/ANSI.pm

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use Perl6::Say;
use Win32::Console::ANSI;
binmode STDOUT => ":raw :encoding(cp932)";
say "\e[1;32mこれは明るい緑です";
say "\e[41m背景を赤にしました";
say "\e[4m強調してみました";
say "\e[7m反転してみました";
say "\e[m元に戻りました";

別のモジュールと組み合わせることで、もう少しわかりやすい表記にもできる。

Term::ANSIColor – search.cpan.org
http://search.cpan.org/~rra/ANSIColor-3.00/ANSIColor.pm

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use Perl6::Say;
use Win32::Console::ANSI;
use Term::ANSIColor qw! :constants !;
binmode STDOUT => ":raw :encoding(cp932)";
say BOLD GREEN "これは明るい緑です";
say ON_RED "背景を赤にしました";
say UNDERSCORE "強調してみました";
say REVERSE "反転してみました";
say RESET "元に戻りました";

もっとも、このモジュール(Win32::Console::ANSI)は単なる色付き文字のためのモジュールではなく、ANSIコンソールをエミュレートするものだ。カーソル移動を可能にして画面の好きな場所に文字を出力できたりするらしいが、そこまでは試さなかった。

色の付け方も含めて、Unix系OSの解説がそのまま役に立つだろう。

Bash Prompt HOWTO: ANSI エスケープシーケンス: 色とカーソル操作
http://www.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-5.html

バッチファイルでPerlスクリプトを書く

Perlスクリプトによる実行ファイルを作るとき、Unix系OSでは拡張子が付けないことが多いのだが、Windowsでそれと同じことをやろうとしてもうまくいかない。Windowsではファイルの拡張子によってファイルタイプを判別するようになっているからだ。

Windowsで拡張子のないコマンド(勿論、バッチコマンドとかぶるコマンド名ではいけない)を実行しようとするとどうなるかというと、強制的に「.exe」「.com」「.bat」のどれかが補われる。Perlスクリプトの拡張子「.pl」のままじゃダメってことだ。

じゃあ拡張子「.bat」の中にPerlスクリプトを無理矢理埋め込めばいいんじゃないか?となるわけだ。

以下のファイルを「test.bat」という名前で保存して実行してみると……

#!/usr/bin/perl
use strict;
use warnings;
use Perl6::Say;
say "Hello World!";

Continue reading