1. ホーム
  2. スクリプト・コラム
  3. hta

HTAからの申請開始

2022-01-25 21:54:21
HTAからアプリケーションを起動するにはどうすればよいですか?
質問です。
スクリプトのエキスパートたちよ、こんにちは。HTAの場合、Wscript.Shellコマンドに代わるものはないのでしょうか?アプリケーションを実行し、開くファイルを指定する必要があります。
-- DL
回答
DLさん、こんにちは。はい、HTAで使用できる、Wscript.Shellコマンドの代わりになるようなコマンドは知っていますので、これから紹介します。しかし、その前に、実際にはHTAでWscript.Shellオブジェクトを使うことができることを記しておきます。これはよくある混乱の原因です。HTA で特定のコマンド(Wscript.Echo や Wscript.Sleep など)を使用できないため、HTA では WSH コマンドを一切使用できないものと思い込んでしまうのです。
話を続ける前に、もう一つ質問です。なぜ、Wscriptが使えないのか。Wscriptオブジェクトは、Windows Script Host(すなわちWscript.exeまたはCscript.exe)を実行したときにのみ、自動的に作成されます。このため、以下のスクリプトは絶対に有効です。
コピーコード コードは以下の通りです。

Wscript.Echo "Hey."

なお、Wscriptオブジェクトは作成していません。Windows Script Hostを呼び出したときに、自動的に作成されました。
しかし、これはWscriptオブジェクトに限った話です。他にもShellオブジェクトなど、作成できるWSHオブジェクトはあります。例えば、Wscript.Shell オブジェクトを作成して Notepad.exe を実行する(その過程で C:\ScriptsTetsu.txt というファイルを開く)簡単な HTA を以下に示します。
コピーコード コードは以下の通りです。

<html>
<head>
<script language="VBScript">
Sub RunProgram
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "notepad.exe c:\scripts\test.txt"
End Sub
</script>
</head>
<body>
<button onclick="RunProgram">Run Program</button> <p>
</body>
</html>

見ての通り、これは最もシンプルなHTAです。クリックされるとRunProgramというサブルーチンを実行するボタン1つで構成されています。RunProgramのコードを見てみましょう。
コピーコード コードは以下の通りです。

Sub RunProgram
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "notepad.exe c:\scripts\test.txt"
End Sub

Wscript.Shellオブジェクトのインスタンスを作成し、Runメソッドを呼び出すだけです。実行ファイル名(notepad.exe)の後に、開きたいファイルへのパスを渡します。これだけです。
ちなみに、このスクリプトはHTAで実行する限り、問題はありません。HTMLファイル(拡張子が.htmのファイル)で実行しようとすると、ActiveXコントロールがページ上で実行されようとしていることを警告するメッセージボックスが表示されます。サブルーチンがShellオブジェクトを作成し、その後それを実行するためには、この時点で「Yes」をクリックする必要があります。これは、WSHオブジェクトがスクリプティングにとって"unsafeとみなされるためです"。
注:ええ、スクリプトオブジェクトがスクリプトに対して安全でないと見なされるのは少し変に聞こえますね。しかし、それはInternet ExplorerがWSHとは異なるスクリプティングホストと異なるセキュリティモデルを使用しているからです。幸いなことに、HTAはInternet Explorerとは異なるセキュリティモデルを使用しているので、HTA内でシェルオブジェクトを作成する際にこの問題に遭遇することはないでしょう。
では、その代替コマンドを使用した場合はどうでしょうか?まあ、何らかの理由でWscript.Shellオブジェクトを使いたくない場合は、代わりにWindows Shellオブジェクトを使えばいいわけです。以下の HTA でもメモ帳を起動し、C: \ScriptsTest.txt というファイルを開くことができます。
コピーコード コードは以下の通りです。

<html>
<head>
<script language="VBScript">
Sub RunProgram
Const NORMAL_WINDOW = 1
Set objShell = CreateObject("Shell.Application")
ShellExecute "notepad.exe", "c:\scripts\test.txt", , , NORMAL_WINDOW
End Sub
</script>
</head>
<body>
<button onclick="RunProgram">Run Program</button> <p>
</body>
</html>

正直なところ、Wscript よりも Windows Shell オブジェクトを使用することに、特に利点はないと思われます。しかし、Windows Shell をいじくり回したい場合は、ShellExecute メソッドのドキュメントをチェックしてみてください。重要なことは、HTAからアプリケーションを起動する場合、どちらの方法も使えるということです。