WSH  WSH2  掲示板  JavaScript,Neo-Generation  DOM  download  表紙
24. Folder  26. Network
Windows Scripting Host 25
FolderItem

FolderItem オブジェクトはフォルダの中のアイテムを表します。
主にFolderオブジェクトから FolderItemsコレクションを得て、 そこからFolderItemオブジェクトを得ます。
var Shell = WScript.CreateObject("Shell.Application");
var objFolder = Shell.NameSpace("C:\\");    //Folderオブジェクト
var objFolderItems = objFolder.Items();     //FolderItemsコレクション
for(var i = 0; i < objFolderItems.Count; i++)
    var ofitem = objFolderItems.Item(i);    //FolderItemオブジェクト
FolderItemの情報を得る

次の例のようにFolderItemの基本情報を得ることができます。
scripts/flditem1.js
-------------------------------------------------------------
var Shell = WScript.CreateObject("Shell.Application");
var objFolder = Shell.NameSpace(0);         //デスクトップ
var objFolderItems = objFolder.Items();
for(var i = 0; i < objFolderItems.Count; i++) {
    var ofitem = objFolderItems.Item(i);
    WScript.Echo("Name : " + ofitem.Name);  //名前
    WScript.Echo("Path : " + ofitem.Path);  //パス
    WScript.Echo("Size : " + ofitem.Size);  //大きさ
    WScript.Echo("Type : " + ofitem.Type);  //種類
    //更新日時
    WScript.Echo("ModifyDate : " + ofitem.ModifyDate + "\n");
}
フォルダのサイズは常に0のようですね。
ModifyDateプロパティはVBのDate型の値を返すようです。 よって、JScriptでは文字列に変換してから使うしかないのかな? VBScriptではそのまま使えます。
scripts/modifydate.vbs
-----------------------------------------------------
Set Shell = WScript.CreateObject("Shell.Application")
Set objFolder = Shell.NameSpace(0)
Set objFolderItems = objFolder.Items
For Each ofitem In objFolderItems
    WScript.Echo Day(ofitem.ModifyDate)     '日付
Next
次の例のようにIs付きプロパティで FolderItemの性質を判別することができます。
scripts/flditem2.js
-------------------------------------------------------------
var Shell = WScript.CreateObject("Shell.Application");
var objFolder = Shell.NameSpace(0);
var objFolderItems = objFolder.Items();
for(var i = 0; i < objFolderItems.Count; i++) {
    var ofitem = objFolderItems.Item(i);
    if(ofitem.Name == "ごみ箱") {
        WScript.Echo("" + ofitem.IsBrowsable);  //参照できるか
        WScript.Echo("" + ofitem.IsFileSystem); //FileSystemの一部か
        WScript.Echo("" + ofitem.IsFolder);     //フォルダか
        WScript.Echo("" + ofitem.IsLink);       //ショートカットか
    }
}
ちなみにごみ箱では上から順にfalse, false, true, falseです。

ショートカットならGetLinkプロパティで IShellLinkDualオブジェクトを得ることができます。 このTargetプロパティでリンク先の FolderItemオブジェクトを得ます。

scripts/getlink.js
-------------------------------------------------------------
var Shell = WScript.CreateObject("Shell.Application");
var objFolder = Shell.NameSpace(11);        //スタートメニュー
var objFolderItems = objFolder.Items();
for(var i = 0; i < objFolderItems.Count; i++) {
    var ofitem = objFolderItems.Item(i);
    if(ofitem.IsLink) {         //ショートカットなら
        var olink = ofitem.GetLink;
        var otargetitem = olink.Target;
        WScript.Echo(ofitem.Name + " -> " + otargetitem.Path);
    }
}
フォルダならGetFolderプロパティでFolderオブジェクトを得ることができます。
これによって下の階層を全てスキャンすることができます。
scripts/update.js
----------------------------------------------------------------
var Now = (new Date()).getTime();
var Shell = WScript.CreateObject("Shell.Application");
var objFolder = Shell.NameSpace("C:\\");
ScanFolder(objFolder);

function ScanFolder(objFolder) {
    var objFolderItems = objFolder.Items();
    for(var i = 0; i < objFolderItems.Count; i++) {
        var ofitem = objFolderItems.Item(i);
        if(ofitem.IsFolder)
            ScanFolder(ofitem.GetFolder);
        //24時間しか経っていないアイテムを出力する
        if(Now - (new Date(ofitem.ModifyDate)).getTime()
                                        <= 24 * 60 * 60000)
            WScript.Echo(ofitem.ModifyDate + " " + ofitem.Path);
    }
}
上のスクリプトはCドライブの24時間以内に更新されたファイルを列挙します。 これをFileSystemObjectを使ったときと比べてみましょう。
scripts/update2.js
----------------------------------------------------------------
var Now = (new Date()).getTime();
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var f = fs.GetFolder("C:\\");

ScanFolder(f)

