WSHの最近のブログ記事
概要
任意のフォルダの、サブフォルダのサブフォルダ(サブサブフォルダ?)をリスト化して出力します。ダウンロード
getSubSubFolders.js使い方
スクリプトをc:¥getSubSubFolders.jsなどと保存して、コマンドプロンプトで、
c:¥>cscript getSubSubFolders.js //nologo
と入力すればOK。
実行結果の例
C:¥>cscript getSubSubFolders.js c:¥perl //nologo
cpan build
cpan sources
eg aspSamples
eg cgi
eg fork
eg IEExamples
eg PerlEx
eg Windows Script Components
eg Windows Script Host
html bin
html Components
html faq
・・・
長いので以下略
スクリプトのソースコード
var fso = new ActiveXObject("Scripting.FileSystemObject");
var path = argv(0);
var root = fso.getFolder(path);
var subs = getSubFolders(root);
var subsubs=[];
foreach(subs, function(sub){ subsubs = subsubs.concat(getSubFolders(sub)); });
foreach(subsubs, function($_){ echo($_.ParentFolder.Name + "\t" + $_.Name); });
//サブフォルダ一覧を取得
function getSubFolders(oFolder) {
return collectionToArray(oFolder.SubFolders);
}
//コレクションを配列に変換
function collectionToArray(collection){
var objEnu = new Enumerator(collection);
var array = [];
for (; !objEnu.atEnd(); objEnu.moveNext() ){
array.push(objEnu.item());
}
return array;
}
function echo(str) { WSH.Echo(str); }
function argv(i){
if(WSH.Arguments.length == 0) echo('引数が指定されていません。');
return WSH.Arguments(i);
}
function foreach(array,func){ for(var i in array) func(array[i]); }
以前に書いた記事「[WSH]VBSからAccessのアクションクエリを実行する方法 (ADO) 」では、アクセス側であらかじめ作っておいたアクションクエリをVBSから実行する方法を紹介しました。
VBSからアクションクエリを発行
今回は、VBSから直接SQLを発行してMDBファイルのデータを削除・更新・追加する方法を紹介します。Option Explicit
Dim cn
Dim rs
Set cn= CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:¥ファイル名.mdb;"
rs.Open "DELETE FROM Table1", cn
rs.Open "INSERT INTO Table1 ( ID, Field1 ) " & _
"SELECT Table2.ID, Table2.Field1 FROM Table2;", cn
rs.Open "UPDATE Table1 SET Field1 = 'abc' WHERE Field1 = 'xyz' ", cn
cn.Close
Set rs = Nothing
Set cn = Nothing
MsgBox "完了しますた。"
注意事項
SQL文の中にダブルクォーテーション(")が入っているとうまく動きません。
文字列を表現したい場合はシングルクォーテーション(')で囲みましょう。
また、Access上で動作するSQL文でも、VBSから発行するとエラーになることがあります。
その場合は、標準SQL文に近い形で記述するとたいてい動きます。
WSHで動くJScriptでは、JavaScriptのpromptのような機能がありません。
なので、VBSのInputBoxを呼び出して使います。
以下のコードを拡張子.wsfで保存して実行する。
<job id="foo">
<script language="VBScript">
'InputBoxを出して、ユーザから入力された値を返す関数
function vbinput(msg)
vbinput = InputBox(msg)
end function
</script>
<script language="JavaScript">
//上で定義した関数を呼び出す
var name = vbinput("あなたの名前は?");
WScript.Echo(name);
</script>
</job>
ついにやり方を発見!!
WSHでDBプログラムが書けるなんて夢のようです。
やり方
以下のファイルを作って、同じフォルダに置く。
- MDBファイル
- JSファイル
MDBファイルを用意
ファイル名:db1.mdb
テーブル:Table1
JScriptを作成
ファイル名:ado.js
var cn = new ActiveXObject("ADODB.Connection"); // ADO接続の準備
var ConnectString = "Driver={Microsoft Access Driver (*.mdb)};DBQ=db1.mdb"; // 接続用文字列
cn.Open(ConnectString); // ADO接続をオープン
var rs = cn.Execute("SELECT * FROM Table1"); // SQLを実行し、結果のレコードセットを格納
for(; !rs.Eof; rs.MoveNext() ) { // レコードセットを1レコードずつなめる
WSH.Echo(rs.Fields("ID").Value + " " + rs.Fields("Name").Value); //レコードの中身を表示
}
rs.Close;
cn.Close;
rs = null;
cn = null;
mdbファイルが別フォルダにある場合は、
DBQ=db1.mdb
の代わりに
DBQ=C:¥¥フォルダ名¥¥db1.mdb
とフルパスで書けばOK。
ファイルサーバや別PCの共有フォルダにあるmdbファイルにもアクセスできます。(たぶん)
実行結果
どこかで見つけたスクリプトです。
下記のコードをメモ帳に貼り付けて、eject.jsというファイル名で保存して実行します。
すると、あら不思議~パソコンのCDトレイが開いて閉じます。
何かのスクリプトを実行して、終了したことをユーザに知らせる、という用途に使えそうです。
var wmp = WScript.CreateObject("WMPlayer.OCX");
wmp.cdromcollection.item(1).eject();
wmp.cdromcollection.item(1).eject();