IEの MenuExtに下記のようなスクリプト(html)を登録し、
右クリックメニューから実行したのですが、setTimeoutで
指定した処理が実行されません。
セットした時間が来る前にスクリプトが完了してしまうため
でしょうか?一定時間後の処理を実現するためのお知恵を、
是非みなさんにお伺いしたいです。
( setTimeout関数の使用不使用にはこだわりません)
<script type="text/JScript">
対象ページの情報を取得し asxファイル"asx"を作成
//"asx"を関連付けされたアプリケーションで開く
var wshell = new ActiveXObject("WScript.Shell");
wshell.Run(asx, 1, false);
// 5秒後 "asx"を削除する
var fso = new ActiveXObject("Scripting.FileSystemObject");
setTimeout("fso.DeleteFile(asx);", 5000);
</script>
※ asxファイルはメディアプレイヤーが相手サーバと通信して
再生リストを作成するためのものです。ファイルを開いてすぐ
削除しようとするとエラーになります(数秒たてば削除可能です)
※wshell.Runの第3引数を Trueにするとメディアプレイヤーを
閉じるまでスクリプトの処理を待機します。目的を達成できそう
ですが、プレイヤーを閉じずに同じスクリプトを実行すると問題が
起きます
No.1
- 回答日時:
メディアプレイヤー等固有の問題だとすると分からないのですが、スクリプトと説明を見て気になった点を書きます。
右クリックから実行したということは、スクリプトは関数内に記述されているのですよね?(サンプルはグローバルエリアになっていますが)
その場合、
setTimeout("fso.DeleteFile(asx);", 5000);
の部分を
setTimeout(function(){fso.DeleteFile(asx);}, 5000);
のようにするともしかしたらうまくいくかもしれません。
前者の場合、asxが関数内で定義されていると動作しないです。(グローバルスコープで実行されるため)
違ってたらすみません。
早速のご回答ありがとうございます。感激です
勉強不足のため、言葉の解釈が曖昧で恐縮ですが、グローバルエリアとは
function{ }で囲まれておらず、命令がどんどん実行される部分のこと
ですよね? サンプルは全てグローバルエリアに記述されております。
functionは使ってません
アドバイスしていただいた記述を元のサンプルと、function main1(){ }
で囲んだものとに適用して実行してみましたが、残念ながら setTimeout
部分だけ実行されませんでした
No.2
- 回答日時:
すみません、「IEの MenuExt」だったのですね。
。。WEBページと勘違いしました。
その場合、setTimeoutはwindowオブジェクトのメソッドなので、WEBページ上でしか使えないのだと思います。代わりに、WSHのSleepメソッドというのが使えないかなと思います。(参考URLを参照してください)
ちょっと今試すことができない状況なので申し訳ないのですが。。。参考になれば幸いです。
参考URL:http://msdn.microsoft.com/library/ja/default.asp …
お忙しい中のご回答に感謝します
おっしゃる通りあくまでIEの MenuExtからスクリプトの記述されたHTMLを
呼んだ場合の問題です。
(単にHTMLのダブルクリックなら setTimeoutは正常に働きます)
WScript.sleep は、この問題の解決に最適のメソッドだと思います
しかし HTMLのスクリプトから WScriptをオブジェクト化する方法が
わかりません。
( scriptタグ内にWScript.sleepをそのまま記述。new ActiveXObject
で呼んでみる。<script="type/WScritp">等の記述もダメでした)
No.3
- 回答日時:
すみません、HTML上でWScriptオブジェクトは使用できないのですね・・・。
そこで、かなり無理やりな方法ですが、HTMLからjsファイルをwscriptで呼び出してみてはどうでしょう。
【test.htm】
<script type="text/JScript">
var wshell = new ActiveXObject("WScript.Shell");
wshell.Run("c:\\test.txt", 1, false);
wshell.Exec("wscript \"c:\\test.js\"");
</script>
【c:\test.js】
var fso = new ActiveXObject("Scripting.FileSystemObject");
WScript.Sleep(5000);
fso.DeleteFile("c:\\test.txt");
以上のスクリプトでc:\test.txtがエディタでオープンされた後、5秒後に消去されることを確認しています。
参考になれば幸いです。
アドバイスをスクリプトに適用させていただいたところ、無事目的の動作を
得ることができました。特に wscript実行を
wshell.Run("c:\\test.js",1 ,true);
にすると test.jsの完了まで HTML側の処理を中断できます
( DelteFile部を HTML側に移すことも可能です)
大変参考になりました。ありがとうございました
今後の理解のため、外部スクリプトファイルを作成せず質問内容を
実現する方法が知りたいです。みなさまよろしくお願いします
susie-t様もよろしければ引き続きお付き合いください
No.4ベストアンサー
- 回答日時:
wscript実行を
wshell.Run("c:\\test.js",1 ,true);
にするのは、jsファイルの関連付けがwscriptであるのが前提なので
ちょっと気になるのですが、個人使用等であれば問題ないですね。
さて、外部スクリプトファイルを使用しない方法ですが、
以下があります。
<script type="text/JScript">
var wshell = new ActiveXObject("WScript.Shell");
wshell.Run("c:\\test.txt", 1, false);
var start = (new Date()).getTime();
while(true){
var current = (new Date()).getTime();
if((current - start) > 5000) break;
}
var fso = new ActiveXObject("Scripting.FileSystemObject");
fso.DeleteFile("c:\\test.txt");
</script>
JavaScriptでwhile(true)の無限ループをタイマーに使うのは
個人的にあまり好きではないため、
この方法は意識の外になってました^^;
(CPUに無駄な負荷がかかりそうで。
また、Firefoxとかだと
ループの回数が多いと
警告が出たりします)
いちおうこれでも動作します。
でも、私のPCではちょっと動作が重くなる気がしてます。
(気のせいかもしれませんが。)
あまりお勧めはしないです・・・。
参考程度に。
この回答への補足
いろいろ試してみました
新しいウィンドウを作りそこでスクリプトを実行すれば
setTimeoutは動作します。ただ、セキュリティーが厳しくなり
FSOなどコンポーネントの呼び出しに問題がありました
モーダルダイアログモードで IEMenuExtを呼ぶと
勝手に閉じないウィンドウが作られるので、setTimeout
が使えます。呼び出しウィンドウの操作ができなくなって
しまうのが弱点ですが、今回のケース(待ち時間が数秒)
ならば問題ないようです
名残惜しいですが、回答を締め切らせていただきます
閲覧してくださった方々、susie=t様
どうもありがとうございました
度々のご回答ありがとうございます
実は以前、 while文を利用した処理待ちを試したことがあるのですが
メディアプレイヤーの処理が進まず、うまくゆきませんでした
しかし、今回 susie-t様に記述していただいたスクリプトは見事に目的の
動作を実現しました。PentiumIII 1.2GHz, CPU使用率90%の PC環境下で
動いたので、現在一般の PCで通用するスクリプトだと思います
大変参考になりました
(処理待ち時間を多く取り過ぎるとIEから警告が出ますが、秒単位ならば
問題無いようです)
質問の方、無限ループを使わない条件を加えて、もうしばらく続けさせて
ください。みなさまよろしくお願い致します
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ローカル環境で動作しないJavaS...
-
禁止文字チェック
-
初心者です。gulpでコンパイル...
-
アンカーにマウスオーバーして...
-
「終了していない文字列型の定...
-
エクセルVBA/ Formatで文字列が...
-
【JavaScript】ソースのコメン...
-
HTAで,親ウインドウを閉じ...
-
Excel VBA カタカナ セル判定...
-
テキストボックスに記入したも...
-
JSPの処理の途中で、JavaScript...
-
エディタ機能のTEXTAREAを作りたい
-
VBScript から JavaScript を呼...
-
テキストファイルの更新日時を取得
-
evtとは
-
jQueryやMootoolsなどのライブ...
-
javascript,CSSでWebpageを作成...
-
JavaScriptで、実行するたび値...
-
Java ScriptのHPがみたい
-
JSでファイル数取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ActiveXObjectについて
-
ブラウザからエクセルを開く方法
-
XMLHttpRequestオブジェクトに...
-
JavaScriptによる....
-
jsでルートディレクトリより上...
-
JavaScriptでテキス...
-
ajax 通信 iisの設定?
-
javascriptでのmdb接続について
-
Ajaxが動きません~『status=0』?
-
外部SVGの参照
-
JavaScriptでファイルの保存
-
ローカル環境で動作しないJavaS...
-
html組込み時のカレントフォル...
-
javascriptによるメール送信
-
<input>で送信するfileのMIMEチ...
-
javascriptでサーバ上のActives...
-
javascriptでテキストファイル...
-
Illustrator でjavascriptによ...
-
JavaScript?でCSVファイルの書...
-
フレームで開いたページのリン...
おすすめ情報