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:42
つまりHTA自体のカレントと fs = new ActiveXObject("Scripting.FileSystemObject"); のように作ったfsオブジェクトと sh = new ActiveXObject("WScript.Shell"); のように作ったshオブジェクトは、全て別々のカレントを持っていて、この場合のfsオブジェクトとshオブジェクトのカレントを変更することは可能だが、HTA自体のカレントを変更する手段は無いということですね。確認しておきたかったので助かりました。ありがとうございます。
You
00:22
それでは fso = new ActiveXObject("Scripting.FileSystemObject"); で生成したばかりのfsoオブジェクトのカレントはどこを指し示すのでしょうか?HTAの場合はHTAと同じフォルダなのでしょうか?wscript.exeの場合も知りたいです。