2023年12月18日

オブジェクトの種類カレントディレクトリの変更
HTA自体変更できない
new ActiveXObject("Scripting.FileSystemObject"); で作ったオブジェクト変更できない
new ActiveXObject("WScript.Shell"); で作ったオブジェクト変更できる

頭がこんがらがったので自分用にまとめる。

HTA自体のオブジェクトと
new ActiveXObject("Scripting.FileSystemObject"); で作ったオブジェクトと
new ActiveXObject("WScript.Shell"); で作ったオブジェクト。
これらは独立して管理される。

そして new ActiveXObject("WScript.Shell"); で作ったオブジェクトは、カレントを変更することができる。

そのため、
HTA自体のカレント : C:\hta
new ActiveXObject("Scripting.FileSystemObject"); で作ったオブジェクトのカレント : C:\hta(htaと同じ)
new ActiveXObject("WScript.Shell"); で作ったオブジェクトのカレント : C:\shell
という分散も可能だと思われる(意味あるのか?)

てっきりWScript.Shellで作ったオブジェクトのCurrentDirectoryを設定すれば全て変更されるのかと思ってた・・・
そのためScripting.FileSystemObjectで作ったオブジェクトやHTMLのコードで不具合を生じてしまった。

さらにひょっとすると、またもう一つWScript.Shellのオブジェクトを作れば、別々のカレントとして動かせるか。
ひょっとしたらそれは使い道がそれなりにありそうな気も。
(たとえば別々のフォルダでWScript.Shellのオブジェクトを使うコードを使いまわせるとか。まぁそれだったらRun関数とかに食わせるファイルパス自体を引数にすればいいだけだが・・・)

