質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

2回答

2392閲覧

HTA(VBS)だと、エクスプローラー再起動に失敗する

Kokko3

総合スコア20

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2021/08/18 07:21

編集2021/08/18 07:32

前提・実現したいこと

HTAで、ボタンを押したときにエクスプローラーを再起動させたいです。
batファイルでは問題なく動くため、その内容をHTAに移行しました。

発生している問題・エラーメッセージ

"start explorer.exe" だと動作せずエラーが出ます。
「指定されたファイルが見つかりません」と出ます。
startをつけただけで、上手く動作しないのは良く分かりません。

また、"explorer.exe"だとエクスプローラーが起動します。
しかし、エクスプローラーが終了して背景が真っ黒になっているのに
前面にエクスプローラーが開くだけで再起動にはなっていません。

batファイルと動作が違うのは困るので、どうにか同じにしたいです。

また、ここには記載していないですが
他にもexeをRunで起動させたり終了させたりしているのですが
上手く行ったりいかなかったりとバラつきます。
WshShell.Run "TASKKILL /F /IM explorer.exe", 1, True
上記と同様に、「1」と記載して完了待ちをしているのですが
それが効いてないようにも思います。
Windows10だと上手くいかないとかあるのでしょうか。
WScriptでSleepも試してみようと思ったのですが
VBSでググッてコピペしたSleepもエラーが出て動作しないため検証できていません。
こちらについても情報があれば欲しいです。

該当のソースコード

bat

1'test.bat 成功例 2TASKKILL /F /IM explorer.exe 3start explorer.exe

VBS

1<!--TEST.htaファイル--> 2<html> 3<head> 4 <title>TEST</title> 5</head> 6<body> 7 <input type="button" value="エクスプローラ終了" onclick="explorerEnd()"><BR><BR> 8 <input type="button" value="エクスプローラ起動" onclick="explorerStart()"><BR><BR> 9 <BR><BR> 10</body> 11 12Sub explorerRestart() 13 Dim WshShell 14 Set WshShell = CreateObject("WScript.Shell") 15 WshShell.Run "TASKKILL /F /IM explorer.exe", 1, True 16 WshShell.Run "explorer.exe", 1, True 17End Sub 18 19 20 21Sub explorerEnd() 22 Dim WshShell 23 Set WshShell = CreateObject("WScript.Shell") 24 WshShell.Run "TASKKILL /F /IM explorer.exe", 1, True 25End Sub 26 27Sub explorerStart() 28 Dim WshShell 29 Set WshShell = CreateObject("WScript.Shell") 30 WshShell.Run "explorer.exe", 1, True 31End Sub

試したこと

batファイルで実行してみた ⇒ 問題なし
htaファイルで実行して見た ⇒ 上手くいかない

補足情報(FW/ツールのバージョンなど)

Windows10

Windows7/10両方で利用できるものにしたいと思ってます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

hta(wsh), bat 共に同一の記述で動作させるだけでしたら
cmd.exe /c set PATH=%PATH% & start explorer.exe
という感じで可能にはなると思います。

ただ、根本的な問題として
TASKKILL /F /IM explorer.exe
を単発で実行してしまうと
後から start explorer.exe を実行しても
デスクトップ画面が描画されないでしょう。

よって、htaの記述を 以下のようにすればどうでしょうか。

VBS

