ラベル WSH の投稿を表示しています。 すべての投稿を表示
ラベル WSH の投稿を表示しています。 すべての投稿を表示

2021年6月28日月曜日

WMIでファイルとフォルダの作成・改名を検知して名前に更新日時を入れる

WMIでファイルやフォルダの作成・改名イベントを検出して、対象アイテムの名前に応じて処理を切り替えるサンプルを作成しました。

2018年8月21日火曜日

外部スクリプト化と、それに伴うデバッグ用のサンプル

HTAからAdodb.Connectionを使用するとADO警告メッセージが表示されてしまうため、HTA内部のスクリプトから外部スクリプトファイルを作成してAdodb.Connectionを使用する部分のみ外部化して警告メッセージの表示を回避する場合など、外部化が必要になるケースはたまにあります。

外部化は警告メッセージの表示などを回避できるメリットがある一方で、エラーメッセージも表示されないという特徴もあります。
意図的に隠したい場合は、それもメリットになりますが、プログラム作成や改良の段階ではエラーメッセージが表示されないとデバッグに必要な情報が得られず、意図しないエラーの存在に気付くのが遅れて作業が捗りません。

デバッグ用に、エラーに関する情報を取得するためのメソッドを作成しました。

2018年8月20日月曜日

ADO警告画面を出さずにMySQLを使用する実用的なサンプル

スクリプトを実行する度に警告メッセージが表示されてしまうのを回避する方法については先日書いた通りですが、今回は外部スクリプトとして実用的なサンプルを作成しました。

2017年4月13日木曜日

一時フォルダとファイルとそれを削除するメソッドを作成する関数

一時的なファイルやフォルダを作成して、用が済んだら削除したいと思う時が何度もあります。頻度が高いので関数化しました。

2017年4月1日土曜日

一時画像フォルダ

資料作成のために一時的に画像ファイルをいくつか作成して、用が済んだら削除したい時があります。

今までは以下のやり方をしていました。
プリントスクリーン→ペイント起動→Ctrl + V→Ctrl + S→名前を入力して保存
わりと面倒です。名前が重複しないように気を付けることとか、ペイントを他の用途で使って保存先フォルダの表示が変わると保存後のファイルを使う時や後始末する時に面倒だと感じます。

以下の方法で複数の画像を保存し、用が済んだらウィンドウを閉じるだけで勝手に削除されるようにするプログラムを作成しました。
一時フォルダを開く→「+」ボタンを押してpngファイルを追加→pngファイルを右クリック→Eキーでペイント編集開始→Ctrl + V→Ctrl + S


2017年3月31日金曜日

ウィンドウを閉じると自動で削除されるフォルダ

一時的なファイルの置き場所(用が済んだら削除したい)が欲しい時があります。
ウィンドウを開くと自動で専用のテンポラリフォルダが作成され、閉じると削除前の確認メッセージを経て削除される、というプログラムを作成しました。


2017年3月30日木曜日

miniライブラリをもう少しminiにしつつデバッグ

関数リストと動作確認用サンプルをセットで保存するminiライブラリを先日公開しましたが、これが思いのほか使いやすくて気に入っています。
少し改良しました。

2017年3月17日金曜日

インクリメンタルサーチ式ミニライブラリ

プログラミングの際に利用する定型文とそれを識別するためのキーワードをセットにして保存・検索するためのプログラムを作成しました。
サンプルプログラムもセットで保存することができ、動作確認が容易にできます。


2017年3月16日木曜日

メソッドの上書きによる高速化

先日、メソッド自身を上書きして次回呼出し時は初期化処理を省くという記事を作成しましたが、実際にどれぐらいの差がでるのか検証していませんでした。
その検証を行いました。

結論としてはメソッドの上書きは効果アリでした。
初回起動時のみfunction自身にメソッドを追加して以降はそのメソッドを呼び出す方法と比較して3倍の速度が出ました。(とは言え、遅い方でも1回あたり3マイクロ秒程度ですが。。)

2017年3月14日火曜日

メソッド自身を上書きして次回呼出し時は初期化処理を省く

例えばメソッドの内部で正規表現を扱う場合、その正規表現のパターンが毎回同じならメソッドが呼ばれる度に正規表現の再コンパイルするのをやめて、以下のようにするとコンパイルは初期化時一回のみになるので次回呼出し以降の実行速度が向上します。



しかし、だからといって初期化とメイン処理を分けられるものを何でも上記のようにしてしまうとローディングにかかる時間が伸びてしまいます。
フレームワーク級のオブジェクトの中身でこれを多用されると待ち時間が酷いことになります。初期化しても実際には呼ばれないメソッドなども多々あると思いますので、そういう意味でもムダです。

上記のような問題を解決するために「初回呼出し時に初期化して自身をメイン処理用functionで上書きする」ための関数を作成しました。

2017年3月12日日曜日

オブジェクト作成と関数呼び出しの時間を比較