以下はChatGPTに質問した時のやり取り。
途中で勘違いされてしまったが、疑問を投げ直したらしっかり解釈してくれた。
You 23:22 Windowsのwscript.exe(WSH/JScript)について質問します。fs = new ActiveXObject("Scripting.FileSystemObject");という風に作ったfsオブジェクトとsh = new ActiveXObject("WScript.Shell");という風に作ったshオブジェクトは、別々のカレントディレクトリとして管理しているのでしょうか?たとえば、このあとにsh.CurrentDirectoryを設定しても、fsオブジェクトのカレントディレクトリに変更はありませんか?
ChatGPT 23:22 Scripting.FileSystemObject(fsオブジェクト)とWScript.Shell(shオブジェクト)は、それぞれ異なるオブジェクトであり、カレントディレクトリを独立して管理します。一方のオブジェクトのカレントディレクトリを変更しても、もう一方のオブジェクトには影響を与えません。 たとえば、以下のようなコードを考えてみましょう: javascript // FileSystemObjectの作成 var fs = new ActiveXObject("Scripting.FileSystemObject"); // WScript.Shellの作成 var sh = new ActiveXObject("WScript.Shell"); // FileSystemObjectのカレントディレクトリを設定 fs.CurrentFolder = "C:\\SomeFolder"; // WScript.Shellのカレントディレクトリを設定 sh.CurrentDirectory = "D:\\AnotherFolder"; // FileSystemObjectのカレントディレクトリを表示 WScript.Echo("FileSystemObjectのカレントディレクトリ: " + fs.CurrentFolder.Path); // WScript.Shellのカレントディレクトリを表示 WScript.Echo("WScript.Shellのカレントディレクトリ: " + sh.CurrentDirectory); この場合、fs.CurrentFolderに設定されたカレントディレクトリはshには影響を与えませんし、逆もまた然りです。それぞれが独立してカレントディレクトリを保持しています。
You 23:29 なるほど、ありがとうございます。その件で追加の質問なのですが、mshta.exe(HTA/JScript)を使った場合には、HTMLコードを解釈するためのwebブラウザとしてのカレントディレクトリが更に存在しますが、そのwebブラウザとしてのカレントディレクトリは変更することは出来ますか? たとえば C:\test\prog.hta というファイルを作成し、中で <img src="data/pic1.jpg"> というHTMLコードを書いたとします。この場合に参照される画像のファイルパスは C:\test\data\pic1.jpg となりますが、カレントディレクトリを、たとえば親ディレクトリに書き換えることで C:\data\pic1.jpg というパスを参照させることが出来るかどうかです。
ChatGPT 23:29 mshta.exeを使用してHTA(HTML Application)を実行する場合、HTA内でのカレントディレクトリはスクリプトが実行されたHTAファイルのディレクトリになります。通常、HTML内の相対パスはこのカレントディレクトリを基準として解釈されます。 HTAファイル内でカレントディレクトリを変更する方法は限られていますが、例外的な方法で可能な場合もあります。以下は、HTA内でカレントディレクトリを変更する一般的な方法ではない方法の例です。ただし、これは非標準的で推奨されない方法であり、環境によっては動作しない可能性があります。 html <!-- C:\test\prog.hta --> <html> <head> <script language="VBScript"> Sub ChangeCurrentDirectory() ' WScript.Shellを作成 Set objShell = CreateObject("WScript.Shell") ' カレントディレクトリを変更(例: C:\data) objShell.CurrentDirectory = "C:\data" ' 実際の処理はここに記述 ' 例: ファイルの読み込みや処理 ' HTAを閉じる window.close End Sub </script> <script type="text/javascript" charset="UTF-8" src="//cache1.value-domain.com/xrea_header.js" async="async"></script> </head> <body onload="ChangeCurrentDirectory()"> </body> </html> この例では、HTAが開かれるとonloadイベントが発生し、ChangeCurrentDirectory関数が呼び出されます。この関数内でWScript.Shellを使用してカレントディレクトリを変更しています。その後、実際の処理(例: ファイルの読み込みや処理)を行います。最後に、HTAを閉じることでプロセスを終了します。 注意: この方法は非標準的で、環境によっては正しく動作しない可能性があります。通常、HTMLやHTA内でのカレントディレクトリの変更は推奨されていません。代わりに、相対パスや絶対パスを適切に使用してファイルにアクセスすることが一般的です。
You 23:37 ありがとうございます。ちょっと半信半疑ですが試してみます。 (なぜ半信半疑なのかというと、前の回答では Scripting.FileSystemObject で生成したオブジェクトと WScript.Shell で生成したオブジェクトが別々に管理されるということだったので、新規に WScript.Shell を作成しても、既存のオブジェクトであるHTAに対しては、カレントが書き換わらないと感じたからです。そのコードのobjShellのカレントを変更しても、HTA側の <img src="data/pic1.jpg"> の指し示す先を C:\test\data\pic1.jpg から C:\data\pic1.jpg に変更することは出来ないと思っています)
ChatGPT 23:37 ご指摘の通りです。前述の方法では HTA ファイル自体のカレントディレクトリを変更することはできません。HTA ファイル内で WScript.Shell を使用しても、それは HTA プロセス自体の WScript.Shell であり、HTA ファイルのカレントディレクトリを変更することはできません。 HTA ファイル内でのカレントディレクトリの変更は通常はサポートされていません。HTA 内のリソースにアクセスする場合、相対パスや絶対パスを使用してファイルにアクセスする方法が推奨されます。 以下に HTA ファイル内で相対パスを使用する例を示します: html <!-- C:\test\prog.hta --> <html> <head> <script language="VBScript"> Sub LoadImage() ' img 要素の src を相対パスで指定 document.getElementById("myImage").src = "data/pic1.jpg" End Sub </script> <script type="text/javascript" charset="UTF-8" src="//cache1.value-domain.com/xrea_header.js" async="async"></script> </head> <body onload="LoadImage()"> <!-- img 要素の id を指定 --> <img id="myImage" /> </body> </html> この例では、onload イベントで LoadImage 関数が呼び出され、その関数内で img 要素の src を相対パスで指定しています。 HTA ファイルのディレクトリを気にせずに、相対パスを使って画像にアクセスできます。
You 23:42 つまりHTA自体のカレントと fs = new ActiveXObject("Scripting.FileSystemObject"); のように作ったfsオブジェクトと sh = new ActiveXObject("WScript.Shell"); のように作ったshオブジェクトは、全て別々のカレントを持っていて、この場合のfsオブジェクトとshオブジェクトのカレントを変更することは可能だが、HTA自体のカレントを変更する手段は無いということですね。確認しておきたかったので助かりました。ありがとうございます。
ChatGPT 23:42 正確です。HTA自体のカレントディレクトリは一般的な手段では変更できません。HTA内で使用する Scripting.FileSystemObject などのオブジェクトや WScript.Shell などのオブジェクトを使っても、HTAプロセスのカレントディレクトリが変更されることはありません。HTAファイル内でのリソースへのアクセスには相対パスや絶対パスを使用するのが通常の方法です。 お役に立てて良かったです。質問がありましたらどうぞお気軽にどうぞ。
You 00:14 Windowsのmshta.exe(HTA/JScript)について質問です。ActiveXObject("Scripting.FileSystemObject"); で作ったオブジェクトのカレントを変更することは出来ますか?
ChatGPT 00:14 mshta.exe を使用して HTA (HTML Application) を実行する場合、HTA 内で JScript を使用して ActiveXObject("Scripting.FileSystemObject") を作成してファイル システム オブジェクトを取得することはできますが、そのオブジェクトのカレント フォルダを直接変更する方法はありません。 ただし、HTA 内でファイル ダイアログを開いてユーザーに新しいフォルダを選択させ、それを基にしてカレント フォルダを変更することができます。以下は、その例です。 html <html> <head> <title>HTA Example</title> <HTA:APPLICATION ID="oHTA" APPLICATIONNAME="HTA Example" BORDER="thin" CAPTION="yes" CONTEXTMENU="yes" SINGLEINSTANCE="yes" SYSMENU="yes" SCROLL="yes" SHOWINTASKBAR="yes" WINDOWSTATE="normal"> <script type="text/javascript" charset="UTF-8" src="//cache1.value-domain.com/xrea_header.js" async="async"></script> </head> <script language="JScript"> var fso = new ActiveXObject("Scripting.FileSystemObject"); function changeCurrentFolder() { var objShell = new ActiveXObject("Shell.Application"); var folder = objShell.BrowseForFolder(0, "Select Folder", 0, 0); if (folder) { var selectedFolder = folder.Self.Path; alert("Selected Folder: " + selectedFolder); // Now you can use selectedFolder as the new current folder // For example, list the files in the selected folder var newFolder = fso.GetFolder(selectedFolder); var files = newFolder.Files; var fileList = "Files in the selected folder:\n"; var e = new Enumerator(files); for (; !e.atEnd(); e.moveNext()) { fileList += e.item().Name + "\n"; } alert(fileList); } else { alert("No folder selected."); } } </script> <body> <input type="button" value="Change Current Folder" onclick="changeCurrentFolder()"> </body> </html> この例では、Shell.Application オブジェクトを使用してフォルダ ダイアログを開き、ユーザーにフォルダを選択させています。選択されたフォルダのパスは変数 selectedFolder に格納され、それを使用して新しいカレント フォルダとして扱うことができます。
You 00:19 そのコードのfsoオブジェクトのカレントを変更することは出来ないという解釈でいいですか?
ChatGPT 00:19 はい、その解釈は正しいです。ActiveXObject("Scripting.FileSystemObject") を使用して得られる fso オブジェクトのカレント フォルダを直接変更する方法はありません。ファイル ダイアログを通じてユーザーにフォルダを選択させ、それを基にして操作を行うことが一般的なアプローチです。 fso は単にファイル システムにアクセスするためのツールであり、カレント フォルダの直接的な変更を提供するメソッドがありません。
You 00:22 それでは fso = new ActiveXObject("Scripting.FileSystemObject"); で生成したばかりのfsoオブジェクトのカレントはどこを指し示すのでしょうか?HTAの場合はHTAと同じフォルダなのでしょうか?wscript.exeの場合も知りたいです。
ChatGPT 00:22 fso オブジェクトを新しく作成した場合、そのオブジェクトのカレント フォルダはスクリプトが実行されるデフォルトのカレント フォルダになります。HTA や wscript.exe でスクリプトを実行する場合、そのデフォルトのカレント フォルダは実行時のカレント ディレクトリに依存します。 HTA の場合、HTA ファイルが存在するディレクトリがデフォルトのカレント フォルダになります。wscript.exe の場合、実行されたスクリプト ファイルが存在するディレクトリがデフォルトのカレント フォルダになります。 例えば、以下のようなディレクトリ構造があるとします: lua C:\ |-- Scripts\ |-- MyScript.hta |-- MyScript.vbs MyScript.hta を HTA として実行すると、C:\Scripts\ がデフォルトのカレント フォルダになります。 MyScript.vbs を wscript.exe で実行すると、同様に C:\Scripts\ がデフォルトのカレント フォルダになります。 したがって、fso オブジェクトが生成された場合、そのカレント フォルダはスクリプトが実行されるデフォルトのカレント フォルダと一致します。

コメント一覧

下に行くほど新しいコメントです

この記事にコメントを投稿した人はまだいません

コメントをどうぞ

名前: