< July 2010 | August 2010 | September 2010 >

August 25, 2010

ZIP 作成処理を使ってみる。

昨日アップしたZIP 作成処理をコネコネして、毎日ソースをバックアップして、さらにしかるべき宛先にメールで送りつける処理をある程度自動化するようにしてみた。
mailto: でデフォルトのメーラが起動するようにしてるだけで、添付するのは手動。

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
    <job>
        <?job error="True" debug="True" ?>
        <script language="JScript" src="sprintf-0.6.js"/>
        <script language="JScript" src="zipmaker.js"/>
        <script language="JScript"><![CDATA[
            // 外部のクラス
            var fso = new ActiveXObject ("Scripting.FileSystemObject");
            var shell = new ActiveXObject ("WScript.Shell");
            // パス
            var sourcePath = "C:\\project\\src";
            var destPath = "\\\\server\\share\\backup";
            // 本日の日付
            var now = new Date ();
            // ファイル名を作成
            var filename = "src_";
            filename += sprintf ("%04d%02d%02d", now.getFullYear (), now.getMonth () + 1, now.getDate ());
            filename += ".zip";
            var path = fso.BuildPath (destPath, filename);
            // ZIP ファイルを作成
            var zip = zipper.create (path);
            if (zip)
            {
                // ソースをすべて ZIP に含める
                var sourceFolder = fso.GetFolder (sourcePath);
                for (var itr = new Enumerator (sourceFolder.Files); !itr.atEnd (); itr.moveNext ())
                    zip.addItem (itr.item ().Path);
                // バックアップが格納されたフォルダを開く
                shell.run ("explorer /e,/n,\"" + destPath + "\"");
                // メール送信画面を開く
                var link = "mailto:<leader@example.com>";
                link += "?cc=<manager@example.com>&cc=<president@example.com>&bcc=<mine@example.com>";
                link += "&subject=ソース送付%20";
                link += sprintf ("%04d%02d%02d", now.getFullYear (), now.getMonth () + 1, now.getDate ());
                shell.run (link);
            }
        ]]></script>
    </job>
</package>

添付忘れに注意!

August 24, 2010

ZIP 作成処理を試作中。

手慰みに、圧縮フォルダを作成するスクリプトを汎用性を考慮して改修中。