1<html> 2<head> 3 <title>TEST</title> 4 5 <script type="text/vbscript"> 6 Function CreateBat(arg_cmd) 7 Dim output_path 8 output_path = CreateObject("WScript.Shell") _ 9 .ExpandEnvironmentStrings("%TEMP%") _ 10 & "\" _ 11 & "hta-" _ 12 & Replace(Replace(Replace(FormatDateTime(Now, 0) _ 13 , "/", ""), ":", ""), " ", "-") _ 14 & ".bat" 15 With CreateObject("Scripting.FileSystemObject") 16 With .OpenTextFile( output_path, 2, True ) 17 .WriteLine arg_cmd 18 .Close 19 End With 20 End With 21 CreateBat = output_path 22 End Function 23 24 Sub explorerRestart() 25 Dim in_cmd 26 in_cmd = "taskkill /F /IM explorer.exe" _ 27 & vbCrLf _ 28 & "start explorer.exe" 29 Dim bat_path 30 bat_path = CreateBat(in_cmd) 31 32 Dim out_cmd 33 out_cmd = "explorer.exe " & Chr(34) & bat_path & Chr(34) 34 CreateObject("WScript.Shell").Run out_cmd, 0, True 35 CreateObject("Scripting.FileSystemObject").DeleteFile bat_path 36 End Sub 37 38 Sub explorerEnd() 39 MsgBox "taskkillの単発実行はNG", 48, "警告" 40 Exit Sub 41 'CreateObject("WScript.Shell").Run _ 42 ' "taskkill /F /IM explorer.exe", 1, True 43 End Sub 44 45 Sub explorerStart() 46 CreateObject("WScript.Shell").Run _ 47 "cmd.exe /C set PATH=%PATH% & start explorer.exe", 0, False 48 End Sub 49 </script> 50</head> 51 52<body> 53 <input type="button" value="エクスプローラ終了" onclick="explorerEnd()"><BR><BR> 54 <input type="button" value="エクスプローラ起動" onclick="explorerStart()"><BR><BR> 55 <input type="button" value="エクスプローラ更新" onclick="explorerReStart()"><BR><BR> 56 <BR><BR> 57</body> 58</html>

投稿2021/08/18 16:59

mayu-

総合スコア335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kokko3

2021/08/18 23:51

mayu-様 回答ありがとうございます。 コマンドのbatファイルをhtaファイルから作成し、 利用が終わったら削除するような仕組みでしょうか。 問題なく動作したことを確認しました。 他の上手く動かないといっていたものも、 同様にコマンドを使うものが多い為 CreateBatの関数を利用すれば、上手く動作するようになるかもしれません。 ありがとうございました!
Kokko3

2021/08/20 09:58 編集

mayu-様 分かれば教えてほしいのですが、 エクスプローラー単体で終了させるのは 「フォルダリネーム」するのに必要だったからです。 エクスプローラーを何か開いていると、 何故かフォルダをリネームしようとしても、 「アクセスが拒否されました」と出る事が分かりました。 開いているエクスプローラーを閉じる方法があれば良いのですが。 別で質問させて頂きます。
guest

0

生のVBScriptだとうまく行くのに、HTAからの起動だと駄目ですね。
タスクマネージャでうまく行かないexplorer.exeコマンドラインを見ると、なんか引数が付いて起動されています。explorer.exeの時だけ勝手に引数を付けて起動されるのでは?ということで、「explorer.exeを起動するだけのCプログラム」を書いて、そのEXEをHTAのVBSctiptから起動するとうまく行きました。

参考:

GCC

1#include <unistd.h> 2int main(int argc, char **argv, char **envp){ 3 char *a[] = {"C:\Windows\explorer.exe", NULL}; 4 execve("C:\Windows\explorer.exe",a,envp); 5}

HTA

1 WshShell.Run "D:\foo\bar.exe", 1, True

なお、

startをつけただけで、上手く動作しないのは良く分かりません。

startは独立したコマンドじゃなくて、cmd.exeの内部コマンドなので、cmd /c start ~~のように書きます。今回はどっちみち駄目ですが。

投稿2021/08/18 15:00

編集2021/08/18 15:12
otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kokko3

2021/08/18 23:49

otn様 回答ありがとうございます。 HTAとVBS単体とで動作が違う事があるんですね。勉強になります。 TASKKILLは普通に動いているように見えたので start explorer も問題なく動くと思ってました。 専用の書き方があるんですね。ありがとうございます!
otn

2021/08/19 10:34

> 専用の書き方があるんですね。ありがとうございます! とのことですが、 > startは独立したコマンドじゃなくて、cmd.exeの内部コマンドなので の意味はわかっていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問