彩香 さん 2003年 07月 15日 11時 18分 16秒

To:つちや さん

私が早とちりをしていました、動的配列に
Arrayを格納していたんですね、ちょっと違う方向を
向いていました(^^;

Quickソート、Heapソート、Mergeソート
あたりの高速ソートになるとミリ秒単位の僅差ですね。

流石に、単純比較ソート、バブルソートを比べると体感差が実感できますが。

それを拝見する限りでは、クラスでは外部ソートのマージソートで、
配列では内部ソートのクイックソートが早く
いずれもヒープソートが遅いという結果になっていますね。

全般的にクラスを使うと若干遅くなるのは
クラスの生成や参照に数ミリ秒単位でのオーバへッドが加算
されるからじゃないでしょうか?

それから、ランダムに生成されたデータがある程度整列済みに近い形で
生成される時は比較回数が多くなりますから、順位の入れ替わりは
生成されたデータでの誤差の影響でしょうか?

単純過ぎますね私、(^^;

つちや さん 2003年 07月 15日 08時 57分 17秒

Dear 彩香さん

For Each 〜 In 〜 は、配列だけでなくコレクションでもできますので、
以下のようにしてフォルダのファイルをそのままGetFolderで取得してもOKです。
(もともとそのつもりで、テストデータを配列にしたもので。。。)

MyDir = "C:\WINDOWS\TEMP\FileSort"
Set F = CreateObject("Scripting.FileSystemObject").GetFolder("C:\WINDOWS\TEMP")

Dim Data():ReDim Data(0)
For Each File In F.Files
Data(UBound(Data)) = Array(Split(File.Name,".")(0),File.Name)
ReDim Preserve Data(UBound(Data) + 1)
Next
ReDim Preserve Data(UBound(Data) - 1)

Call Sort(Data)
For Each D In Data
S = S & D(1) & vbNewLine
Next
Msgbox S

ヒープソートを使った理由は、それを使ったスクリプトが最初に見つかったという理由です。(^^;
(それに記述がそれほど長くなかったし、VBSで中央値を求めたりクロス集計をしたりした時に
使っていたのが見つかったもので。。)
参考までに、私が昔VBSで試したソートの比較です。
ランダムに1000件のデータを作り出し、それをソートしたもので、
いろいろ調べてこれはいいな、と思ったソートアルゴリズムを比較してます。

unibonさんのソースをいじらずに(Classを使ったまま)とりあえず1000件のデータで実験。
Quickソート 472ミリ秒
Heapソート 632ミリ秒
Mergeソート 359ミリ秒
Shellソート 531ミリ秒
という結果でした。

自分でClassでなく、配列でソートするように変更して試してみたら、
Quickソート 128ミリ秒
Heapソート 261ミリ秒
Mergeソート 230ミリ秒
Shellソート 210ミリ秒
という結果になりました。

なんだか、クイックソートが速いですね。
10万件などにしても、その差は歴然としていました。
クイックソートが苦手そうなデータにしても速かったです。

個人的には、「安定」したソートであるマージソートが好みですが。

さん 2003年 07月 14日 21時 51分 53秒

むたぐちさん
お礼が遅れてしまいまして申し訳ありません
レジストリの書き出し上手くできました
どうもありがとうございました

彩香 さん 2003年 07月 14日 19時 33分 42秒

To:あじゃけんさん、いりやさん

>> そうすれば、構造型の延長上にオブジェクトがくること、Variant 型の背景
>> にあるものは何か、関数 (プログラム) をデータとして渡す、といった発想
>> も自然に理解することができます。また「内部的にはしっかり型が扱われて
>> います」という文章に出てくる「内部」と「外部」の境界は一体どこにある
>> のか? といった疑問も氷解することと思います。

>いりやさんの言う「関数 (プログラム) をデータとして渡す」なんてのは、>VBのイベントで、意識せず身近に利用していたりするんですよ。^^

>私は「構造型の延長上にオブジェクトがくる」とかは当然分かりますが、
>いりやさんの言う「「内部」と「外部」の境界」ってどこなんでしょう?(汗)
>疑問に思ってしまいました。^^;;
>プログラミングした部分が外部という考え方じゃダメ?(汗)

あまり意識しないで読んでいましたが、
よく考えてみると難しい事ばかりだったのですね(^^;

構造体とクラスは似て非なるものですが、
クラス同士がメッセージパッシングを行うメソッドを持ち、
変数をクラス内へ隠蔽したものという事で
構造体の延長上という感じでしょうか。

Variant型の背景っていうのは全く分らないですね。
データ型によってメモリに確保される領域分が異なる訳ですし、
一体、Variant型は何かをラッパーしているのでしょう?

それとも、リスト構造で繋げて隙間をアライメントしているのでしょうか?

それから、VBのイベントで隠蔽されているものって一体何でしょう?
VBだとRaiseEventとかでイベントを発生させることもできますが、
そういう事ではなくデリゲートとかの概念でしょうか。

内部とはOSの領域でしょうか?
全てのプログラムは全てOSの上で動いているものですから、
でも、これじゃ単純過ぎますね。

でも、普段考えないような事を考えたりできて、
まだ、今の私には謎解きのような感じですが、
とても楽しかったです(^^

>うぅ〜ん。オイオイそれは・・・と思ってしまったのは私だけ?(笑)
>で、私は別に昔の人ではないですよ(汗)

ごめんなさい、何も考えずに書いてしまいましたm(__)m

>そうでしょうねぇ。
>確かにそうなると、また覚えなおしかも知れませんが、私は、根本的なプロ>グラミング技法の考え方そのものが変わらない限り、どの言語を使ってもあ>まり変わらないと思っています。

その通りです。

WSHが無くなってしまう事もあるのでしょうか?
と書きたかったのが本心でした。

>プログラミングのし易さが変わるだけで、プラットフォームによって出来る>ことは大体決まってます。
>世の中新しいものがどんどん出てきますので、「いかに基本を抑えているか」がこれからのプログラマの生きる道じゃないでしょうか。

私はプログラマではないので単なる傍観者に過ぎないのですが、
客観的に私もその通りだと思いました。

真琴 さん 2003年 07月 14日 17時 00分 52秒

前にインクルードの仕方をこちらで教えて頂いた者です。

で、今度はインクルードしているファイルをさらにインクルード
するにはどうすればよいのか、教えてもらえないでしょうか?

まず、 a.wsf というファイルがありまして、その中で inc.vbs
というファイルをインクルードしています。(a.wsf の中で inc.vbs 中
の関数をCallしています。)
そうすると、a.wsf をダブルクリックすると、正常にインクルードされて
inc.vbs の関数を呼んで動きます。

それを今度は、x.wsf というファイルを作り、その中で a.wsf 中の関数
(もしくは、a.wsf 自身)を呼んで動かしたいのです。
つまり、a.wsf (中の関数)を単独でも動いて、x.wsf から動かしても、
動くようにしたいのです。

普通のインクルードの部分に a.wsf と書いて実行してみたんですが、どうも
エラーで動かないようなので、.wsfファイルをインクルードするのは、不可能
なのかなぁ と思っているんですが・・・。
それとも、拡張子の付け方が、素人なんでしょうか(笑)

よろしくお願いします。

あさじゃけん さん 2003年 07月 14日 13時 44分 18秒

■最近ちょっと見直したVBS
ちょっと独り言です。(勝手にBBS使ってすみません。むたぐちさん)

今、私が会社を辞めるということで、引継ぎを考えているのですが、AccessのVBAでかなり作りこみした部分があり、後任にVBを叩き込む段取りを考えています。

で。まったくのプログラミング初心者なので、VBA自体に恐怖(?)を抱いているようです。(とっつきにくいってことですね)

で。まず、AccessのVBAを教えるうんぬんの前に、言語としてVBをまず覚えなければなりません。
で、VBAから覚えるとなると、まず、VB独特の開発環境の操作から覚えなければなりません。しかし、何ができるのかも分かっていないため、なかなか覚えれません。
で。たどり着くのは「難しい」というイメージです。

そこで、VBSの登場です(爆)
これは、「メモ帳で出来るプログラミング」なのです。
とりあえず、簡単なプログラミングから覚えてもらうのに、結構VBSは使えるなぁ・・・とか思いました。

言語さえ覚えれば、あとはVBAもVBも簡単に覚えれるのではないでしょうか。

VBSってステキ!とか勝手に思ったあさじゃけんでした。(^^;;;
この手軽さがVBSの生きる道なのかも知れません。(「生きる道」好きだなぁ。俺。爆)

あさじゃけん さん 2003年 07月 14日 11時 50分 36秒


>いりやさん、彩香さんへ
> そうすれば、構造型の延長上にオブジェクトがくること、Variant 型の背景
> にあるものは何か、関数 (プログラム) をデータとして渡す、といった発想
> も自然に理解することができます。また「内部的にはしっかり型が扱われて
> います」という文章に出てくる「内部」と「外部」の境界は一体どこにある
> のか? といった疑問も氷解することと思います。

最初はそのあたりの「オブジェクト指向」の考え方を理解するのは、難しいかもしれませんねぇ。
皆さんつまずくところではないでしょうか。

理解してしまえば、便利なんですけどねぇ^^;;

いりやさんの言う「関数 (プログラム) をデータとして渡す」なんてのは、VBのイベントで、意識せず身近に利用していたりするんですよ。^^

私は「構造型の延長上にオブジェクトがくる」とかは当然分かりますが、
いりやさんの言う「「内部」と「外部」の境界」ってどこなんでしょう?(汗)
疑問に思ってしまいました。^^;;
プログラミングした部分が外部という考え方じゃダメ?(汗)

> 今のCPUは昔とは違って高性能でメモリもかなり余裕ありますのでね、
> 昔の人の苦労は分りません(^^;
うぅ〜ん。オイオイそれは・・・と思ってしまったのは私だけ?(笑)
で、私は別に昔の人ではないですよ(汗)

> 会社は未だ汎用機のCOBOLみたいです
いやぁ・・・結構会社の汎用機ってのは、どこもそんなのが残っていると思いますよ。
うちの会社はIBMのAS/400だったりしますし。
基幹システムのプログラムはRPGなんていう言語使われていたりします。
ソース見てもまったくわからん!(爆)
条件分岐してるなぁとか、ここで足してるなぁぐらいは見れますけど(^^;;
#RPG(Report Program Generator)です。Role Playing Gameじゃないです(笑)

まぁ、その為、逆にそういう技術者が不足している時代なのではないでしょうか。

> これからはユビキタス・Webサービス・携帯端末の時代になるのでしょう、
私は、それに加え、分散コンピューティング(グリッド)あたりが、今後きそうな(?)気がしてます。(バーチャルマシンにも通じてますね)

> そうなると、当然、VBScriptや Jscriptも言語仕様も一変する
そうでしょうねぇ。
確かにそうなると、また覚えなおしかも知れませんが、私は、根本的なプログラミング技法の考え方そのものが変わらない限り、どの言語を使ってもあまり変わらないと思っています。
プログラミングのし易さが変わるだけで、プラットフォームによって出来ることは大体決まってます。
世の中新しいものがどんどん出てきますので、「いかに基本を抑えているか」がこれからのプログラマの生きる道じゃないでしょうか。

とか、えらそうなこと言って見たり(汗)
そういう自分が、あまり基本を抑えていないんですよね(泣)

彩香 さん 2003年 07月 14日 10時 20分 51秒

To:つちや さん

変換ミスでした、改めまして彩香です。

Redimは使えるんですね、VBのヘルプでの確認ですが
ArrayはVariant型の配列になるようですのでやはり、
数値型への変換は必須かもしれませんね(^^

さて、次に動的にArrayを生成という問題がありますが。

>Files = Array("3.xxx.doc","2.xxx.doc","5.xxx.doc", _
>"4.xxx.doc","12.xxx.doc","11.xxx.doc" ,_
>"1.xxx.doc","10.xxx.doc")

Sub MakeArray(ObjFolder) 'F:フォルダオブジェクト

tempName = ""

For Each ObjFile In ObjFolder.Files

    tempName = tempName & ObjFile.Name & ","

Next

Files = Array(Mid(tempName, 1 ,Len(tempName)-1)) '末尾の,を削除

End Sub

ざっとHelpを見たところ、初期化時にのみ使えるのかなと判断しましたので、動作確認はしていませんが、だいたいこんな感じでやるしか無いのでしょうね(^^;

ソースまで頂きましてありがとうございますm(__)m

でもどうしてヒープソートを選択されたのかがちょっと興味あるところです(^^;
参考リンクのほうもブックマークさせて頂きました。

To:いりや さん

私のほうこそお返事が遅くなりましてm(__)m

>掲示板を構成するスクリプトによってそのあたりの特殊文字の処理をどうす
>るか苦慮しているみたいですが、こちらの掲示板では特殊文字は自動的にエ
>スケープ処理が組みいられているようです。

なるほど、1 個以上の半角スペースは 1 個とみなされていますか。
<p>とか<pre>タグを有効にしたりするとどうなんでしょうね?
タグを無効にするというセオリーには反しますが(^^;

ありがとうございます、
こちらのほうがより洗練された感じがします(^^

そうですかぁ、戻り値の型の指定は要らないんですね。
何か忘れているような感じです。

Pascalは厳格な言語の最たるものですね、
Windowsの最高傑作ツール?と言われたDelphiを少し
いじってみましたが、どうも言語に馴染めずでした(^^;
ちなみに、コンパイラは世界最速らしいですが。

C#はDelphiの開発者がMSに引き抜かれて作った言語みたいですので
完成度はきっと宜しいのでしょうね。

>思うに、綾香さんはすでに十分に手続き型のプログラミング言語を習得され
>ていらっしゃるように拝察します。次のステップとして対象 (オブジェクト)
>指向型プログラム言語 (Java, Smalltalk など) と関数型プログラミング言
>語 (Common Lisp, Scheme など) を進められては?? と思います。また並行し
>てその処理系 (インタープリタ、コンパイラ、バーチャルマシンなど) を作
>るための技術についても見識を広げることが有益だと感じています。

いえっ、そんな(^^;

教育を受けた訳でもなく趣味で勉強した程度ですので、
なので、モノ凄〜い基本がポカーンと抜けていたりしますので逆に怖いデス。
ソフトからハードまで万遍なく知ることの難しさもそこにありましたし。

VCでも簡単なアプリは作りますが、どうもC++よりもC言語のほうが楽なので
ポインタでバグを作り込みながらもスクラッチで書いてしまいます、
ちなみにMFCは全く知りません(^^;

それに、C++でもC言語ライクなものしか書いていないように思います。
Javaを真剣に勉強したほうが吉でしょうね、これはオブジェクト思考
しかできませんからね、でも、私には使う用途がありません(^^;

Javaアプリケーションなんて遅くて使いものにならず、
HPをアプレットで彩る時代でもないですし、
クライアントサイドのJavaは衰退の一途を辿り、
Sumもサーブレットに移行して生き残りを掛けているのでしょう、
書店へ行けばJava・Webサービスのオンパレードですし。
失礼しました、iモードもありましたね(^^;

これからはユビキタス・Webサービス・携帯端末の時代になるのでしょう、
IPV6で全世界のホストにグローバルIPが割り当てられる時代になるようデスし。

田舎暮らしでは、サーブレット、.NETって何?って感じです。
私には関係ありませんが、会社は未だ汎用機のCOBOLみたいです、
銀行系では今でも現役という噂も聞いたりしますが。

そういえば、時期のOfficeではVBAは全く別モノになるみたいですね、
VS.NETのツール群を使い開発をするとい事で。VBとVB.NETは別物ですから。

そうなると、当然、VBScriptや Jscriptも言語仕様
も一変するのだろうという推測ができますね。

ただ、WSHに関しては私には何の情報も無くて、
次期Windows(LongHorn?)でのWSHの位置づけも分りません(^^;
何か情報をお持ちの方がいらしたら教えて下さい。

いりやさん、買い被りすぎデス。

>インタープリタ、コンパイラ、バーチャルマシンなど

こんなところまでは私には到底無理デスよ(^^;

何かちょっとWSHとは関係無いお話になってしまって、
WSHとは無関係の内容に不愉快に思われた皆様にはごめんなさいm(__)m

いりや さん 2003年 07月 14日 01時 56分 39秒

綾香さん、

この週末、しばしオフにて東京を離れておりましたのでお返事が遅くなりま
した。徒然なるままにご回答します。

> インデントがつかないとソースって見辛いので入れたいのですが、
> 何かタグを入れれば良いのでしょうか?

こちら、HTML 文書では 1 個以上の半角スペースは 1 個とみなされてウェブ
・ブラウザでは表示されるようです。

掲示板を構成するスクリプトによってそのあたりの特殊文字の処理をどうす
るか苦慮しているみたいですが、こちらの掲示板では特殊文字は自動的にエ
スケープ処理が組みいられているようです。

ですので、あとは、タブもしくは 2 個以上の半角スペース " " は全角スペー
ス " " に置き換えて投函することをおすすめします。すぐにコピー&ペー
ストしてスクリプトを実行できないもどかしさはありますが、読み手と書き
手で暗黙の了解が得られるのであればさほど大きな問題にはならないと思い
ます。わたしはこちらに投稿する前にタブを 8 個分の半角スペースにするた
めに 4 個の全角スペースにおきかえています。

> 即興で作ってみました、Jscriptの言語仕様は全く知らないので
> 直感ですが(^^;

こちらでもきちんと動作を確認できました。確認する範囲においては特に問
題はありませんでした。getNumber() 関数もこれでよいと思います。

ちょいとおまけで比較関数を引数として与えて、前回スクリプトで func1(),
func2(), func3() を使用できるようにしてみました。どこを取り替えたかみ
てみてください。

function simpleSort2(argumentsArray, compareFunction) {
    var j;
    for (var i = 0; i < argumentsArray.length; i++) {
        temp = argumentsArray[i];
        for (j = i; j > 0 && compareFunction(argumentsArray[j - 1], temp) > 0; j--) {
            argumentsArray[j] = argumentsArray[j - 1];
        }
        argumentsArray[j] = temp;
    }
}

呼び出すときには、
    simpleSort2(argumentsArray, func2);
という風に、第二引数に func1, func2, func3 という名前をあたえます。

このように比較関数をとりかえる仕掛けを用意している例の一つが
Array>>sort() メソッドという訳です。


> numの値によってソートするという想定です。
> ループの中から適宜これを呼び出すようなものにしました。
>
> num = path2file(arg1);
>
> 戻り値? function getNumber(arg1) {
>
>     var key = new Number(first(arg1, "."));
> return key;
>
> }
>
> 擬似言語みたいなものになってしまいまいしたが、
> JScriptでは戻り値はどう設定できるのでしょうか?

実は *ない* んです、戻り値の型を記す箇所が構文規則には。(ECMA-262 3rd
Edition の 71 ページ 13 節 Function Definition の Syntax をみてみてく
ださい)
http://www.ecma-international.org/publications/standards/ECMA-262.htm

C/Pascal などのプログラム言語に慣れ親しんだものにとっては奇異にうつる
かもしれません。

このあたりは「動的型付け (Dynamic Typing) のプログラム言語である」、
「変数に型がない」、「整数でも文字列でも配列でも区別なく変数に代入で
きる」、「コンパイル時でなく実行時に型チェックを行う」といった話と近
い話をしています。あさじゃけんさんやむたぐちさんが指摘されている点に
も通じる話だと思います。


思うに、綾香さんはすでに十分に手続き型のプログラミング言語を習得され
ていらっしゃるように拝察します。次のステップとして対象 (オブジェクト)
指向型プログラム言語 (Java, Smalltalk など) と関数型プログラミング言
語 (Common Lisp, Scheme など) を進められては?? と思います。また並行し
てその処理系 (インタープリタ、コンパイラ、バーチャルマシンなど) を作
るための技術についても見識を広げることが有益だと感じています。

そうすれば、構造型の延長上にオブジェクトがくること、Variant 型の背景
にあるものは何か、関数 (プログラム) をデータとして渡す、といった発想
も自然に理解することができます。また「内部的にはしっかり型が扱われて
います」という文章に出てくる「内部」と「外部」の境界は一体どこにある
のか? といった疑問も氷解することと思います。

いりや

いりや さん 2003年 07月 13日 20時 41分 32秒

かばさん、

この週末コンピュータから離れておりお返事がおそくなりました。

> しかし、過去記事にしっかりあったとは、申し訳ないです(汗)
> その過去記事の内容も非常に興味深いものでしたので、
> 申し越し頑張ってみます!!
>
> Jsについてもまだまだ知識不足ですので、みてみますね。
> ありがとうざいます!!

Internet Explorer の自動操舵そのものについては、下記のリンクも参考になる
かもしれません。

使用プログラミング言語が少々ちがいますが Dynamic HTML Object Model に
沿っていかに操作をプログラムするかがポイントですので、そこを追ってゆ
けば、簡単にご使用のプログラミング言語にポーティングは可能だと思いま
す。

(1) UWSC から Internet Explorer を操作するサブルーチン

KID さんが作成されたもので、UWSC 用です。もともとご自身の仕事でウェブ
操作の自動化が必要となり作られたそうです。

navigation は言うに及ばず、ほとんどの HTML 要素へのアクセスがサポート
されています。操作の自動化を効率よくプログラミングするのに適していま
す。

http://www.icnet.ne.jp/~supreme/IE_HowToUse.html
http://www.icnet.ne.jp/~supreme/

(2) 自動化ソフト UWSC スクリプト集

拙作ですが、Internet Explorer の自動化をおこなうスクリプトをいくつか
書きました。(1) に対してどちらかというと HTML 文書を Dynamic HTML
Object Model に沿って処理することに注力しています。HTML 文書中の例え
ば表データや画像を保存する、注目したい語をハイライトする、などの処理
を行うスクリプトを紹介しています。

http://iriyak.adam.ne.jp/uwsc.html


ご参考までに。

いりや

つちや さん 2003年 07月 13日 03時 52分 56秒

Dear 綾香さん(彩香さん?)

VBSは自前のソートを持っていないので、とりあえず、関数を作ってソートする例です。ソートのアルゴリズムは、unibonさんの、
http://www.geocities.co.jp/SiliconValley/4334/unibon/index.html
を参考にして下さい。

Files = Array("3.xxx.doc","2.xxx.doc","5.xxx.doc", _
"4.xxx.doc","12.xxx.doc","11.xxx.doc" ,_
"1.xxx.doc","10.xxx.doc")

Dim Data():ReDim Data(0)
For Each File In Files
Data(UBound(Data)) = Array(Split(File,".")(0),File)
ReDim Preserve Data(UBound(Data) + 1)
Next
ReDim Preserve Data(UBound(Data) - 1)

Call Sort(Data)
For Each D In Data
S = S & D(1) & vbNewLine
Next
Msgbox S

'===================================================================
'以下ソートルーチンです。
'unibonさんのアルゴリズムを参考にさせていただいています。
'===================================================================

Sub swap(ByRef x, ByRef y)
Dim d
d = x: x = y: y = d
End Sub

Function CompareAB(A,B)
If IsArray(A) Then
If Clng(A(0)) < Clng(B(0)) Then
CompareAB = -1
ElseIf Clng(A(0)) > Clng(B(0)) Then
CompareAB = 1
Else
CompareAB = 0
End If
End If
End Function

Sub sortHeapSub(ByRef a(), ByVal p, ByVal s) ' ヒープソート(内部ルーチン)
If p * 2 + 2 > s Then Exit Sub
Dim m
If p * 2 + 2 = s Then
m = p * 2 + 1
Else
If CompareAB(a(p * 2 + 2),a(p * 2 + 1)) < 0 Then
m = p * 2 + 1
Else
m = p * 2 + 2
End If
End If
If CompareAB(a(p),a(m)) < 0 Then
Call swap(a(p), a(m))
Call sortHeapSub(a, m, s)
End If
End Sub

Sub Sort(ByRef a()) ' ヒープソート
Dim i
For i = (UBound(a) + 1) \ 2 - 1 To 0 Step -1
Call sortHeapSub(a, i, UBound(a) + 1)
Next
For i = UBound(a) To 1 Step -1
Call swap(a(i), a(0))
Call sortHeapSub(a, 0, i)
Next
End Sub

unibonさんは、クラスを使用してソートされてますが、
スピードはクラスを使わない方が速いようなので、そちらに変更してます。

綾香 さん 2003年 07月 11日 18時 41分 05秒

失礼しました、これを忘れていました(^^;

「1.ファイル名」のような形式としています。

numの値によってソートするという想定です。
ループの中から適宜これを呼び出すようなものにしました。

num = path2file(arg1);

戻り値? function getNumber(arg1) {

    var key = new Number(first(arg1, "."));
return key;

}

擬似言語みたいなものになってしまいまいしたが、
JScriptでは戻り値はどう設定できるのでしょうか?

綾香

彩香 さん 2003年 07月 11日 18時 20分 50秒

To:あさじゃけん さん

そうですね、暗黙の型変換だとVariant型って計算をする時に思わぬ事ありますね。でも、けっこう便利なのでよく使ってしまいます(^^

今のCPUは昔とは違って高性能でメモリもかなり余裕ありますのでね、
昔の人の苦労は分りません(^^;

To:いりやさん

.jsってJscriptを使ったWSHという事でしたかぁ、
Jscriptは使ったこともありませんで気が付きませんでした(^^;

即興で作ってみました、Jscriptの言語仕様は全く知らないので
直感ですが(^^;

function simpleSort(argumentsArray){

var j;
for (var i = 0; i < argumentsArray.length; i++) {

temp = argumentsArray[i];

for (j = i; j > 0 && argumentsArray[j-1] > temp; j--){

argumentsArray[j] = argumentsArray[j-1];

}

argumentsArray[j] = temp;

}

}

インデントがつかないとソースって見辛いので入れたいのですが、
何かタグを入れれば良いのでしょうか?

これだと、インデントが削除されて見えていますよね。

buildArgumentsArray() 関数ですかぁ、どんなものができるでしょうね(^^

何か面白いものができましたら挙げさせて頂きますね。
今は、キーワード検索とか、CSV変換とかそのぐらいしか・・・
でも、敢えてこれを使うメリットが活かせないですし(^^;

彩香

かば さん 2003年 07月 11日 17時 48分 21秒

いりやさん、むたぐちさん、ご回答ありがとうございます。
とりあえず、DocumentCompleteイベントで実験してみました。
以前よりうまくいきました。
しかし、過去記事にしっかりあったとは、申し訳ないです(汗)
その過去記事の内容も非常に興味深いものでしたので、
申し越し頑張ってみます!!

Jsについてもまだまだ知識不足ですので、みてみますね。
ありがとうざいます!!

あさじゃけん さん 2003年 07月 11日 17時 01分 33秒

あ。補足です。
VarTypeってのもあります。
こちらは、数値で返してくれます。

--------------------------------------------------
vbEmpty 0 Empty 値 (未初期化)
vbNull 1 Null 値 (無効な値)
vbInteger 2 整数型
vbLong 3 長整数型 (Long)
vbSingle 4 単精度浮動小数点数型 (Single)
vbDouble 5 倍精度浮動小数点数型 (Double)
vbCurrency 6 通貨型 (Currency)
vbDate 7 日付型 (Date)
vbString 8 文字列型
vbObject 9 オートメーション オブジェクト
vbError 10 エラー型
vbBoolean 11 ブール型 (Boolean)
vbVariant 12 バリアント型 (Variant) (バリアント型配列にのみ使用)
vbDataObject 13 非オートメーション オブジェクト
vbByte 17 バイト型
vbArray 8192 配列 (Array)
--------------------------------------------------
#配列は8192+そのデータ型になります。

あさじゃけん さん 2003年 07月 11日 16時 51分 56秒

>彩香さんへ

VBSの変数は、全てVariant型として扱われます。
Variant型はいわゆる「なんでも型」ですが、むたぐちさんが言うように、実は内部でどの型なのか情報を持っています。

これは、VBSだけでなく、VBのVariant型にも同じ事が言えます。

で。
VBでは、Variant型の変数の型を知りたければ、TypeNameという関数があります。
--------------------------------------------------
Byte バイト型 (Byte)
Integer 整数型 (Integer)
Long 長整数型 (Long)
Single 単精度浮動小数点数型 (Single)
Double 倍精度浮動小数点数型 (Double)
Currency 通貨型 (Currency)
Decimal 10 進数型
Date 日付型 (Date)
String 文字列型 (String)
Boolean ブール型 (Boolean)
Error エラー値
Empty 未初期化
Null 無効な値
Object オブジェクト
Unknown オブジェクトの種類が不明なオブジェクト
Nothing オブジェクトを参照していないオブジェクト変数
--------------------------------------------------
が、”文字列”で帰ってきます。
※配列だとカッコ「()」がつきます。
#VBSもHelpを見る限り、同じようです。^^

で、変数の型ですが、代入時に決定されますので、
例えば、
--------------------------------------------------
Dim intCount
Dim lngCount
intCount = CInt(300)
lngCount = CLng(300)
msgbox TypeName(intCount)
msgbox TypeName(lngCount)
--------------------------------------------------
なんてのを、動かして見ると分かりやすいです。
しっかり型が決定されていることが分かります。

> 明示的にCInt("1")とか、してあげたいところですね。
そう!そうです。
以上を踏まえていると、明示的に指定することが、すごく大事な場面があったりするんです。(特に計算する時)
型が勝手にキャスト(型変換)されて、思ったとおりの計算結果にならなかった・・・なんてのが、事実起こりえます。

Variant型は、「型を意識しなくてもいい」というわけではなく、むしろ意識しないといけないのです。(多分)笑
なので、私の場合、VBSでもしっかり変数名にプリフィックスをつけます。
「その型を使っているという前提」として考えてます^^

彩香 さん 2003年 07月 11日 15時 41分 10秒

To:いりやさん

温かいお言葉ありがとうございます(^^

ところで〜.jsって何でしょうか?
〜.vbsしか知りませんでした(^^;

とは言うものの、動作確認できました、
なるほどぉ、素晴らしいですね♪

D&Dを検地してこんな事できるんですね、
コマンドライン引数みたいなものに
読替えているのでしょうかねぇ。

Arrayの存在は知っていましたが、配列で使うより面倒みたいでしたので
使ったことはありませんでした(^^;

う〜ん、配列に慣れてしまうと配列のラッパーされた
オブジェクトを使うのはどうも食わず嫌いでしたが、調べて作ってみます。

To:管理人むたぐち さん

構造体はデータ型が定義できない以上無理でしたね、
構造体配列でクイックソートでも書いて終われれば良かったのですが。

>内部的にはしっかり型が扱われています。

この内部的にというのが(^^;

数字と数値が異なるのはご承知の通りですが、
こんな1もある訳ですよね、1(→変換→)1? or 1?

明示的にCInt("1")とか、してあげたいところですね。

まだ、ホンノ入り口程度しか勉強していませんので、
これからいろいろなものを吸収してゆきたいと思います。

今後とも、宜しくお願いしますm(__)m





管理人むたぐち さん 2003年 07月 11日 01時 51分 27秒

To: いりや さん

> それに JavaScript の規格である ECMA-262 をとりよせて読んでみましたが

規格書にしては意外と(?)短めですね。
ちなみに、JScript.NETは、ECMA-262 Script 4th Editionのフライング実装だそうで。

[概要]JScript - DynamicScripting http://www.interq.or.jp/student/exeal/dss/ref/jscript/about.html
ECMA 準拠の Microsoft JScript の機能
http://www.microsoft.com/japan/msdn/library/ja/jscript7/html/jsgrpecmafeatures.asp

ネットスケープ陣営では、4th EditionはJavaScript2.0となるようです。

JavaScript 2.0 http://www.mozilla.org/js/language/js20/index.html


To: あさじゃけん さん

> #PHP.NETでないかなぁ(爆)

あまり関係ないですが、.NET Frameworkを使ったコードを、
COM経由でPHPから呼び出すというお話がありました。

PHPBuilder.com - Using .NET Assembly (Interoperability with COM) in PHP
http://www.phpbuilder.com/columns/jayesh20021103.php3


To: きじ さん

> VBSのfor文中でバッチを呼び出し、for文中の変数をバッチへ渡したいのですが

WshShell.Run でバッチを起動する際、VBSの変数をコマンドラインオプションに
指定してやればバッチに渡せます。
バッチ側ではコマンドラインオプションは%1 %2 ...で得られます(たしか)。


To: かば さん

> どなかたか、IEでページのダウンロード完了を感知する方法

WScript.CreateObjectメソッドの第二引数を指定することで、
IEオブジェクトのイベントをバインドできます。
ドキュメントのロードが完了すると、DocumentCompleteイベントが呼ばれますので、
それで確認できます。
ただし、各フレーム内のドキュメントのロードが完了するたびに呼ばれるので、
そこは工夫が必要になるでしょう。
実際のコードは過去記事リスト20や9などにあると思います。


To: 彩香 さん

> WSHでは構造体とかは使えますでしょうか?

WSH、というかVBSには構造体はありません。

> WSHではデータ型という概念がないようなので

WSH、というかVBSにはデータ型という概念が無いのではなく、
データ型を指定した変数を宣言することはできない、ということです。
内部的にはしっかり型が扱われています。
ので、ソートはもちろん可能です。
実際のソート方法は、関数を自分で書くか、COMコンポーネントを使うか、JSを併用して
配列をVBArrayオブジェクトからArrayオブジェクトに変換してsortするかのどれかになるでしょう。
いずれも過去記事に例がありますので参考にしてみてください。

管理人むたぐち さん 2003年 07月 11日 01時 08分 54秒

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsent7/html/vxconProgrammingLanguages.asp
によると、.NETの言語はMS製のが5個、サードパーティー製のが12個あるようです。
聞いたことのない言語もいくつかあって、なかなか壮観です。
Googleで公式ページっぽいのを探してみたのでまとめてみます。
紹介ページしかなかったのもいくつかありますが。

■言語-Microsoft製
Visual Basic .NET http://www.microsoft.com/japan/msdn/vbasic/
Visual C# .NET http://www.microsoft.com/japan/msdn/vcsharp/
Visual C++ .NET http://www.microsoft.com/japan/msdn/visualc/
JScript .NET http://www.gotdotnet.com/japan/team/jscript/
Visual J# .NET http://microsoft.com/japan/msdn/vjsharp/

■言語-サードパーティー製
COBOL for Microsoft .NET http://software.fujitsu.com/jp/cobol/products/produce/dotnet.html
Perl for Microsoft .NET http://www.activestate.com/Corporate/Initiatives/NET/
Eiffel for Microsoft .NET http://www.microsoft.com/japan/msdn/net/general/pdc_eiffel.asp
Python for Microsoft .NET http://www.activestate.com/Products/Visual_Python/index.plex
Pascal for Microsoft .NET http://www.tmt.com/net.htm
Mercury for Microsoft .NET http://www.cs.mu.oz.au/research/mercury/dotnet.html
Mondrian for Microsoft .NET http://research.microsoft.com/~emeijer/Papers/MondrianDDJ.pdf
Oberon for Microsoft .NET http://www.oberon.ethz.ch/lightning/
Salford FTN95 (Fortran) for Microsoft .NET http://www.salfordsoftware.co.uk/compilers/ftn95/dotnet.shtml
SmallTalk for Microsoft .NET http://www.smallscript.org/
Standard ML for Microsoft .NET http://research.microsoft.com/Projects/SML.NET/
Dyalog APL for Microsoft .NET http://www.quantys.fr/produits/apl/net.htm

■非公認(?)ならRubyもあります
CLR meets Ruby http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/netruby.html

■Visual Studio以外の開発環境が出ました
ボーランド、.NET対応の開発環境『Borland C#Builder for the Microsoft .NET Framework』日本語版を発売
http://ascii24.com/news/i/soft/article/2003/07/08/644802-000.html

■MS以外の.NET Frameworkの実装
Home / Mono http://www.go-mono.com/
Southern Storm Software, Pty Ltd http://www.southern-storm.com.au/

■MSがFreeBSD版の.NETのソースを公開したそうな
ZDNN:.NETをFreeBSDに――MSが「共有ソースコード哲学」を実践へ http://www.zdnet.co.jp/news/0106/28/e_sharecode.html
Nikkei BP Network | BizTech 記事検索記事本文 http://bizns.nikkeibp.co.jp/cgi-bin/search/wcs-bun.cgi?ID=177347&FORM=biztechnews

■JScript.NET関係
JScript.NETは、コンパイルしなきゃ動かないという点はスクリプトらしくないですが、
クラス等で構造化せずともいきなりコードが書けたり、変数の型を省略できたりして、
他の.NET 言語よりお手軽です。
WSHの後継者にもっとも近い存在なんじゃないでしょうか。
以下、JScript.NET関係のリンク集です。

JScript .NET の概要 http://www.microsoft.com/japan/msdn/library/ja/jscript7/html/about.asp
JScript.NET の紹介 http://www.microsoft.com/japan/msdn/columns/scripting/scripting07142000.asp
JScript .NET http://www.gotdotnet.com/japan/team/jscript/

特集:.NET Framework SDKで始める.NETプログラミング(前編) 6.Hello World展覧会(3)− VB.NET,JScript.NET−
http://www.atmarkit.co.jp/fdotnet/special/dotnet_sdk/dotnetsdk07.html

JScript.NET 概要 http://member.nifty.ne.jp/aya/JScript.NET/summary.htm
.Net日記 http://www.st.rim.or.jp/~kazukun/DotNet.html

いりや さん 2003年 07月 10日 21時 15分 25秒

綾香さん、

こんばんわ、いりやです。

奮闘されていらっしゃるようですね。果敢に攻めてゆけば、必ず攻略できる
ものと思います。ぜひがんばってください。

ところで、

| 上記では、ファイルを総なめして即印刷としていますが、
| ここで多次元配列に順次RedimPreserveでスタックを
| 伸ばしてゆきながら格納完了後に、配列をソートさせる
| 関数を呼び出し、引き続き印刷の実行とすれば普通は
| できると思うのですが。
|
| それには、配列は構造体配列として
| 印刷の順番をInt型、パス名を文字列型とた構造体配列を
| 作成して、ファイル名からLeft(ファイル名,1)で順番を取り出した
| ものと、パス名をそれぞれ要素としたいところなのですが、
| WSHでは構造体とかは使えますでしょうか?
|
| また、何れのソートアルゴリズムを使うにしろ数値型でないと
| ソートできないですし、
| WSHではデータ型という概念がないようなのでこのような事は
| 到底無理なのでしょうか?

WSH/VBScript の方はこちらにいらっしゃる皆さんのヘルプを期待して私の方
は WSH/JScript をつかって話したいと思います。。


WSH/JScript には、Array オブジェクトというこのような用途に向くオブジェ
クトがおります。ご存知でしたか??

このオブジェクトの sort() メソッドはちょっと気が利いていて、要素の比
較関数をある約束事さえ守って自分で書くことができるのです。
http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/script56/js56jsmthsort.htm

通常だと各要素を文字列として比較するなど決めうちものが多く、ファイル
名の比較で数字が入っているときなど 1 xxx.doc, 10 xxx.doc, 2 xxx.doc
みたいにソートして不便におもうことがあります。

自分で比較関数をかけるということは、ファイル名の最初の数字を読み込ん
でそこをキーとして比較する、というような関数をこさえることができる、
ということです。

論よりコード、一つ WSH/JScript のプログラムをお見せします。


[ スクリプトの概要 ]

WSH/JScript スクリプトファイルのアイコンにドラッグ&ドロップされたファ
イル群のファイルパスを整列してポップアップ表示させます。


[ 実行の前に ]

全角スペースを半角スペースにおきかえて sample.js というファイル名で保
存します。

複数個のファイルアイコンを sample.js にドラッグ&ドロップしてください。
sample.js が自動的に起動してソートされたファイルパスの一覧がポップアッ
プされます。


[ スクリプトの説明 ]

処理の流れは、ドラッグ&ドロップされたファイルのパス情報を WScript.arguments
から入手して、argumentsArray (Array オブジェクト) に格納し、sort() メ
ソッドを起動します。それから結果をポップアップ表示します。

ポイントは、func1(), func2(), func3() 関数で、これが自作の比較関数の
例となります。詳しくはスクリプト中の msdn のリファレンスを参照くださ
い。

[ 動作例 ]

それぞれがどういう振る舞いをするか例示します。(プログラム中はコメント
アウトしている所を適宜コメントを外して試験ください)

インプット (a), (b), (c) 向け:

  C:\sort\1 abc.js
  C:\sort\10 abc.js
  C:\sort\2 abc.js
  C:\sort\3 abc.js

インプット (d) 向け:

  C:\sort\abc 1.js
  C:\sort\abc 10.js
  C:\sort\abc 2.js
  C:\sort\abc 3.js

(a) sort() メソッドの引数がゼロの整列結果:

  0: [C:\sort\1 abc.js]
  1: [C:\sort\10 abc.js]
  2: [C:\sort\2 abc.js]
  3: [C:\sort\3 abc.js]

(b) func1() による整列結果:

  0: [C:\sort\1 abc.js]
  1: [C:\sort\10 abc.js]
  2: [C:\sort\2 abc.js]
  3: [C:\sort\3 abc.js]

(c) func2() による整列結果:

  0: [C:\sort\1 abc.js]
  1: [C:\sort\2 abc.js]
  2: [C:\sort\3 abc.js]
  3: [C:\sort\10 abc.js]

(d) func3() による整列結果:

  0: [C:\sort\abc 1.js]
  1: [C:\sort\abc 2.js]
  2: [C:\sort\abc 3.js]
  3: [C:\sort\abc 10.js]


[ スクリプトの改造 ]

比較関数は func1(), func2(), func3() を参考に一つこさえてみてください。
そんなに難しいものではありません。ただちょっと慣れが必要かもしれませ
ん。

argumentsArray の要素に対してアクセスは、doSomethingSpecialWith() 関
数で骨格を示しました。これをベースに処理関数を自由に制作改造できると
おもいます。

ドラッグ&ドロップされたフォルダに対して格納されているファイルを抜き
出して要素とする、というのは改造例としておもしろいと思います。これは
buildArgumentsArray() 関数を自作することになります。ぜひそのような
argumentsArray を生成するような自作関数をつくってご紹介ください。


[ WSH/JScript スクリプト ]

var argumentsArray = buildArgumentsArray();

argumentsArray.sort();
//argumentsArray.sort(func1);
//argumentsArray.sort(func2);
//argumentsArray.sort(func3);

printArgumentsArray(argumentsArray);

function doSomethingSpecialWith(argumentsArray) {
    // Please note that this code was not tested, just for your information.
    for (var i = 0; i < argumentsArray.length; i++) {
        filePath = argumentsArray[i];
        var aShellApplication = new ActiveXObject("Shell.Application");
        aShellApplication.shellExecute(filePath, 0, 0, "print", 1);
    }
}

function buildArgumentsArray() {
    var argumentsArray = new Array();
    for (var i = 0; i < WScript.arguments.length; i++) {
     argumentsArray.push(WScript.arguments.item(i));
    }
    return argumentsArray;
}

function printArgumentsArray(argumentsArray) {
    var s = "";
    for (var i = 0; i < argumentsArray.length; i++) {
        s += i;
        s += ": [";
        s += argumentsArray[i];
        s += "]\r";
    }
    WScript.echo(s);
    return s;
}

// Array>>sort() 第一引数に与える関数オブジェクトの外部仕様
//
// 1 つ目の引数が 2 つ目の引数よりも小さい場合は、負の値を返す関数。
// 2 つの引数が等しい場合は 0 を返す関数。
// 1 つ目の引数が 2 つ目の引数よりも大きい場合は、正の値を返す関数。
//
// [ リファレンス ]
//
// msdn, sort メソッド
// http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/script56/js56jsmthsort.htm

// func1(): sort() メソッドの引数を省略した場合とほぼ同様だと
//      おもわれる比較関数のプログラム例
//
//      比較例: "サンプル 10.doc" < "サンプル 2.doc"

function func1(arg1, arg2) {
    if (arg1 < arg2) return -1;
    if (arg1 == arg2) return 0;
    if (arg1 > arg2) return 1;
}

// func2(): ファイル名が "数 文字列.拡張子" という前提で、
//      その数の比較する関数例。
//
//      比較例: "2 サンプル.doc" < "10 サンプル.doc"

function func2(arg1, arg2) {
    var key1 = new Number(first(path2file(arg1), " "));
    var key2 = new Number(first(path2file(arg2), " "));
    if (key1 < key2) return -1;
    if (key1 == key2) return 0;
    if (key1 > key2) return 1;
}

// func3(): ファイル名が "文字列 数.拡張子" という前提で、
//      その数の比較する関数例。
//
//      比較例: "サンプル 2.doc" < "サンプル 10.doc"

function func3(arg1, arg2) {
    var key1 = new Number(last(path2base(arg1), " "));
    var key2 = new Number(last(path2base(arg2), " "));
    if (key1 < key2) return -1;
    if (key1 == key2) return 0;
    if (key1 > key2) return 1;
}

// String utility

function first(s, delim) {
    return nth(s, 0, delim);
}

function nth(s, n, delim) {
    return s.split(delim)[n];
}

function len(s, delim) {
    return s.split(delim).length;
}

function last(s, delim) {
    return nth(s, len(s, delim) - 1, delim);
}

function path2file(path) {
    return last(path, "\\");
}

function path2base(path) {
    return file2base(path2file(path));
}

function file2base(file) {
    return file.split(".").slice(0, -1).join("");
}

//
// end of script
//

いりや さん 2003年 07月 10日 17時 38分 53秒

かばさん、

はじめまして、いりやと申します。

| object.Busyで、ダウンロード完了の判定ができるかと思いきや、
| どうも不安定になってしまいます。特にフレーム表示のHPだと
| フレームが表示の途中でobject.Busyがtrueを返しているように思えます。
| どなかたか、IEでページのダウンロード完了を感知する方法をご存知でしたら
| ご教授ください。よろしくお願い致します。

私も同じ問題に取り組みました。WSH/JScript で書いたプログラ
ムをご紹介しますので参考になさってください。

[ スクリプトの概説 ]

example1()

こちらの掲示板を訪問します。

example2()

タイムアウト値を設けてナビゲーションを途中で切り上げるよう
な手続きを組みます。擬似的にロードに時間がかかるCGIを利用し
て使用法を説明しています。

感知のポイントについては、waitUntilLoadingHasCompleted() の
breakCondition にヒントが隠されています。

[ 実行の仕方 ]

全角スペースを半角スペースに置き換えて sample.js というファ
イル名で保存し、ダブルクリックすれば起動します。

[ スクリプト ]

example1();
example2();

function example1() {
    var aShell = new ActiveXObject("WScript.Shell");
    aShell.popUp("WSH Lab. 掲示板を訪れます", 2);
    var anInternetExplorer = new ActiveXObject("InternetExplorer.Application");
    anInternetExplorer.visible = true;
    anInternetExplorer.navigate("http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/index.shtml");
    waitUntilLoadingHasCompleted(anInternetExplorer);
    aShell.popUp("読み込みが完了しました。", 2);
}

function example2() {
    var aShell = new ActiveXObject("WScript.Shell");
    aShell.popUp("今度は10秒かかってloadが完了するウェブ・サイトを訪れます", 2);
    var anInternetExplorer = new ActiveXObject("InternetExplorer.Application");
    anInternetExplorer.visible = true;
    ret = aShell.popUp("タイムアウト値を設定して待ちますか?", 0, "実行に際してご確認", 0x20 + 0x04);
    if (ret == 0x06) {
        anInternetExplorer.navigate("http://iriyak.adam.ne.jp/waits.cgi?waitSecs=10");
        timeout = 5;
        if (waitUntilLoadingHasCompletedWithTimeout(anInternetExplorer, timeout))
            aShell.popUp("無事に読み込みが終わりました。", 2);
        else
            aShell.popUp("タイムアウトが発生しました。タイムアウト値 = [" + timeout + "秒]", 2);
    } else {
        anInternetExplorer.navigate("http://iriyak.adam.ne.jp/waits.cgi?waitSecs=10");
        if (waitUntilLoadingHasCompleted(anInternetExplorer))
            aShell.popUp("無事に読み込みが終わりました。", 2);
    }
}

function waitUntilLoadingHasCompleted(anInternetExplorer) {
    var waitSecs = 0.1;
    do {
        WScript.sleep(waitSecs * 1000);
        var b1 = anInternetExplorer.busy == false;
        var b2 = anInternetExplorer.readyState == 4; // 4 = READYSTATE_COMPLETE
        var breakCondition = b1 && b2;
    } while (!breakCondition) // repeat until breakCondition becomes true.
    return true;
}

function waitUntilLoadingHasCompletedWithTimeout(anInternetExplorer, timeout) {
    var elapsedSecs = 0;
    var waitSecs = 0.1;
    do {
        if (elapsedSecs > timeout)
            return false;
        else {
            WScript.sleep(waitSecs * 1000);
            elapsedSecs = elapsedSecs + waitSecs;
            var b1 = anInternetExplorer.busy == false;
            var b2 = anInternetExplorer.readyState == 4; // 4 = READYSTATE_COMPLETE
            var breakCondition = b1 && b2;
        }
    } while (!breakCondition) // repeat until breakCondition becomes true.
    return true;
}

彩香 さん 2003年 07月 10日 16時 42分 47秒

こんにちは、綾香と申します。

以前、フォルダの中のファイルを全て印刷するというもので
皆様にアドバイスを頂きまして、下記のようなものを作成しました。

For Each ObjF In F.Files

strFilePath = F.Path & "\" & ObjF.Name
Shell.ShellExecute strFilePath, NULL, NULL, "print", SW_SHOWNORMAL

Next

そこで、印刷の順番を明示的に示してあげたいと思いまして
再投稿させて頂きました。

つまり、面倒ですが各フォルダ単位でファイル名の先頭に
1.ファイル〜.doc
2.ファイル〜.doc
・・・
というように印刷の順番を入れてあげて印刷したいと思っています。
これでもランダムに印刷された後に並び替えるよりは効率的だと思いますし。

上記では、ファイルを総なめして即印刷としていますが、
ここで多次元配列に順次RedimPreserveでスタックを
伸ばしてゆきながら格納完了後に、配列をソートさせる
関数を呼び出し、引き続き印刷の実行とすれば普通は
できると思うのですが。

それには、配列は構造体配列として
印刷の順番をInt型、パス名を文字列型とた構造体配列を
作成して、ファイル名からLeft(ファイル名,1)で順番を取り出した
ものと、パス名をそれぞれ要素としたいところなのですが、
WSHでは構造体とかは使えますでしょうか?

また、何れのソートアルゴリズムを使うにしろ数値型でないと
ソートできないですし、
WSHではデータ型という概念がないようなのでこのような事は
到底無理なのでしょうか?

印刷はできたもののランダム過ぎて各フォルダで延べ30〜50ファイル
程度ありますと、並び替えがたいへんで仕方ありませんでした(^^;

かば さん 2003年 07月 10日 14時 50分 56秒

何度もすいません(汗)
先ほどの書き込みで間違えを書いてました。
busyの返り値ですけど、正しくは
「ページの表示途中に、思いのほか早くにfalseを返してくるように思える」
でした。すいません!

かば さん 2003年 07月 10日 14時 44分 25秒

はじめまして。
ここのとここWSHを利用するようになり、このページに
大変お世話になっているものです。
現在、IEを自動で動かすバッチを製作中なのですが、
行き詰まってしまいました。どうか、みなさまのお知恵を
かしていただけませんでしょうか?

内容
 VBSを使用しまして、IE5.0をIEオブジェクトで呼び出します。
目的のページを表示させて、表示が「完了した」段階で、sendkeyを用いて
tab、enterを駆使しリンク先へ飛ばせようとしているのですが・・・。

object.Busyで、ダウンロード完了の判定ができるかと思いきや、
どうも不安定になってしまいます。特にフレーム表示のHPだと
フレームが表示の途中でobject.Busyがtrueを返しているように思えます。
どなかたか、IEでページのダウンロード完了を感知する方法をご存知でしたら
ご教授ください。よろしくお願い致します。

きじ さん 2003年 07月 10日 12時 01分 24秒

初めて質問させていただきます。

VBSのfor文中でバッチを呼び出し、for文中の変数をバッチへ渡したいのですが
可能でしょうか?
またげ椎修任靴燭蕕ご教示ください。

よろしくお願いします。

いりや さん 2003年 07月 09日 12時 53分 45秒

kayama さん、

http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/technic.htm#スクリプトの暴走を止める

こちらでしょうか、もしかしたら。

mira さん 2003年 07月 09日 12時 53分 06秒

>むたぐちさん
> 私の理解では、Friendプロパティ・メソッドというのはこういうケースで使うものだと
> 思っています。

ActiveX EXEプロジェクトでFriendを結構重宝します。
アプリケーションのステータスを保持しているオブジェクトのプロパティで、
Property Let はFriend (書き込みはEXEの内側にあるObjectだけ)
Property Get はPublic (読み出しはEXEの外からでもOK)
などという使い方をしています。


>あさじゃけんさん
> しかし、VB.NETって他の言語と一緒になりつつありますね。
> 多言語のいいところを取り入れているんだろうけど、差別化できなくなってるような・・・

VBとC#の機能がほとんど同じなので、VBならではの機能(デバッグ中にコードを
修正できる、とか)がなくなってしまって悲しいです。


kayama さん 2003年 07月 09日 11時 42分 05秒

はじめまして。
VBSで簡単なPGを作っていたのですが,無限ループへ陥ってしまいました。
ここのHPの「Lesson5 その他のフロー制御構文」のところで,対処方法が
載ってそうだったのですが,リンク切れていますので,抜け出し方教えて
いただけないでしょうか。
ちなみに私の場合はWin2000をログオフしました…
以上、お願いします。

あさじゃけん さん 2003年 07月 09日 09時 40分 54秒

>miraさん、むたぐちさんへ

> VBのFriendとC++のfriendは機能が異なります。
うぬぉ!^^;;;(汗汗
ちがうのぉ〜?!(汗)
大変ご迷惑をおかけ致しました(汗)

言語仕様をしっかり把握しないとダメですね^^;;;
生半可に知っているだけに、はまってしまっていたようです。
いやぁ、勉強になりました(^^;;;

しっかし、なるほど、それなら便利なのが分かります。
#でも、friend恐怖症なのは私だけ?(笑)
#使うのに勇気がいりますね(^^;;;

> Try Catch文
あぁ、やっぱりあるんですね。VB.NET(^^;;
むたぐちさん紹介の「@IT」サクっと見ました。
これも、「End」でくくっているんですね。
Try
・・・・・
Catch
・・・・・
End Try
って、なんだかかっこ悪いと思うのは私だけ?(笑)

しかし、VB.NETって他の言語と一緒になりつつありますね。
多言語のいいところを取り入れているんだろうけど、差別化できなくなってるような・・・
今からプログラムを始める人が、本当にVB.NETを覚える必要があるのか、疑問に感じてきましたよ(笑)
(まぁ、よく記事で言われてる話になってしまうのかな?)

#PHP.NETでないかなぁ(爆)
#確か実現しようと思えば、可能だったですよね?^^;;;;(他力本願ですが)

いりや さん 2003年 07月 09日 02時 41分 46秒

むたぐちさん、

> ちなみに、JScriptの昔のバージョンでは、エラー処理が事実上不可能だったんですが、
> ver.5でtry...catch...finallyステートメントが実装されて、VBSより優位に
> 立ってしまいました。

たしかに try...catch...finally ステートメントはありがたい存在ですね。

くわえて、関数もオブジェクトとして操作でき分解したり組み立てたりする
のが自由なので Lisp の大好きな私にはしっくりきます。

それに JavaScript の規格である ECMA-262 をとりよせて読んでみましたが
思ったよりも難しい印象は感じませんでした。
http://www.ecma-international.org/publications/files/ecma-st/Ecma-262.pdf

興味がありましたらご一読を。

管理人むたぐち さん 2003年 07月 08日 23時 56分 24秒

To: あさじゃけん さん & mira さん

私の理解では、Friendプロパティ・メソッドというのはこういうケースで使うものだと
思っています。もっとも、ヘルプを読んだだけなのであまり自信はないですけど。

FileSystemObjectクラスとTextStreamクラスを含むプロジェクトを
例に取ってみます。もちろん実物とは全然違うモンですが分かりやすい例ということで。
FileSystemObjectクラスにはCreateTextFileメソッドを含み、引数に与えたファイル名の
テキストの内容を表すTextStreamオブジェクトを返すという仕様です。

---FileSystemObjectクラス---
 Public Function CreateTextFile(sFileName)
  ...ファイルを生成する処理

  Set oTextStream = New TextStream
  oTextStream.Path = sFileName '←Friend Property なのでエラーにならない
  Set CreateTextFile = oTextStream
 End Function

---TextStreamクラス--- (Instancing=PublicNotCreatable)
 Private sFileName

 Friend Property Let Path(NewValue)
  sFileName = NewValue
 End Property

 Public Property Get Path()
  Path = sFileName
 End Property

 Public Sub Write(sString)
  Me.PathのファイルにsStringの内容を書き込む処理
 End Sub


---上記プロジェクトを呼び出すクライアント---

Set Fs = New Scripting.FileSystemObject
Set ts = Fs.CreateTextFile("C:\a.txt")
'ts.Path="C:\b.txt" '←Friend Property なのでエラーになる
MsgBox ts.Path '←これはGetがPublicだからエラーにならない
ts.Write "あいうえお"


To: あさじゃけん さん

> もしくは代わりに「try〜catch文もどき」でも実装してもらえれば、なおありがたやですね。
> #VB.NETではあるのかな?

しっかりあります(w
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet14/vb6tonet14_01.html

ちなみに、JScriptの昔のバージョンでは、エラー処理が事実上不可能だったんですが、
ver.5でtry...catch...finallyステートメントが実装されて、VBSより優位に
立ってしまいました。

VBSにもこっそり入れてくれれば良かったんですけど、もうVBSは先の無い言語ですし、
永遠に機能追加は無いと思われます。
JScript.NETに進化したJScriptが羨ましいですな。

mira さん 2003年 07月 08日 12時 56分 13秒

>あさじゃけんさん、むたぐちさん

VBのFriendとC++のfriendは機能が異なります。

C++は、呼び出される側のクラスが、呼び出す側の特定のクラスに対して、「家宅捜索(?)」の権限を与えます。
VBは、呼び出される側のクラスが、自分のもつメンバ関数/メンバ変数のうち、「プロジェクト内のクラス
になら公開してもよい」ものを指定します。

C++のfriendはスパゲッティ・コードの元なので使いたくありませんが、VBのFriendは「アプリケーション
オブジェクトのプロパティのうちプロジェクト内部でだけ使用したいもの」などの設定に重宝します。

あさじゃけん さん 2003年 07月 08日 12時 25分 32秒

>むたぐちさんへ
> 途中で飽きて「やーめた」
あぁ、確かに言えなくなりますね(笑)
#言わせなくするのが目的だったり(笑)

と、いうことは、応援しかできないですね(^^;;


> 最近ADSIの質問が少ないですけど、今度来たときはお願いしますね。
私がここ見だしてからは、質問でてないんですよねぇ(^^;;
でも、「お任せください」と言い切れるほど詳しくもなかったり(笑)
簡単にユーザの追加とか問題点が分かっている程度です。(^^;;

しかも8月に退社予定なので、会社辞めるとテスト環境(本番)がなくなる(おぃ)ので、調査できなくなったりします。(過去の資産から取り出すしかないですね)
自分でサイト立ち上げるにしても、今の状況では、ちょっと難しいのです。
必要性がないから、これ以上知識向上が望めないので(汗)
今まで作ったサンプル公開で終わってしまいそう。(まぁそれでも価値はあるでしょうけど。)

> マニアックに使う
この言葉を聞くと、むたぐちさんの人柄が見えてくるですね(おいおい)

> 某掲示板
ちらりと過去ログながめた事があるって程度ですが、今もむたぐちさん人変わりすぎですか?(爆)

> VBSではGoto文は使えないです。
そうなんですが、せめてOn Error Gotoぐらい使えるようにしてほしかったです。
エラー処理に困ってしまいます。
Errオブジェクト使うにしてもErr.Raiseしたら、On Error Nextなんてないでしょう・・・

もしくは代わりに「try〜catch文もどき」でも実装してもらえれば、なおありがたやですね。
#VB.NETではあるのかな?

あさじゃけん さん 2003年 07月 08日 11時 25分 06秒

>けんけんさんへ
レジストリのアクセス権を変更するコマンドラインツールって実はないんですよね。
私も昔探しました。見つかったら教えて下さい(笑)
私の場合は、Windows2000ServerでActiveDirectory構築しているので、グループポリシーで全マシンに適用、解決しました。
某MLで「グループポリシーでできるじゃぁん」と、突っ込まれました(笑)
参考になれば。


>むたぐちさんへ
>XMLエディタ
わざわざありがとうございます(汗)
eXeedが、なんとなくよさげですね。日本語だし。(笑)
細かい仕様は、全部使ってみないとわからないですけど。^^;;

>ワイルドカード
あ。確かにそうですね。複数のワイルドカード使われたときのことも考えてませんでした(笑)
ううむ。意外と難しいかも。^^;;;
とか、思ってからLib30さんの書き込みみたら・・・なるほど・・・簡単ですな(汗)

> While...End While
いや、VBの記述方法だからこそ、わかりやすい点もあります。多分。
#私はあまり恩恵を感じませんが念のため(笑)

処理が複雑になりネストが増えた場合、そのネストを閉じる部分で、
--------------------------------------------------
aaaaaa(){
if()
{
if()
{
if()
{
}
}
}
return 0;
}
--------------------------------------------------
の「}」の対応が分かりにくい・・・というのに対し、
--------------------------------------------------
Sub aaaaaa()
if a=0 Then
if b=0 Then
if C=0 Then
End If
End If
End If
End Sub
--------------------------------------------------
何を閉じようとしているのか、わかりやすい。
とか(爆)
私もそれ以上思いつきません(^^;;


> Friendだからこその利点ってあるんですかね?^^;;
まず、「コンストラクタに引数を与えてインスタンスを作成すること」がFriendの機能じゃないですよね(^^;;;

むたぐちさんも言っているように
「自分自身のクラスモジュールや、プロジェクト内のほかのモジュールからは呼び出せるが、クラスを呼び出すクライアントからは呼び出せない」
と、いうのがFriendの機能です。

で、何が言いたいのかというと、コンストラクタに引数を与えるのに、必ずFriendキーワードが必須かというとそうでもないわけです。

そのクラスにとってみれば、コンストラクタを呼び出して値を与えるのは、外部であって、正しい設計をしていれば、Publicで十分いけると思うのです。
初期値であれば、Privateでいけますし、それ以前に引数を与える必要もないかもしれません。

で、私が思うFriendの使い方は、
「大プロジェクトにおいて、元々Publicで設計して作成されたが、外部から使うこともなく、Privateからしか呼ばれていない。でもいまさら仕様変更すると、修正が大きい為、Friendにして対処しよう・・・」
みたいなことしかないわけです。(かなり忘れてて、うまく説明できないなぁ・・・実際はもっと理由があったと思います。過去経験)


C言語にも同じfriendキーワードがありますが、私の前の会社(開発です)では、「設計時は”friend”はつかうな!」とおたっしが出ておりました。

ただし、C言語のクラスに絡む話であれば、以下のようなことがあります。
唯一、私が「friendならでは」と思うものです。
--------------------MSDNライブラリより抜粋-----------------------
全メンバ関数が特定のクラスのフレンド関数であるクラスをフレンドクラスといいます。フレンドクラスのメンバ関数から別のクラスのプライベート関数およびプロテクト関数にアクセスできます。

// フレンド クラスの例
class YourClass
{
friend class YourOtherClass; // フレンド クラスの宣言
private:
int topSecret;
};

class YourOtherClass
{
public:
void change( YourClass yc );
};

void YourOtherClass::change( YourClass yc )
{
yc.topSecret++; //プライベートのデータにアクセスできます
}
----------------------------------------------------------------
#C言語での例ですみません(汗)
#これと同じことがVBやVB.NETでできるのかは、わかりません(汗)

でも、この作り方は、どこから何を呼び出しているのか、処理を追うのが大変になり、バグを出したときに、切り分けが難しいので、私は使わないようにしていました。
#私が思うに、オブジェクト指向の反則技、裏技です(笑)
#プライバシーの侵害ともいいます(笑)

しかも、このクラスの例では「オブジェクト指向」という考え方からも外れているフシがあります(笑)
#つまりこれを「設計が間違っている」と言ったわけですね。
#「こういうクラスは作るべきではない」=「クラスの設計が間違っている」

で、繰り返しですが、考え方と処理を難しく複雑にするだけで、「Friendでなければ出来ない処理というのは無い」と思ってます。

・・・と、いうウンチクでよかったですか?(笑)
正直なところ、使ったことないから、分かってないともいいます(汗)

Kei さん 2003年 07月 08日 10時 35分 13秒

〜 むたぐちさんへ 〜

>関係ない話ですが、VB.NETでは、While...Wendは、While...End Whileに変わりました。
>http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vastmwhileendwhile.asp
>
>何でわざわざ変えたのか良くわからんのですが…。
>「言語の整合性のため」と解説しているサイトがあるんですが、
>それならDo...LoopがDo...End Doにならなかった理由がわからなくないですか?
確かに、なんでDo...Loopはそのままなんだろ・・・?
・・・と思っていたら、

>あ、今気づきましたが、HogeHoge...End HogeHoge型とHogeHoge Nantoka...Kantoka型の
>二種類に統一したってことですな。
を読んで納得(笑)。
Propertyステートメントの方も見てみましたが、
今までのGetとLetが1箇所にまとまる(?)ような形式になったのですね。
何となく違和感があるけど、慣れるとこの形式の方が分かりやすいのかも。

>それよりDo...LoopがあればWhile...Wendって要らないと思いません?
>いっそのこと廃止すれば良かったのに、と思うのもまた私だけなんでしょうか。
そうですね。
Do...LoopでWhile...Wendと同様のループ処理が出来ますし、
Do...Loopの方が柔軟にループの条件を書けますからね。
ちなみに私は、While...Wendは使った事がありません(^^;
まぁ、会社の先輩からDo...Loopで書くように洗脳されたというのもありますが(笑)

じみぃ さん 2003年 07月 08日 10時 25分 27秒

管理人さま。

丁寧な解説ありがとうございました。
それにしても2chもご覧でしたかゥイ笋辰僂蝓」

今後ともよろしくお願いします。

管理人むたぐち さん 2003年 07月 08日 03時 13分 56秒

To: じみぃ さん

Now関数の仕様というよりは、VBにおける日付型(Date型)の仕様ですね。
VBの日付型とは、実は内部的にはdouble型の浮動小数点の値として扱われています。
1899年12月30日0時0分0秒が0であり、それ以前が負の数、それ以降が正の数になります。
そして小数点以下の値が、24時間=1.0とする割合で時刻に換算されるわけです。
詳しくはこちら。
http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vadatdate.htm

0時0分0秒の場合は時刻の値を省いて文字列化するという仕様は、
ちょっと探してみたところ明文化はされていないようですが、
日付と時刻を同一のデータ型で賄っている以上、この仕様は妥当だと思います。

MsgBox Date とやって、"2003/7/8 0:00:00"と表示されたら「?」と思うでしょう?
同様に、MsgBox Timeとやって、"1899/12/30 2:19"と表示されてもビックリするので
そうは表示しないわけで、色々と考えられているわけです。

ただ、MsgBox #1899/12/30 12:34:56#とやると"12:34:56"と表示されるのは何か
釈然としないものがありますけどこればっかりは仕方ないでしょう。1899年12月30日を
表現したくなる可能性は極めて低いですしね。
12月30日 今日は何の日〜毎日が記念日〜 http://www.nnh.to/12/30.html
によると、1899年12月30日には大きな事件はなかったようですし。

あとついでに、VB6までとVB.NETでは、日付型の中身が全然違うというお話。
VB6の日付型に関するもう少し突っ込んだ考察もあるので参考になります。
@IT:連載:プロフェッショナルVB.NETプログラミング 第5回 日付時刻の取得とフォーマット
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet05/vb6tonet05_01.html

ついでに某所でみつけた、「今月末の日付を求める方法」。目から鱗です。
MsgBox DateSerial(Year(Now), Month(Now)+1, 0)

そして、2chのWSHスレ(http://pc2.2ch.net/test/read.cgi/win/1022248379/)の
名無しさん募集中。。さんによる回答はこれだったわけです(w
(ちゃんと見ているのですよ、、、( ̄ー ̄))
お前ら、wsh使ってますか?関連スレ
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1022248177&res=39&fi=no

VBSにはFormat関数がないので、こういう関数を自前で用意すると良いわけですね。
もっとも、実際はそこまで汎用的にすることもないでしょうから、もっと簡単に済ませることが
できるでしょうけどね。
しかしまあ、気合を入れるとここまでやる必要があるんだなあと思った。asEraが凄いなあ。

(次スレどうしようかね…)


To: 宝 さん

> regeditのレジストリファイルの書き出し

一番楽なのは、regedit.exeをWshShell.Runで実行してやることです。
regedit.exe /e C:\all.reg
のように/eオプションをつけると、全キーを書き出したレジストリファイルがC:\all.regに
作成されます。

ちなみに、特定のキーだけを出力するには、コマンドラインで
regedit.exe /e C:\wsh_key.reg HKEY_CURRENT_USER\Software\Microsoft\Windows Script Host
のようにします。


To: いりや さん

> うーん、何と何の整合をとるためなのでしょうね

おそらく、VBのほかの構文に合わせてという意味なんだと思います。
特に、VB.NETではProperty Getが Get...End Getになったりと、
HogeHoge...End HogeHoge型の構文が増えましたしね。

あ、今気づきましたが、HogeHoge...End HogeHoge型とHogeHoge Nantoka...Kantoka型の
二種類に統一したってことですな。
つまり、ステートメントの開始を示すキーワードが一つの場合は、「End そのキーワード」で終わる、
ステートメントの開始を示すキーワードが二つ以上の場合は、別のキーワードで終わる、というわけです。

While...Wendは、ステートメントの開始を示すキーワードが一つだから、
HogeHoge...End HogeHoge型に変えられたわけですね。納得。

…Ifがそもそも法則に従ってないな…。
{}でステートメントを括る言語の方が、こういうしょうもないことで悩まなくて済んでいいですなー。

いりや さん 2003年 07月 08日 02時 10分 36秒

むたぐちさん、

> 関係ない話ですが、VB.NETでは、While...Wendは、While...End Whileに変わりました。
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vastmwhileendwhile.asp
>
> 何でわざわざ変えたのか良くわからんのですが…。
> 「言語の整合性のため」と解説しているサイトがあるんですが、
> それならDo...LoopがDo...End Doにならなかった理由がわからなくないですか?

うーん、何と何の整合をとるためなのでしょうね、私もちょっと思いつきま
せん。どこかのポピュラーな BASIC 言語処理系ではそうだったのかな?!

> それよりDo...LoopがあればWhile...Wendって要らないと思いません?
> いっそのこと廃止すれば良かったのに、と思うのもまた私だけなんでしょうか。

どうでしょう・・・私の場合ですと、ループの本体を一回だけやって後は条
件式を満足しない限りすぐループを出るときなんかは、do...loop を使いま
すが、そうでない場合は while...wend をと、使い分けています。

逆に do...loop 相当が構文として用意されていないプログラミング言語処理
系に遭遇することがあり、そういうときは while...wend でまかなっていま
す。

さん 2003年 07月 07日 23時 14分 45秒

初めまして、早速質問で申し訳ないのですが、
スクリプト(WSH,VBS)で、regeditのレジストリファイルの書き出し
(範囲は全て)と同じ事を行いたいのですが、色々調べても解らず書き込みさせて
いただきました。

環境はWin2000です。
よろしくお願いします。

じみぃ さん 2003年 07月 07日 21時 21分 19秒

管理人様、ありがとうございました。

> Now関数で取得した日付型データをそのまま文字列として利用するのは
> 稀だと思うので、特に実害はないでしょう。

それがNow関数の戻り値をスペースで区切って配列に格納する、という
処理をしてたんです,靴C00:00:00にテストをせずにゥ・
結局はDateとTimeでの処理にしたんですが。

ところで管理人様のおっしゃるNow関数の仕様についてはMSから情報は
出ているのでしょうか,感擬「い燭世韻襪塙「い任后

教えていただいてばかりで恐縮ですがよろしくお願いします。

管理人むたぐち さん 2003年 07月 07日 18時 43分 36秒

デザインパターンって何か面白そう。

Java言語で学ぶデザインパターン入門 http://www.hyuki.com/dp/index.html
(Java覚え書き)GoFデザインパターン一覧 http://www.dmz.hitachi-sk.co.jp/Java/Tech/pattern/gof/list.html
VB.NETとC#でデザインパターン http://hccweb1.bai.ne.jp/tsune-1/index.html
ギコ猫とデザインパターン http://www.hyuki.com/dp/cat_index.html
☆ エロゲーで学ぶデザインパターン ☆(プログラム言語で会話するスレ) http://www2.bbspink.com/test/read.cgi/erog/1032797915/48-


To: あさじゃけん さん

> XMLエディタ

フリーのものをいくつか探してみました。

Microsoft XML Notepad http://www.devhood.com/tools/tool_details.aspx?tool_id=261
(↑昔は日本語版もあったはずなのだが見つからない…。英語版も何故かMSのサイトからは
ダウンロードできなくなっているし、よく分からない。
参考:http://msdn.microsoft.com/msdnmag/issues/01/09/web/default.aspx)
eXeed :: Home http://www.aparto-soft.com/eXeries/eXeed/index.html
Peter's XML editor http://www.iol.ie/~pxe/

> Friendだからこその利点ってあるんですかね?^^;;

私は最近クラスに目覚めて、とりあえずヘルプに載ってる例がProperty Letの用法だったんで、
ああそういうものかと思ったわけですが。
前回書いたように、コンストラクタに引数を与えてインスタンスを作成することが
VBではできないので、その代用という認識ですがそうでもないんでしょうか?

> ワイルドカード

再帰的にフォルダを検索して、全ファイル・フォルダのフルパスを格納、
それに対して検索式と逐一チェックさせるというのは、もっとも簡単な処理ですよね。

でも、効率的にやろうと思うと、もうちょっと高度な展開をする必要がありそうです。
たとえば“C:\a*\*.txt”とかなら、C:\hogehoge\配下をサーチする必要は無い、とかですね。

ちなみに、ワイルドカードを正規表現に変換する例は過去に投稿されてますので
こちらも参照ください。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list59.shtml
Lib30 さん 2002年 03月 11日 20時 17分 50秒
Lib30 さん 2002年 03月 12日 23時 11分 17秒
ですね。


To: さざなみ さん

ShowBrowserUIメソッドなんてあったんですね。
私の記憶にないということは、IE4/Win98の時代には無かったメソッドなんでしょうたぶん。
ShellUIHelperオブジェクトの日本語解説ページは無かったと思います。

というより、本家MSの英語ページ(Shellのオートメーションのページ)にすら、
IE5/Win2000からの追加メソッドに関して記述がありませんな。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/objects/shelluihelper/shelluihelper.asp

こっちにはあるけど…。
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/external/reference/objects/shelluihelper.asp


To: はなぶさ さん

VBSではGoto文は使えないです。

ある意味、VBSはVBよりスマートな言語だと思ってしまうのは私だけでしょうか。
少なくともVBよりすっきりしてて私は好きです。


To: いりや さん&Kei さん

関係ない話ですが、VB.NETでは、While...Wendは、While...End Whileに変わりました。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vastmwhileendwhile.asp

何でわざわざ変えたのか良くわからんのですが…。
「言語の整合性のため」と解説しているサイトがあるんですが、
それならDo...LoopがDo...End Doにならなかった理由がわからなくないですか?

それよりDo...LoopがあればWhile...Wendって要らないと思いません?
いっそのこと廃止すれば良かったのに、と思うのもまた私だけなんでしょうか。


To: さとまる さん

> ということで(?)このようなVBSと関係無いことが書き込める掲示板を追加してもらいたいです。

実は3年くらい前にその構想が持ち上がったことがあったのですが、
結局やめてしまいました。
理由は色々ありますが、一つはこのサイトがあくまでWSH関係のサイトであり、
そこから離れた掲示板を用意するのは果たしていかがなものか、という疑問が
頭をよぎったためです。
あと、掲示板が複数あると、話題と人が分断して、結果それぞれが過疎化してしまう危険も
あると思ったからです。

そんなわけで、この掲示板は「基本はWSHの話、だけどついでに他の話もしちゃうのはOK」
って感じでやってます。それで一応4年間うまくいってますし、この基本路線は
変える気はあんまりないです。

他に、なんでこんな使いにくい掲示板スクリプトをいつまでも使ってるんだという声も
あるでしょうけどこれにもちゃんと理由があります。

1. タイトルが入れられない
個人的に、タイトルは必要ないと思ってます。というか、私がタイトルを入れようとすると
ほとんどが「お返事」というタイトルになっちゃいますし、表題的なことが必要なら
本文の一行目に書けばいいですしね。
つねに本文が表示される形式の(つまり、タイトルのみのリスト表示ができない)
掲示板においては、タイトルは要らないというのが持論ですはい。

2. ならなんでツリー式にしないの?
ツリー式だと、テーマ以外の話をしづらいからです。
仮にテーマ以外の話をしても、そのテーマに興味が無い人には読まれない可能性が高いので、
する気がなくなります。
それと、異なったテーマの結合という技が使えないので好きじゃありません。

3. それにしてももっとマシな掲示板スクリプトがあるだろうに…
このHi-HO謹製のスクリプトは、シンプルで使い勝手はあまりよくないですが、
シンプルなだけに良いこともあって、一番いいのはログのアドレスが不変であり、
そのログへの直リンクが張られているということですね。
これの何が良いかというと、Googleに確実にクロールしてもらえるという点です。

他にも半角カナが使えないとかありますけど、半角カナが本来インターネット上では
イレギュラーだってことに気づくいいきっかけになりますし、これはこれでいいかな
とも思ってます。某ちゃんねるとかに入り浸ってると忘れがちですがね。

…決して面倒だから変えてないんじゃないですよ。ええ、そうに決まってます。


To: あさじゃけん さん

> お手伝いしますよ(^^

いやぁ、そう言っていただけると嬉しいですけど、他人の協力を求めると、
途中で飽きて「やーめた」とか言えなくなるので遠慮させてください。

> ADSI

最近ADSIの質問が少ないですけど、今度来たときはお願いしますね。

> 「WSHでやるべき事とプログラム言語でやるべき事」

これも以前どなたかが提案されてたような気がします。
結局、私としては、WSHでできないことなどないのだ!と(気持ち的には)言いたいので、
そういうコンテンツをあえて設けることは消極的だったりします。
WSHをこれから始める方、実用的なレベルで使おうとしている方にとっては、有用な資料に
なることは分かってるんですけど、私は実用性はともかく、「マニアックに使う」のが好きなので(w


To: じみぃ さん

> タスクスケジューラ等を用いて00時00分00秒に"Now"関数を
> 実行させた場合の戻り値には、時刻が含まれていません。

VBSの日付型データを文字列として取り出す際、00時00分00秒なら
それを省いて表示するという仕様なわけです。
(ちょっと考えると、これが妥当な仕様であることが分かると思います。
日付だけを扱う場合、時刻の値は必要ないですからね)

Now関数で取得した日付型データをそのまま文字列として利用するのは
稀だと思うので、特に実害はないでしょう。

逆に言うと、Now関数の返り値をそのまま文字列に変換できるというのは、オマケ程度に考えた
方がいいです。
数値や文字列として欲しい場合は、Year,Month,Day,Hour,Minute,Second等の関数を用いるべきですね。
あるいは、Date関数とTime関数を併用すればOKかと思います。

余談ですが、
dTime = Time
MsgBox Year(dTime) & "/" & Month(dTime) & "/" & Day(dTime)
とかやると興味深い結果が得られます。

これを踏まえると、

dTime = DateSerial(1899,12,30)
MsgBox dTime

が"0:00:00"になる理屈が分かると思います。


To: けんけん さん

> administrators権限を持つユーザで
> レジストリのアクセス権を変更する

WMIを使えばアクセス権をチェックすることはできますが、変更することはできなかったと思います。
http://www.microsoft.com/japan/technet/treeview/default.asp?url=/japan/technet/scriptcenter/registry/scrreg01.asp

多分コマンドラインツールがあると思いますが、探してません。

けんけん さん 2003年 07月 07日 16時 00分 59秒

>半角カナは絶対に使わないでください ΑΑヲ
マナーが悪く申し訳ありません,發Π貪拿颪C擦督困C泙后

はじめまして。
お尋ねしたいのですが、administrators権限を持つユーザで
レジストリのアクセス権を変更するスクリプトを書きたいのですが、
WSHで可能でしょうか?
また、WSH以外(VBなど)でやる方法がもしあれば教えてください。

けんけん さん 2003年 07月 07日 15時 58分 24秒

はじめまして。
お尋ねしたいのですが、administrators権限を持つ娑枝で
攫渊椿の姥晶権を変更する集慳瀋を書きたいのですが、
WSHで可能でしょうか?
また、WSH以外(VBなど)でやる方法がもしあれば教えてください。

じみぃ さん 2003年 07月 07日 15時 34分 37秒

皆さんはじめまして。

早速お尋ねしたいのですが、"Now"関数の戻り値は通常"<日付> <時刻>"だと
思うのですが、タスクスケジューラ等を用いて00時00分00秒に"Now"関数を
実行させた場合の戻り値には、時刻が含まれていません。
Windows2000Serverでしか確認をしていないのですが、どなたか同じような
現象に出会った方はいらっしゃいますか?
これは既知のバグなのでしょうか?

ご教授のほどよろしくお願いします。

あさじゃけん さん 2003年 07月 07日 10時 06分 47秒

>さとまるさんへ
むたぐちさん、名前間違えられるの、なれてるそうなので(笑)
私も過去2度ほど、間違えた人に、つっこみ入れたことあったんですが(笑)

>むたぐちさんへ
おおぉ。いいですねぇ。ぜひ頑張って下さい!

私も最近自サバ立てたので、WSH関係すこし、やろっかなぁなぁんて考えていましたので。
むたぐちさんが更新してくれるなら、必要ないですし(爆)
お手伝いしますよ(^^

私は、ADSI関係なら少し頑張れますよ(笑)
実務で使ってますので。(これをやるためにWSH勉強したんです)
私はADSI使うためにWSHがあると思ってます。(というぐらい便利になるんです)
ADSI無しでWSHは語れません(おぃおぃ
あ。でもむたぐちさんがサポートできないなら意味がないのかなぁ。

さとまるさんに便乗ですが、質問専用掲示板と通常の掲示板を分けるのもありかとおもったりします。
とくに質問専用の方は、OSやWSHのバージョンなど環境をある程度選択できるように、すれば、質問者もしやすくなるかと思います。
その際は、「BBSで質問をするときの注意。(明記すべき必須項目とか)」なんてのも必要かと思います。

あ。
あと「WSHでやるべき事とプログラム言語でやるべき事」というのはどうでしょう。
WSHでやれなくもないが、それをするならVBで作るべきだ・・・とか、これぐらいならWSHでやっちゃいましょう。みたいな。(^^;;

初心者の方が「これをやりたい。」というところから、「どうやってやるんだろう。」「どうすればいいんだろう」と考え、それをみて判断できる内容が、まとまっていれば、補助になると思ったりしました。

「あ、これはWSHでできるんだ。」「あ、これはWSHでは難しいんだ」というレベルが分かればなおいいかも知れません。
(でも、文章かくのが難しそう・・・)

WSHを理解している人にとっては、それぐらい、ピンとくるのですが、まったくの初心者にとっては、「WSHで何ができるのか」は分かりません。
その判断が出来るだけでも、かなり違って見えてくると思うんです。

と、ちょっと熱く語ってしまいましたが、無理は言いません^^;;;;
力になれることがあれば、いつでもいって下さい^^

さとまる さん 2003年 07月 06日 21時 18分 56秒

個人的なことです。
管理人むたぐち さんへの謝罪
ごめんなさい。名前を今まで間違って覚えていました。(度が過ぎた勘違い)
その名前を "過去の記事リスト85(2003年06月20日10時06分47秒 〜 2003年06月26日13時40分43秒)"
で使ってしまいました。
お許しを・・・。

ということで(?)このようなVBSと関係無いことが書き込める掲示板を追加してもらいたいです。(↓への意見)

管理人むたぐち さん 2003年 07月 06日 10時 07分 14秒

この掲示板も4周年だし、いい加減FAQ集でも作った方がいいかな、
いや、いまさらだろう…。とか思っていますが、適当に目次だけ作ってみました。
中身を書くかどうかは別として、以下の内容が、この掲示板で扱われた
ことの8割くらいを占めてるんじゃないでしょうか?
他に何かあるようでしたら追加してみてください。

繰り返しますが、中身を書くかどうかは別の話です!


この掲示板で扱うこと
・VBS、WSH、HTAを中心としたWindows上におけるスクリプト技術と周辺技術
・ADSI/IIS/ASP/データベース→管理人があまり詳しくないから回答は期待しないでね
・VBはスクリプトから離れすぎない範囲で程々に扱う

情報のありか編
・うちのページには何がある?
・最新情報はMSの公式ページ
・ファイル操作など基本的なことはまず公式ヘルプ
・系統的に学ぶなら本もいいかも(入手可能な書籍一覧)
・TechNetのあれ(やりたいことで調べる)
・ProgIDの探し方
・Web上にある有用なCOMコンポーネント(有名どころをいくつか列挙)→詳しくはリンクページを
・エディタはコレだ!
・メソッドやプロパティはVBのオブジェクトブラウザ・VBAヘルプ
・Shell.Applocation(リファレンスの所在)
・DHTML(リファレンスの所在)
・HTA(リファレンスの所在)
・WMI(リファレンスの所在・オブジェクトブラウザ)
・掲示板ログ(AKiOSさんのスクリプトを使う方法・Googleで検索する方法)
・リンク先
・Google
・NetNews
・ML
・2ch

FAQ
・ウィルス・ワーム関係
・バージョンと機能(VBS/WSH/Shell.Application/Office)
・"を含む、またはスペースを含むパスをWshShellで実行する方法
・コマンドライン長に制限がある
・Shift_JISのバイト数が調べられない
・HTMLでCreateObject、セキュリティ関係→HTA
・スクリプトをデコードしたい
・スクリプトをデバッグしたい
・WSHの読み方がわからない!
・WSHって危険?
・VBSやJSは嫌いだ→PerlScript、ActiveScriptRuby

VBでのあれはVBSではどうなるの?(VBで動いたコード・VB用のサンプルが動かない…)
・型の問題
・Goto文→構造化構文
・スクリプトを終了する/End→WScript.Quit、window.Close等
・引数名つきオプション→省略せず列挙
・自分自身のパスを知る/App.Path→Wscript.ScriptFullName/location.path
・アプリを実行する/Shell関数→WshShell.Run
・ファイル操作→FileSystemObject
・DLLを利用/Declare→DynaCall
・コマンドライン引数→WScript.Arguments
・定数→Constで宣言/WSFのreference
・クリップボード→COMコンポーネント・IE併用
・レジストリ(とくに列挙とバイナリの扱い)→WshShell.Reg*/WMI
・コモンダイアログ→開発環境があれば使える/BrowseForFolder/etc
・制御を空ける/Win32API Sleep関数、DoEvents→WScript.Sleep
・ウィンドウをアクティブにする/AppActivate→WshShell.AppActivate
・ソケット/WinSock→COMコンポーネント
・StrConv

常套テクニック
・アプリケーションを終了する方法
・作業中にダイアログを出す方法
・Webページのダウンロード
・イベントのバインド
・バイナリのダウンロードとバイナリファイル処理
・複雑な文字処理→正規表現
・InputBoxでキャンセル押したことを確認
・ソート処理
・再帰処理
・WMIのリモート実行
・コマンドラインツールとの組み合わせ(標準入出力)
・環境変数
・ショートカット
・ネットワーク
・クラスのお話→Class/WSC

はなぶさ さん 2003年 07月 04日 16時 10分 20秒

いりや さん、 Kei さん ありがとうございます。
なにか先が見えたみたいです。これから頑張ります,
今後ともよろしくお願いします。


Kei さん 2003年 07月 04日 15時 13分 52秒

初っ端からやってしまいました(^^;
Do...WhileじゃなくてDo...Loopですね。

いりやさんのように説明も載せるべきでした。
反省反省・・・。

いりや さん 2003年 07月 04日 14時 37分 28秒

| 外してるかもしれませんが、ループ処理をするのであれば
| Do...Whileステートメントが使えるのでは?

msdn だとこちらが参考になるかな。

| Visual Basic Scripting Edition
|
| Do...Loop ステートメント
| 指定された条件が真 (True) である間、または条件が真 (True) になるまで、
| 一連のステートメントを繰り返し実行するフロー制御ステートメントです。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vsstmdo.asp

| Visual Basic Scripting Edition
|
| While...Wend ステートメント
| 指定された条件が真 (True) である間、一連のステートメントの実行を繰り
| 返すフロー制御ステートメントです。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vsstmwhile.asp

| Visual Basic Scripting Edition
| VBScript
| VBScipt ユーザーズ ガイド
| VBScript ランゲージ リファレンス

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vbscripttoc.asp

Return