var zipmaker = function  ()
    {
        var _fileSystemObject = new ActiveXObject ('Scripting.FileSystemObject');
        var _shell = new ActiveXObject ('Shell.Application');
        var _wshShell = new ActiveXObject ('WScript.Shell')

        // ZIP ファイル作成
        var _createZipFile = function (path)
            {
                try
                {
                    // 既に存在する場合
                    if (_fileSystemObject.FileExists (path))
                    {
                        if (7 == _wshShell.Popup ("既に存在する書庫 "+ path + " に追加してよろしいですか?", 0, "ZIP ファイル作成", 32 + 4))
                            return null;
                    }
                    else
                    {
                        // 空の ZIP ファイルを作成する
                        var file = _fileSystemObject.CreateTextFile (path, false);
                        file.Write ("PK\5\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
                        file.Close ();
                    }
                    // Shell.Folder オブジェクトを返す
                    return _shell.NameSpace (path);
                }
                catch (e)
                {
                }
                return null;
            };

        // ファイルやフォルダを追加する
        var _addItem = function (zipFolder, zipPath, path)
            {
                // Shell.FolderItem を取得する
                var file = _shell.NameSpace (_fileSystemObject.GetParentFolderName (path)).ParseName (_fileSystemObject.GetFileName (path));
                // コピー
                zipFolder.CopyHere (file);
                // コピーが開始されるようにディレイを設ける
                WScript.Sleep (100);
                while (true)
                {
                    try
                    {
                        // 追記モードで開く
                        _fileSystemObject.OpenTextFile (zipPath, 8, false).Close ();
                        // 開ければコピー完了とみなす
                        return true;
                    }
                    catch (e2)
                    {
                    }
                    WScript.Sleep (10);
                }
            }

        // ZIP オブジェクト作成用のオブジェクトを返す
        return {

            // ZIP オブジェクト作成処理
            create: function (zipPath)
            {
                var path = _fileSystemObject.GetAbsolutePathName (zipPath)
                var _zipFolder = _createZipFile (path);

                if (_zipFolder)
                {
                    return {
                        path: path,
                        addItem: function (filespec)
                        {
                            return _addItem (_zipFolder, zipPath, filespec);
                        }
                    };
                }
                return null;
            }
        };
    } ();
続きを読む...

August 23, 2010

インストールされている .NET Framework のバージョンをチェックするスクリプト - .NET Framework 4.0 対応版

インストールされている .NET Framework のバージョンをチェックするスクリプト を .NET Framework 4.0 に対応してみました。
4.0 は Full と Client Profile の 2 種類があるんですねー。

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="Registry">
<?job error="True" debug="True" ?>
<script language="JScript">
<![CDATA[
var checker = function ()
    {
        var _reader = function ()
            {
                var _shell = new ActiveXObject ("WScript.Shell");
                return { read: function (name) { try { return _shell.RegRead (name); } catch (e) {}; return null; } };
            } ();

        var _checkKey = function (key)
            {
                var install = _reader.read (key + "\\Install");
                if (install == null || "" + install == "0")
                    return null;
                var servicePack = _reader.read (key + "\\SP");
                if (servicePack == null) servicePack = 0;
                return servicePack;
            };

        var _check10 = function ()
            {
                var install = _reader.read ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\Full\\v1.0.3705\\1041\\Microsoft .NET Framework Full v1.0.3705 (1041)\\Install");
                if (install == null || "" + install == "0")
                    return null;

                var version = _reader.read ("HKLM\\SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{78705f0d-e8db-4b2d-8193-982bdda15ecd}\\Version");
                if (version == null)
                    version = _reader.read ("HKLM\\SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\\Version");
                if (version == null)
                    return 0;

                var m = version.match (/^1,0,3705,(\d+)$/);
                var servicePack = 0;
                if (m != null && m.length > 1)
                    servicePack = m [1] - 0;

                return servicePack;
            };

        var _formatResult = function (check, label)
            {
                switch (check)
                {
                case null: return label + ": not installed.\n";
                case 0:    return label + ": installed.\n";
                default:   return label + ": SP" + check + " installed.\n";
                }
            };

        return {
            check10: _check10,
            check11: function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v1.1.4322"); },
            check20: function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727"); },
            check30: function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.0"); },
            check35: function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5"); },
            check40Client: function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Client"); },
            check40Full:   function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full"); },
            check11JP: function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v1.1.4322\\1041"); },
            check20JP: function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727\\1041"); },
            check30JP: function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.0\\1041"); },
            check35JP: function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5\\1041"); },
            check40ClientJP: function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Client\\1041"); },
            check40FullJP:   function () { return _checkKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\1041"); },
            show: function ()
                {
                    WScript.echo (_formatResult (this.check10 (), ".NET Framework 1.0")
                        + _formatResult (this.check11 (), ".NET Framework 1.1")
                        + _formatResult (this.check11JP (), "    Japanese Langage Pack")
                        + _formatResult (this.check20 (), ".NET Framework 2.0")
                        + _formatResult (this.check20JP (), "    Japanese Langage Pack")
                        + _formatResult (this.check30 (), ".NET Framework 3.0")
                        + _formatResult (this.check30JP (), "    Japanese Langage Pack")
                        + _formatResult (this.check35 (), ".NET Framework 3.5")
                        + _formatResult (this.check35JP (), "    Japanese Langage Pack")
                        + _formatResult (this.check40Client (), ".NET Framework 4.0 Client Profile")
                        + _formatResult (this.check40ClientJP (), "    Japanese Langage Pack")
                        + _formatResult (this.check40Full (), ".NET Framework 4.0 Full")
                        + _formatResult (this.check40FullJP (), "    Japanese Langage Pack")
                        );
                }
        };
    } ();
checker.show ();
]]>
</script>
</job>
</package>

August 16, 2010

イコール区切りのファイルを読むタイ付きハッシュ

package EqualSeparated;

sub TIEHASH
{
    my ($class, $file) = @_;
    my @lines = ();

    eval
    {
        open FH, "<$file" or die $!;
        @lines = <FH>;
        close FH;
    };

    bless {
        map {$_->[0] => $_->[1]}
        grep {$_->[0]}
        map {[/^(\w+)\s*=\s*([^\r\n]+)\s*$/]} @lines
    }, $class;
}

sub FETCH { $_[0]->{$_[1]} }
sub EXISTS { exists $_[0]->{$_[1]} }
sub FIRSTKEY { keys %{$_[0]}; each %{$_[0]} }
sub NEXTKEY { each %{$_[0]} }