質問: function echo(text) { WScript.Echo(text); }; ``` ### 試したこと WScript.ScriptFullName で取得できるのはWSFファイルのパスであり、**各スクリプトファイルのパスを取得する方法がわかりません**。 上の例でいうと、test.jsのパスがわかれば、echo.jsへの相対パスを絶対パスに変換したり、カレントを変更してしまうといったことで対応できます。 Node.jsでいうところの **__dirname** が分かれば早いのですが・・・。
回答: 私も同じ気持ちを持っていたことがあるのですが結構苦労して、実行していました。が、最近その方向性を諦めました。 モジュール合算にはwebpack/rollup/parcel/browserifyなどのモジュールバンドラーのようなものを用いた方がいいと思います。nodeはモジュラーを自前でもっていますが、やや古いブラウザは持っていないのでそのためのwebpack等です、それのwsh版としてそれらが使えるか、あるいは自前で作るのがよいかもです。 私の作成しているライブラリ Parts.js ではver5系までwsh対応していました。denoに対応するためにver6以降はwsh対応を諦めました。babelの吐くソースがどうやってもwshで動かずだったです。 これはbabel&webpackで1ファイルにまとめてから利用するライブラリです。 webpack出力したコードがes3(wsh相当)に対応しないために、polyfillしないといけなかったりして、やっかいですがなんとか動かしていました。rollupとか、percelがもっとよいかもしれません。試せてません。 また、それ以前のstsLib.js というライブラリも作っていました。こちらはbabel関係なくrequireの偽装化してモジュール化しています。このあたり見てみてください。 nodeやbrowserifyともソースコード共用しています。 wsh用のrequireでは、パス読み出しはせずに命名でグローバルオブジェクトにexportの内容を登録しています。 で、結局ファイルを合算するためにライブラリ利用側のコードを修正することになるので、一応仕組みは実現したのですが、あまりファイルごとでのモジュール分割はできませんでした。なので、stslib_core.js ってところにやたらコードが集中しています。 質問で頂いているパスの問題は解決できず、requireとして相対パスでファイルを読み込もうとしても、jsのエンジン(cscript.exeとかかな)が今動いているjsソースがどのパスにあるのかを検知する方法がないので、文字列登録でグローバルオブジェクトに登録して、requireで呼び出す仕組みです。 現代的なJSコードにはES最新化するためのBabel(あるいはTypeScript)は欲しくなるので、結局ビルド環境は必要になりますし、denoや、babel/webpack ではすでにimport&exportの時代になりつつ、こいつらはJS構文でどうしようもない感じもあるので最初に記載したように、トランスパイラ、モジュールバンドラーで環境を構築しての実装をおすすめします。 あるいは node に移行したほうが絶対幸せ感があるとも思います。 似たような別件ですが、下記のような質問をして回答もらったこともあります。WSHでがんばろう的なエンジニアは日本に何人いるんだろうと感じます。応援します。 javascript - @babel/polyfill が非推奨なので core-js に移行しようとしたが WSH 環境でうまく動かない - スタック・オーバーフロー