#!perl -w
use Win32::OLE;
use Encode;
use strict;
{
# [1]OLEでFileSystemObjectのオブジェクト取得
my $o_fso = Win32::OLE->new('Scripting.FileSystemObject');
# 例として全角やスペースが混ざったUNCパスを指定
# 先頭の\\はエスケープで\の1文字解釈となるため'\\'を先頭に追加
my $p_unc = '\\'.'\\Server\MusicDb\domestic\サザンオールスターズ\KILLER STREET\disc1';
# [2]指定UNCパスの存在を確認
unless ($o_fso->FolderExists($p_unc)) { die "ERR: $p_unc は見つかりません。\n"; }
print $o_fso->GetAbsolutePathName($p_unc), "\n";
# [3]指定UNCパスのFolderオブジェクト取得
my $o_folder = $o_fso->GetFolder($p_unc);
# [4]FolderオブジェクトからFilesコレクション取得
my $o_files_collection = $o_folder->{Files};
# [5]FilesコレクションからFileオブジェクト取得
print "\t#ext\t#file_name\n";
foreach my $o_file (in $o_files_collection) { # コレクション処理がポイント
# [6]FileオブジェクトのNameプロパティ取得
my $file_name = $o_file->{Name}; # ファイル名
my $ext_name = $o_fso->GetExtensionName($file_name); # 拡張子
print "\t", $ext_name, "\t", $file_name, "\n";
}
# [7]正規表現でファイル選択
# Folderオブジェクトはワイルドカード対応無しのため正規表現で抜き出す
# 正規表現使用時はutf8(Perl内部文字列)へ変換必要
my $match_utf8 = decode('cp932', '.*魔法.*\.mp3$'); # 条件(正規表現)
my $match_o_file;
foreach my $o_file (in $o_files_collection) {
my $file_name = $o_file->{Name}; # ファイル名(cp932)
my $file_name_utf8 = decode('cp932', $file_name); # ファイル名(utf8)
if ($file_name_utf8 =~ /$match_utf8/i) {
print "\tmatched\t", $file_name, "\n"; # 表示はcp932側
$match_o_file = $o_file; # 選択したFileオブジェクト確保
}
}
# [8]選択したファイルをUNCパスからカレントフォルダへコピー
print "\tcopying the file ...\n";
$match_o_file->Copy('.\\', 1); # カレントフォルダの.\は、.\\にする必要あり
}
|