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.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から警告が出ますが、秒単位ならば
問題無いようです)
質問の方、無限ループを使わない条件を加えて、もうしばらく続けさせて
ください。みなさまよろしくお願い致します
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.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.1
- 回答日時:
メディアプレイヤー等固有の問題だとすると分からないのですが、スクリプトと説明を見て気になった点を書きます。
右クリックから実行したということは、スクリプトは関数内に記述されているのですよね?(サンプルはグローバルエリアになっていますが)
その場合、
setTimeout("fso.DeleteFile(asx);", 5000);
の部分を
setTimeout(function(){fso.DeleteFile(asx);}, 5000);
のようにするともしかしたらうまくいくかもしれません。
前者の場合、asxが関数内で定義されていると動作しないです。(グローバルスコープで実行されるため)
違ってたらすみません。
早速のご回答ありがとうございます。感激です
勉強不足のため、言葉の解釈が曖昧で恐縮ですが、グローバルエリアとは
function{ }で囲まれておらず、命令がどんどん実行される部分のこと
ですよね? サンプルは全てグローバルエリアに記述されております。
functionは使ってません
アドバイスしていただいた記述を元のサンプルと、function main1(){ }
で囲んだものとに適用して実行してみましたが、残念ながら setTimeout
部分だけ実行されませんでした
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux shellscript内のコマンドを、sudo(toor)として実行 2 2022/09/23 15:05
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ブラウザからエクセルを開く方法
-
jsでルートディレクトリより上...
-
ローカルのtest.txtを1行ずつ...
-
ActiveXObjectについて
-
Ajaxが動きません~『status=0』?
-
if(1){...}とはどういうことで...
-
デザイン時のVisible=Falseは実...
-
PHP処理実行後のページの遷移に...
-
JavaScriptで ブラウザの閉じる...
-
フォルダを自動で開く
-
htmlのfileタグに自動で値を入...
-
JSPの処理の途中で、JavaScript...
-
Windows Form のMSChartで、グ...
-
ページ遷移時にアコーディオン...
-
特定の文字でエラー
-
gas 全角数字を半角数字に変換
-
jQuery ui Datepicker 明日以降...
-
innerHTMLなどの反映タイミング
-
画像の上にマウスをもってくる...
-
VB.NET2003 テキストボックスに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ブラウザからエクセルを開く方法
-
Ajaxが動きません~『status=0』?
-
javascriptでテキストファイル...
-
ローカル環境で動作しないJavaS...
-
ブラウザ上でjavascriptを編集...
-
JavaScriptでテキス...
-
JavaScriptによる....
-
jsでルートディレクトリより上...
-
ASP上からサーバサイドのVBScr...
-
ActiveXObjectについて
-
javascriptでのmdb接続について
-
Illustrator でjavascriptによ...
-
XMLHttpRequestオブジェクトに...
-
<input>で送信するfileのMIMEチ...
-
javascriptでサーバ上のActives...
-
ブックマークレットが動かない。
-
JavaScriptを使ってファイルの...
-
ローカルのtest.txtを1行ずつ...
-
外部SVGの参照
-
php -> javascript 変数渡し
おすすめ情報