オブジェクト型の引数を扱う関数をコールする際、あらかじめ用意しておいたオブジェクトの一部だけ変更して渡すのが速いか、オブジェクトを都度リメイクしても変わらないのか比較してみました。

リメイクするオブジェクトの規模にもよりますが、今回の条件ではリメイクすると一回あたり50~80%ぐらい余分に時間がかかります。

2017年3月10日金曜日

小数点以下の桁を含む数値を一時的に整数化する

例えば「(-20.41) - (-43.3)」をJScriptで実行すると、答は「22.89」になる筈ですが実際には「22.889999999999997」という結果になります。そういう仕様ですが、もちろんこれでは困ります。
計算中のみ一時的に10とか100などの数字をかけて整数にして、最後に桁を元通りにすれば上記の問題を回避できます。

そのための関数を作成しました。

2017年3月8日水曜日

ロック中のファイルアクセス回数を低減するサンプル

昨日公開した一時保留.htaでは、ファイルに対する処理をfunction形式で受け渡して、functionを配列に入れて、ロックに成功してアクセス権を取得したら配列内の関数を一つずつ実行していました。
その配列をテキスト化したものが以下になります。

fso.Read、fso.Writeはファイルに対する読み書きを行っています。
一つの関数内で読み書きを1セット行っています。

ファイルに対する処理が三回分まとまると以下のようになります。

かなり冗長な感じです。
対象ファイルのサイズが小さければ無視して良いかもしれませんが、サイズが大きいとか、ネットワーク越しで利用していてネットワークの転送速度が遅いとかいうことになると無視できない話になってきます。
この問題を解消するサンプルを作成しました。

2017年3月7日火曜日

断続的に発生しうる処理を一時的に貯める関数

一つのファイルに対して複数の読み書き要求が同時に発生しうる場合、先日公開したファイルロック.htaを使えば良いのですが、先日のソースではファイルに対する処理のタイミングが他人ではなく自分自身とも競合してしまい待ち時間が長くなってしまう状態でした。

例えばZ:\TEMP\lockTest.txtに対してアクセスしているのが自分ひとりだけだったとしても、数秒以内に複数の項目を書き換えるとそれぞれの操作に対して個別にファイルロック機能が働いていました。

連続した操作による変更なら出来るだけまとめた方が、ファイルのアクセス権獲得のためにロック試行を繰り返したりロックできなくて待機したりという時間を減らせます。

本日のソースでは変更操作を行ってもすぐにはファイルをロックせず、数秒以内に次の操作が行われればそこからまた待機時間を設けて期限が切れたらファイルをロックして変更を反映します。

2017年3月6日月曜日

プログラム終了後にファイルを削除するHTA

処理に必要な一時ファイルをプログラム起動時などに作成し、終了時に削除したい場合があります。
onbeforeunloadイベントを使えばそのようなことができますが、同様に「プログラム終了時に実行したい処理」が複数ある場合は「window.attachEvent」で各処理を登録するのが安全策ですが、各処理の実行順が重要な場合はattachEventに任せるのも危険です。

hta内で実行順などを考慮するのが面倒なので、htaのプロセスIDをwsfで監視して、プロセスIDの終了を検知したら関連ファイルを削除させるサンプルを作成しました。

2017年3月4日土曜日

scriptを共有するサンプル

「外部スクリプト.js」などの名前のファイルを作成して、「<script src="外部スクリプト.js"></script>」のようにするのが普通だと思いますが、構成ファイルが複数個になるのは少し都合が悪いです。

ブラウザでは動的にscriptタグを追加するテクニックがありますが、HTAで試したらうまく動作しませんでした。

上記2つの理由により、HTAファイル内に記載したscriptをWSFファイルなどと共有するサンプルを作成しました。

2017年3月3日金曜日

ネゴシエーション式ファイルロック(成功するまで待機)

昨日のサンプルはロック開始ボタンを押した瞬間だけロックを1回トライするものでした。
本日のサンプルは、ロックが成功するまで適当に待ち時間を挟みながら繰り返しトライして、ロックできたら編集を実行します。


2017年2月19日日曜日

コンストラクタ別クローン作成用関数

String, Number, Boolean, Date, RegExp, Functionなどを引数として与えるとそのクローンを返すという関数を作成しました。


2017年2月16日木曜日

グローバル領域を汚さずにvbscriptを併用する

scriptタグを2つ用意して、それぞれのlanguageをvbscript、jscriptとするやり方だと相互にアクセスするものはグローバル領域に宣言しなければいけない…と思っていましたが、ScriptControlというコンポーネントを利用すれば、グローバル領域を綺麗に保ったままにできるようです。

ソースは以下

2017年2月15日水曜日

JScriptからVBScript経由でデストラクタ利用

ただしVBScriptで「obj = Nothing」を実行した瞬間にobjに入っていたものが解放される…という感じのことはJScriptからは無理でした。
JScriptからは、スクリプト終了時にClass_Terminateを自動実行させることが限界のようです。

色々試して悪あがきして上記の結論に至ったソースは以下。