分散開発しにくいアクセスで共通モジュールをまとめとくのに参照設定使えば便利だと思ったのだが、テスト環境と本番環境で参照先のパスが異なるときに付け替えるのがめんどくさいので書いた。 引数にはmdb, adpのファイルを渡す。すると、そのファイルが参照している参照設定を調べて、mdbを参照しているものがあれば、それを同一ディレクトリ中のその名前のものに参照設定を付け替える。
/* * MDB, ADPのアクセスファイルへの参照設定を付け替える。 * 参照設定に拡張子が.mdb、adp、.mdaの参照先がある場合に、 * 引数で渡されたアクセスファイルと同一のディレクトリ中 * にあるものとして、その参照設定を付け替える。 */ var fso = new ActiveXObject("Scripting.FileSystemObject"); var app = new ActiveXObject("Access.Application"); var args = WScript.Arguments; app.Visible = false; for (var i = 0; i<args.length; i++) { rereference(args.item(i)); } app.Quit(); app = null; try { WScript.echo("done. hit any key..."); WScript.StdIn.ReadLine(); } catch (e) {} WScript.Quit(); function rereference (file) { var file = fso.GetAbsolutePathName(file); WScript.echo(file); WScript.echo("==================================================="); try { app.OpenCurrentDatabase(file); app.Visible = false; } catch (e) { WScript.echo(e.description + "\n"); return; } for (var i = 1; i <= app.References.Count; i++) { var ref = app.References.Item(i); if (ref.BuiltIn == false && ref.Kind == 1) { var refpath = ref.FullPath; var filename = fso.GetFileName(refpath); var parentpath = fso.GetParentFolderName(file); var newpath = fso.BuildPath(parentpath, filename); if (newpath != refpath) { try { app.References.Remove(ref); var newref = app.References.AddFromFile(newpath); } catch (e) { WScript.echo(e.description); break; } WScript.echo(newpath); } else { WScript.echo(ref.FullPath); } } else { WScript.echo(ref.FullPath); } } app.CloseCurrentDatabase(); WScript.echo(); }