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からアプリケーションを起動する場合、どちらの方法も使えるということです。
質問です。
スクリプトのエキスパートたちよ、こんにちは。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からアプリケーションを起動する場合、どちらの方法も使えるということです。
関連
-
難しいhtaのダウンローダーになる
-
htaのスリープ機能
-
Ubuntu PowerShell詳解(初心者必見チュートリアル)
-
[解決済み] クラスパスリソースで定義された名前 'entityManagerFactory' を持つビーンの作成エラー : initメソッドの呼び出しに失敗しました
-
VBSスクリプトのためのGUIインタフェース HTA簡潔なチュートリアル(Webコレクション)
-
画面中央にHTAを作る方法(Win32_DesktopMonitor)
-
htaで作った楽しい小さなプログラム(デスクトップに固定されています)
-
htaファイル入門(ちょっとしたプログラムを書くのに適している)
-
hta(HTMLアプリケーション)とは
-
グラフィティ効果のためのhtaコード
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
VBS再帰的手法による多階層ディレクトリフォルダ作成方法
-
powershellでSQL SERVERの全バージョンを弄る方法
-
PowershellによるWindowsログのクエリ方法
-
Linuxシェルセレクトメニュー選択実装コード
-
シェルスクリプトでの/dev/nullの使用方法まとめ
-
[解決済み】Python elifの構文が無効です【終了しました
-
cmdでdドライブまたはdドライブ内のフォルダーを入力する
-
Python スクリプトフレームワーク webpy テンプレート割り当て実装
-
Python opencv画像セグメンテーションアルゴリズムの深い理解
-
長さを指定し、ランダムなDNA配列を生成するperlスクリプトコード