function ScanFolder(f) {
    var fc = new Enumerator(f.SubFolders);
    for(; !fc.atEnd(); fc.moveNext()) {
        var ofolder = fc.item();
        ScanFolder(ofolder);
        if(Now - (new Date(ofolder.DateLastModified)).getTime()
                                            <= 24 * 60 * 60000)
            WScript.Echo(ofolder.DateLastModified
                                        + " " + ofolder.Path);
    }
    var fic = new Enumerator(f.Files);
    for(; !fic.atEnd(); fic.moveNext()) {
        var ofile = fic.item();
        if(Now - (new Date(ofile.DateLastModified)).getTime()
                                            <= 24 * 60 * 60000)
            WScript.Echo(ofile.DateLastModified
                                        + " " + ofile.Path);
    }
}
Folderオブジェクトを使ったときのほうが Temporary Internet Filesのスキャンがかなり速いですね。 でもその他は遅いような。

コマンドを発行する

InvokeVerbメソッドで コンテキストメニューのコマンドを発行できます。
objFolderItem.InvokeVerb vVerb
vVerbは後述するコマンドを表す文字列です。
例えば次のようにごみ箱を開きます。
scripts/invokeverb.js
------------------------------------------------------
var oTrash = GetTrash();
oTrash.InvokeVerb("開く(&O)");

function GetTrash() {
    var Shell = WScript.CreateObject("Shell.Application");
    var objFolder = Shell.NameSpace(0);
    var objFolderItems = objFolder.Items();
    for(var i = 0; i < objFolderItems.Count; i++) {
        var ofitem = objFolderItems.Item(i);
        if(ofitem.Name == "ごみ箱")
            return ofitem;
    }
    return null;
}
vVerbは次のように FolderItemVerbオブジェクトの Nameプロパティから得られます。
scripts/verbs.js
-------------------------------------
var oTrash = GetTrash();
var oVerbs = oTrash.Verbs();
for(var i = 0; i < oVerbs.Count; i++)
    WScript.Echo(oVerbs.Item(i).Name);

//以下略
上のスクリプトはごみ箱に対して使えるvVerbを列挙しているのですが、 使えないvVerbもあるようですね。
FolderItemVerbオブジェクトの DoItメソッドを使ってもコマンドを発行できます。
scripts/verbs2.js
---------------------------------------------
var oTrash = GetTrash();
var oVerbs = oTrash.Verbs();
for(var i = 0; i < oVerbs.Count; i++) {
    if(oVerbs.Item(i).Name.charAt(0) == "開")
        oVerbs.Item(i).DoIt();
}

//以下略
FTP

Shellオブジェクトの NameSpaceメソッドに FTPサーバのディレクトリを指定すると、 ローカルのフォルダのように操作できます(9/15/02)。
次のスクリプトは指定したディレクトリ以下の全てのファイルのサイズの合計を 表示します。
scripts/ftp1.js
-------------------------------------------------------
var oShell = WScript.CreateObject("Shell.Application");
var oFolder = oShell.NameSpace(
                "ftp://user:password@sitename/directory/");
var objFolderItems = oFolder.Items();

WScript.Echo(GetFolderSize(oFolder) + "Byte");

function GetFolderSize(objFolder) {     //フォルダのサイズを得る
    var objFolderItems = objFolder.Items();
    var size = 0;
    for(var i = 0; i < objFolderItems.Count; i++) {
        var ofitem = objFolderItems.Item(i);
        if(ofitem.IsFolder)             //フォルダのとき
            size += GetFolderSize(ofitem.GetFolder);
        else                            //ファイルのとき
            size += ofitem.Size;
    }
    return size;
}
次は指定したディレクトリのa.txtというファイルを デスクトップにダウンロードします。
scripts/ftp2.js
-------------------------------------------------------
var oShell = WScript.CreateObject("Shell.Application");
var oFolder = oShell.NameSpace(
                "ftp://user:password@sitename/directory/");
var objFolderItems = oFolder.Items();

var objFolderItems = oFolder.Items();

for(var i = 0; i < objFolderItems.Count; i++) {
    var ofitem = objFolderItems.Item(i);
    if(ofitem.Name == "a.txt") {
        oShell.NameSpace(0).CopyHere(ofitem);
        break;
    }
}
次はデスクトップのa.txtというファイルを 指定したディレクトリにアップロードします。
scripts/ftp3.js
-------------------------------------------------------
var oShell = WScript.CreateObject("Shell.Application");
var oFolder = oShell.NameSpace(
                "ftp://user:password@sitename/directory/");

var desktop = oShell.NameSpace(0);
var objFolderItems = desktop.Items();
for(var i = 0; i < objFolderItems.Count; i++) {
    var ofitem = objFolderItems.Item(i);
    if(ofitem.Name == "a.txt") {
        oFolder.CopyHere(ofitem);
        WScript.Sleep(6000);        //いくらか待つ必要あり
        break;
    }
}
いずれも Shell32.dllによって(?)動かないかもしれません。 あと、最後はオプションを上書きしてもよいかを聞いてきました (Folder参照)。

first, prev, next, noframe, exit
Written 8/26/01