いろは さん 2003年 07月 30日 07時 47分 36秒

>あさじゃけん さん

よく見ると、前回「あじゃけん」さんと書き間違えておりました。大変失礼いたしました。

いただいたコードを、本番環境で動かしてみました。ユーザ一覧、少し修正して
グループ一覧、今までどうしても得られなかったものが、こんな簡単なコードで
目の前に見る見るうちに展開されて、まるで夢を見ているようでした。

ところがその日のミーティングで、正式に「ADSIは使ってはいけない」ことが
決まって、本当に夢になってしまいました。お世話になったのに、どうも申し訳
ありません。

与えられたDLLでは、いまだにユーザ一覧すら取得できていません。情けなくも
もうへとへとです。場違いで恐縮ですが、どなたか、VB6でWinAPIと、文字列を
含む構造体配列のやり取りの仕方をご存知の方はいらっしゃらないでしょうか?

ADSIについては、今後とも勉強していきたいと思います。ありがとうございました。

>いりや さん
メールありがとうございました。


いろは さん 2003年 07月 30日 07時 35分 54秒

>管理人むたぐちさん
>Wsh is not SHell script とかどうです?

なるほど、と思いましたが、考えてみると、このやり方だとどんな単語でも
当てはまってしまいませんか?

リチャード・ストールマンは自分のプロジェクトに ○NU is Not Unix
という名前を付けるために、ANU, BNU, ...ZNUまでのすべてのつづりの中から
英語に実在する単語を探して、その中から自分の好みの単語を選んだのだそうです。gnu(ヌー)はウシカモシカという動物を指す単語だそうです。だから
GNU(グヌー)プロジェクトのトレードマークは、あの変な牛のような動物
なのですね。

野暮なことを書いてすみません。

いりや さん 2003年 07月 30日 00時 09分 27秒

いろはさん、

| ・これは大きな案件で、私の勤める会社が関わっているのは、全体のごく一部
| です。そしてこれらの社員情報にアクセスするためのライブラリも提供されて
| いるのですが、これは構造体の配列を受け渡すDLLで、VBScriptからは直接扱
| えないものでした。他の会社はVB.NETを使っているから何とか使えるのですが、
| うちはASP、WSHなので…。

もしよろしければ iriyak at mcn.ne.jp (at は @ とよみかえてくださいな)
にもう少し詳細な背景をメールいただくことは可能ですか??

わたしもたぶん非常に近い業界で非常に近い業務にたずさわっておりますので、
つっこんでお話したいとおもっています。

が、なにぶん、どなたでも自由に読書きできる掲示板です、話せること話せな
いこと話してはいけないこと話さないほうが望ましいことの境界があるでしょ
う。わたしは ActiveDirectory はいいとおもいますが、ビジネスの話につち
えはたぶんローカルの方がいいかと思い、お返事をさしあげました。

いりや

zume さん 2003年 07月 29日 18時 25分 49秒

AKiOSさんの記事検索プログラムを使わせていただこうとしたのですが何故か記事のダウンロードと検索ができませんでした。
そこで、wgetというプログラムと下のようなファイルを用意したところファイルの取得と記事の表示ができました。しかしまだ検索ボタンも私の環境では動きません。
環境はWindows2000sp4 + IE5.5 + Windows Script Host5.6です。
どなたかお心当たりありませんでしょうか。

(参考)
--test.bat
wget -r -l 1 -np -nd http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/index.shtml

--WshLab.ini
download.command=test.bat

--Wget
http://www.interlog.com/~tcharron/wgetwin.html
(私のインストールしたバイナリとは違いますが動くと思います。)

かば さん 2003年 07月 29日 17時 56分 29秒

はちゃめちゃな文章ですいません(汗

あれからもう一度調べたんですが、オートメーションオブジェクト(IE)の
インスタンスを作成した後に、リンク先を”Shit+クリック”で開き、
そのあたらしく開いたIEのインスタンスを作成したいということです。
うまく伝わるでしょうか?(自信なし

なぜ、こうなったかといいますと、フレームで作られたHP(aspを使用)で、
フレームそれぞれのIEオブジェクトを取得したかったからです。
しかし、うまくできなかったので、トップのソースからフレームの中のアドレスを
取得しまして、そこへジャンプし操作をしようと試みました。
 そこで、その子フレームを新たに開き、そのページのリンク先にアクセスすると
新たなウインドウが出てきてしまいます。きっとフレームの設定のせいだと思うんですが・・・。
 本当はそのサイトをご紹介できればいいんですが、
業務に関係するものなので、文章で失礼しました。

以下コードです。ちょっと大きくなってしまったので、
省略してかきます。


'最初にIEを立ち上げます
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set objIE = WScript.CreateObject("InternetExplorer.Application")

objIE.Visible = True
objIE.Menubar =1
objIE.Statusbar = 1
objIE.Toolbar =1
'objIE.Navigate "http://127.0.0.0/web/start.asp"

Dim stime 'インターバル

'///////////////////// IE のDL完了待ち
While objIE.busy
wscript.sleep 1000
Wend
'/////////////////////////////////////////


WScript.Sleep 2500
WScript.Sleep stime
WSHShell.SendKeys "%d"

〜ここでキーメソッドを使って目的のリンク先へ操作します〜

WSHShell.SendKeys "{ENTER}"
WScript.Sleep stime


'///////////////////// IE のDL完了待ち(省略)


Wscript.sleep 5000

Set document=objIE.Document 'ここでドキュメントを読み込みます
For Each element In document.all
If element.TagName="HTML" Then
If Reg(element.OuterHTML,"売上データ") Then
End If
Exit For
else
WScript.Sleep stime
End If
Next

'///////////////////// IE のDL完了待ち (略)


〜ここでキーメソッドを使って目的のリンク先へ操作します〜
(リンク先をクリックすると新しいIEが立ち上がり、ページが表示されます)


'///////////////////// IE のDL完了待ち(略)

Wscript.sleep 5000

set document=objIE.Document
For Each element In document.all
If element.TagName="HTML" Then
msgbox(element.outerHTML) 'ここで新しく開いたIEのドキュメントを取得したい、
msgbox(document.body.outerHTML) '

End If
Exit For

else
WScript.Sleep stime
End If
Next

以上です。長くてすいません(汗)
よろしくお願いします。

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

To: いりや さん

> | いまだに
> | WshShell.Run """"C:\Program Files\Internet Explorer\iexplore.exe""""
> | なんて表記しなきゃならないのは、やっぱどっか気持ち悪くないですか?
>
> たしかに " を四つも重ねることをプログラマに強いるのはどうかと思います
> ね。

すいません、よく考えてみたら"""....."""ですね。
まあこういうミスを誘発しやすいという意味でも…。


To: いろは さん

> WENDの語源ですが、私はこの構文を知った当初から While END の略だと信じて、疑ったことは
> ありませんでした。

おそらくそっちが正解なんでしょうね。
私はBASICの時代からプログラムしていたわけではないんで、そこに気づかなかったという
ことかもしれません。
というのも、BASICは大文字が基本で、WENDと表記しますが、VBSだと普通Wendと書きますからね。
これだと一単語と錯覚しても無理ないです。

まあ真実はBill Gatesに聞かなきゃわかんないことでしょうが、
英単語wendとの巧妙なダブルミーニング説も一応主張しときます。

> WSHの語源

こちらも狙ってネーミングした可能性がありますね。
Windowsにはシェルスクリプトもないと馬鹿にされてたことに対する、
意趣返しのようなものかも。

GNU風に、
Wsh is not SHell script とかどうです?

> VMS → WNT

知らなかったんですが、これがWindowsNTの語源ですか。
IBM → HALと同じ原理ですね。

そういや当初はNew Technologyの略とされてましたが、今じゃ
Based on NT Technologyだとか表記されるようになり、NTは一つの単語ということに
されてるみたいですね。

ほかにもC# = C++ ++ という噂もありますね。


To: あさじゃけん さん

> xcacls.exe

Professionalにはcacls.exeしかありませんでした。
これはリソースキットか何かについてるんですかね?

> ぁあぁ、.NET勉強せなあかんなぁ(笑)

VB.NETでいきまっしょい!
http://santamartaofthepeace.hp.infoseek.co.jp/ikimasshoy/index.html
ここでVB6とVB.NETの文法の違いを覚えて、

@IT: 連載 VB.NETプログラミング
http://www.atmarkit.co.jp/fdotnet/vb6tonet/index/index.html
ここでVB6のコードがVB.NETではどう記述できるかを学ぶと、いい感じで移行できるん
じゃないでしょうか。
私なんか、VB.NETの製品を買わなくてもVB.NETを覚えた気になりましたよ(w

KEN's .NET http://www5b.biglobe.ne.jp/~yone-ken/VBNET/index.html
ここを読むと、VB.NETの製品がなくても.NET Frameworkの再頒布パッケージ
に含まれるコンパイラだけで、Windowアプリも作れるようになったりします。
といってもさすがに手動でコントロールの初期位置とかを数値指定していくのは
つらいものがありますが。

あとは.NET FrameworkのSDKですね。
どこかに.NET Frameworkの良い入門サイトってないかな。
さすがにSDKを総当りするのは死ねますから。

> でも、きっと、日本語基準のプログラム言語ってあっても、流行らないだろうなぁ・・・とか思いつつ。
> ・・・どこかで、そんなのがあったような気がしますね(汗)

日本語で書くプログラム言語といえば、ひまわりとかMINDとかですね。
VBでも変数名は日本語を使えたりしますが。
(VBSでは不可能)

純日本産のプログラム(スクリプト)言語といえばRubyですが、別に日本語で書くわけじゃないですね。
ある程度プログラムになれたら、英語の方が書きやすいし見やすいしと思います。

余談ですが、ひまわりの公式ページに書いてあるWSHの説明は納得いきません。
> Windows標準のプログラム言語 WSH(Basicを拡張したもの)
それはちがーう。


To: zume さん

DHTMLビヘイビアに関しては、全然知識がなかったりします。
というわけで、これもどなたか分かる方に丸投げさせてください。
(WSCとはXMLの構文が違うんですねえ…)


To: かば さん

Set NewWindow=IE.document.parentWindow.open()
Set NewDocument=NewWindow.document
とかができないということですか?

ちょっと良く分からないので、該当部分のソースを書いてもらえますか?

かば さん 2003年 07月 29日 15時 36分 53秒

前回はありがとうございました。
あれから、VBSを利用してIEの自動操縦をいくつか作成しております。
いつも大変お世話になってます。
 今回もまた質問をさせていただきます。
過去ログも前回よりはみてみたのですが、見つけられませんでした。

 IEオブジェクトのdocumentを使用してソース?を読み込んでいます。
そのIEのなかで新たなウインドウをオープンさせたのですが、
最初にIEオブジェクトを設定したdocumentしか返せませんでした。
 オブジェクトや、documentの再宣言が必要だと思い、試してみたのですが
エラーがでてしまいうまく行きません。
(新たなIEをアクティブにして再宣言の行を書き込みました。)
やはりIEのオブジェクト等は、宣言して開いたIEでしか、
そのメソッドは使えないのでしょうか?それとも根本的に
間違えているのでしょうか? ご教授お願いします。



zume さん 2003年 07月 29日 11時 24分 30秒

はじめまして。zumeって言います。
ビヘイビアについて調べているときにここにたどり着きました。
見当違いの質問をしているようでしたら申し訳ありません。

ビヘイビアを使ったHTMLページを作成していますがその中でわからないところがあります。
やりたいのは、フォームの送信ボタンを押すときにonClickイベントを拾って確認ダイアログを出し、その結果によってそのまま送信するのかキャンセルするのかを選ばせたいという事でをビヘイビアを使って実装したいのです。
下のような二つのソースを書いてみましたが動きません。どなたか心当たり有りませんでしょうか。
よろしくお願いします。

--onclick.htm
<html>
<head>
<style>
.btnSubmit{
behavior:url(onclick.htc)
}
</style>
</head>
<body onLoad="alert('onload')">
<form>
<input type="submit" class="btnSubmit">
</form>
</body>
</html>

--onclick.htc
<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="onclick" ONEVENT="onClick()" />

<SCRIPT LANGUAGE="JavaScript">

function onClick()
{
if(window.confirm("よろしいですか?")){
return(true)
}else{
return(false)
}
}
</SCRIPT>
</PUBLIC:COMPONENT>


いろは さん 2003年 07月 29日 07時 55分 34秒

いろは です。
あじゃけん さんへ
大変親切なご説明、ありがとうございます。いずれも自力では当分到達できなかったような情報で、大変感謝しております。理解の程度の自信はありませんが…。

私の説明が意味不明だということで(すみません)、少し補足させていただきます。

・私はシステム管理者ではないのです。最近職を変えまして、恥ずかしながら、今は新米ながら、職業プログラマなのです(この掲示板の方と比べると、スキルはゼロに等しいので、プログラミングの経験がないようなことを書いてしまいました。すみません)。しかし、Windowsベースの仕事をやったことがなく、今回、初めてActiveDirectoryに関わって、悪戦苦闘しております。

・今回の仕事では、ある会社の社内システムの構築の一部に関わっております。この会社では、社員情報の管理をActiveDirectoryと、Oracle DBの2本立てで管理していて、その両方をあわせることで社員情報の全体を取得できるようになっています。私のActiveDirectoryの理解は、恥ずかしながら、問い合わせると社員情報を返してくれる、データベースの一種に過ぎません。しかし、そのActiveDirectoryへのアクセスの方法がわからなかったのです。

・WSHとASPの違いは何とか分かっていると思います。どちらも書いておりますので。今回の仕事は、ASPとWSHに分かれています。前者は対話的な処理、後者はバッチ的な処理に使っております。

・業務の内容は、対話的、バッチ的な処理のどちらでもある程度共通しています。DBに登録された社員番号などを元に、ActiveDirectoryからも社員情報を取得し、それに基づいて、社内資料ファイルにアクセス権の設定をする、社員の権能に合わせて各種通知メールを配信する、などです。ASPの場合は、アクセスしてくる社員の権限を自動的に判別する必要がありました。(実は仕様変更があって、IPアドレスは使わなくなったそうですが)

・これは大きな案件で、私の勤める会社が関わっているのは、全体のごく一部です。そしてこれらの社員情報にアクセスするためのライブラリも提供されているのですが、これは構造体の配列を受け渡すDLLで、VBScriptからは直接扱えないものでした。他の会社はVB.NETを使っているから何とか使えるのですが、うちはASP、WSHなので…。

・そこで私がこのDLLをCOMとして扱えるよう、ラッパとなるインタフェースをVB6で開発しているところです。私にはかなり難しいです。もしそれができなかったら、うちの関わる仕事全体がだめになってしまいますので、VBScriptからActiveDirectoryにアクセスできるADSIの情報を、救命ボートとして用意しておきたかったのです。

以上、まとまらないながら、補足させていただきました。すでにデスマーチに突入していて、あまり時間が取れません。乱筆をどうかご容赦ください。

あさじゃけん さん 2003年 07月 28日 13時 39分 32秒

>迷い人さんへ
あ。またやってしまった(汗)
basp21で出来ますね(汗)

自分自身、会社の環境もあって標準コンポーネント内で出来ることしか基本的にやってないので、basp21のような存在を知っていても、使う事がマレなので、その内容については、ほとんど頭の中に入っていないです(汗)

適切なアドバイスになってなくて、申し訳ないです。


>むたぐちさんへ
> Dim arr() As Integer = {1,2,3,4,5}
これ・・・感動ですね(笑)
ジーンときましたよ(爆)
これが出来ないために、今までいろいろと苦労してきたと言っても過言ではありませんよ(笑)
ぁあぁ、.NET勉強せなあかんなぁ(笑)

> というより、括弧が省略できなくなりました。
当然、そうあるべきだと、私は思います。
いやぁ、やっとVBが.NETで言語らしくなったんだと、つくづく思いますねぇ。(^^
Microsoftには「さいしょっからそうしろ!」っといいたくもなりますが(笑)

> 自分のサイトに情報を集約したくなるのは管理人の性ですよ。うん。
確かにそうですね(笑)
私も溜め込むタイプです(^^;;;
じゃ、2ちゃんは見ませんので、こちらに情報提供お願いしますね(爆)
#見たら見たなんですけどね(^^;;;

> While...WendのWend
あぁ・・言われて見ると、そんな感じしますね。^^;;
しかし、私は「そんなもんだ」と思ってやってましたので、深く意識したことはないですねぇ。(汗)

私にとっては、どっちでもいいというか、途中で変えないでくれというか(笑)
極端な話、思い通りの処理が書けるなら、「Loop...End Loop」でもいいぐらいです(^^;;
でも、確かに大切なことですね。^^

後、言語開発する人のポリシーにもよるんでしょうね。
言葉から取るニュアンスなんてのは、日本じゃあまり感じませんが、英語圏の人たちには、プログラムというのは、違った視線で見れるのだと思います。

でも、きっと、日本語基準のプログラム言語ってあっても、流行らないだろうなぁ・・・とか思いつつ。
・・・どこかで、そんなのがあったような気がしますね(汗)

あさじゃけん さん 2003年 07月 28日 12時 52分 07秒

>むたぐちさんへ
ぬは。(^^;;;
> ADSIは詳しくないので、あさじゃけんさんに丸投げしてしまいます。
> おねがいしまーす。
と、むたぐちさんにも任されちゃったので(笑)
(というか、任せろって過去に言ったのは、私ですね。汗)


> http://216.239.33.104/search?q=cache:KOpm0x4-8kAJ:www.users.gr.jp/ml/archive/wsh/130.asp+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9%E3%80%80wmi&hl=ja&lr=lang_ja&ie=UTF-8
それから、こんなことができるなんて、私も知りませんでした(汗

現に、私はこれをやる為にVBSから「xcacls.exe」をRunメソッドで呼び出して使ってます。
ちなみに「xcacls.exe」のほうが「cacls.exe」より細かい設定ができます。
ただ、グループ名に全角文字を利用している場合、うまく設定してくれない場合があったと思います。
(ちょっと記憶があいまいです。)


>いろはさんへ
それでは、早速、お返事を。^^;;
でも、ActiveDirectoryの言葉が出てくる時点で、同じシステム管理に携わる方だとお見受けしましたので、厳しく突っ込みますね(笑)
個人のマシンをちょこちょこいじってるようなプログラムではなく、システム全体に影響する大事なプログラミングになるでしょうから、きちんと勉強するべきだと思います。
ですので、・・・(自粛)笑(^^;;;


> ・ASPサーバにアクセスしたユーザのIPアドレスを元に、ユーザの各種情報をActive Directoryから取得。
これは、各クライアントのマシンは固定IPでネットワークを構成されているのでしょうか。
・・・ということは、ユーザ名管理をしていないという事なのでしょうか?

普通は、利用者がユーザ名を個別に割り当てられていると思いますので、どちらかというと「ユーザ名からユーザの各種情報をActive Directoryから取得。」という話になりそうな気がするのですが・・・
多分、その方がスマートです。(認証もされているわけですから・・・)

もし、そうではなく、IPアドレスによって、情報を取得したいという話なのであれば、
IPアドレスが1ユーザに割り当てられている事を保証出来ないと思いますので、やめたほうが良いと思います。
#だって・・・それをやったとして、他人のマシンAをダウンさせといてマシンBにマシンAと同じIP割り振って見るとその人の情報見えちゃうんですよね?(汗
各ユーザにきちんとユーザ名を割り当てて、個人によるパスワード管理をきちんと定着させることをお勧めします。
そうでないとActive Directoryを使っている意味もありません・・・


> ・DBにある社員番号を元に、ユーザの各種情報をActive Directoryから取得。
いろはさんのやりたいことが、よく分かりません。
具体的にどのようなことをやりたいのでしょうか。
しっかり、整理してもう一度、質問を下さい(^^;;
#というか、「社員番号=ユーザ名」という運用をされているんですか?


まず、
・言葉の意味を使い間違えていませんか?(なんとなくそう感じました)
ActiveDirectoryの難しさに踊らされずに、「言葉だけ知ってる言葉」を無理に使わず、「理解している言葉」で書いてもらったほうが、アドバイスしやすいです(笑)
そうでないと、間違って伝わってしまいますよ。

・「ActiveDirectoryの共有ファイルのアクセス権」というのは、普通に「ファイルのアクセス権をWSH使って変えたい」という話だったのですよね?
そのファイルがたまたまActiveDirectoryの共有フォルダの中で公開されているだけですよね?
ActiveDirectoryとは、ショートカットを集めたような塊で、そのショートカットのアクセス権を変えても元のアクセス権とは別物になります。
(でも、ActiveDirectoryにファイルの共有は無かったような気が・・・フォルダとかプリンタとかはありますね。)
ですので、そのあたりを理解していないと、ActiveDirectoryで検索してもアクセスできないが、直接アクセスすると見れたりする現象がおきます。
で、普通のユーザはほとんど「ActiveDirectoryで検索」という操作方法を知りません(笑)

・ASPとWSHを混同していませんか?(汗)
前の質問と別の話なのか、続く話なのかがよく分からなかったので、そう感じました。
今回のActiveDirectory話はASPでの話ですよね?
しかも外向けサービスではなく、社内サーバのようなクローズドなASPサーバですよね?(笑)

・と、いうことで、もうちょっと環境を書いて下さいね。
どのような運用をしているのか、何がしたいのかが、いまいちよく分かりません。
思いつくこと全てを書くことも、質問攻めにすることも出来ません(^^;;

と、いう説教は、何処にでもある話なので、ここらへんでやめておいて(笑)


■WSH(VBS)でADSI使ったユーザ情報の取得サンプル
とりあえず、WSHのVBSでユーザの情報をActiveDirectoryから取得したい場合のサンプルスクリプトを簡単に作って見ましたので、載せますね。
-Test.vbs-----------------------------------------
'test.localドメイン
const D_LDAP_STRING = "LDAP://DC=test,DC=local"

Set objContainer = GetObject(D_LDAP_STRING)

'Usersコンテナ
Set objUsers = objContainer.GetObject("container","CN=Users")
'別のOUなら以下のような感じで取得
'Set objUsers = objContainer.GetObject("organizationalUnit","OU=name")

'ユーザだけを列挙する。
objUsers.Filter = Array("User")

For Each objIADs In objUsers
With objIADs
WScript.Echo .Get("samAccountName") 'サムアカウント名

'これ以下は、値が入っていないと「プロパティがキャッシュに見つかりません。」と言われます。
'ほかにもいろいろあります。
' WScript.Echo .FullName '氏名
' WScript.Echo .Profile 'プロファイルへのパス
' WScript.Echo .LoginScript 'ログオンスクリプト
End With
Next
--------------------------------------------------
走査する処理が必要なければ、直接ユーザオブジェクトを取得することもできます。
後、このサンプルは動くと思いますが、ActiveDirectoryにアクセスする権限をもっているユーザでプログラムを動かしてください。普通はAdministratorですね。

あと、CScriptで呼び出す事をお勧めします。ユーザ数が多いとMsgbox閉じるのが大変です(笑)


■参考になるサイト
http://www.galliver.co.jp/writing/nikkei_tokushu/wad002/
VBでのADSIプログラミングの説明です。
そのまま使うわけには行きませんが、基本です。分かりやすいのでお勧め。

http://www.microsoft.com/JAPAN/developer/library/jpbkgnd/TechArt/WinPlat/Network/ADSI/ADSI.htm
ここも詳細に説明してあります。
文字多いので読むのが大変ですが、ここだけ見ても理解できると思います。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netdir/adsi/account_disabled.asp?frame=true
LDAP User Objectに関するMicrosoftの英語ページです。
プロパティやメソッドを調べられます。

http://www.winscripter.com/wsh/
JavaScript(WSH)でのADSIのサンプルがあります。
オブジェクトの使い方など、参考になると思います。


■書籍
・株式会社ピアソン・エデュケーション
「ADSIスクリプトによるWindows2000システム管理」
トーマス・エック=著 有限会社ハル工房=訳 5,800円

私が愛用しているのはこの本です。
VBSを使ってADSIを扱う方法がかなり詳細までかかれています。
どうやらWindowsNTベースにかかれている物をWindows2000に書き換えた物のようなので、タイトルと内容のギャップ見てムカツキます(笑)が、ADSIについて日本語で読める本を他にしらないので、私の役に立ってます。(^^


とりあえず、これ以上は答えようがないので、いろはさんの書き込みをお待ちしております(笑)

いろは さん 2003年 07月 27日 14時 45分 16秒

WENDの語源ですが、私はこの構文を知った当初から While END の略だと信じて、疑ったことは
ありませんでした。「これでBASICも構造化できる」と喜んだことを懐かしく思い出します。
もっとも、その後長い間プログラミングに関わらず、今でも単なる初心者ですが…。


語源と言えば、WSHの語源について、私はつい最近思いついたことがあります。
もちろん正式な語源は Windows Script Host ですが、それとは別に言葉遊びのような語源として、
UNIXのシェル(sh, csh, tcsh, bashなど)に対比されるべき Windows シェルとして Wsh なのでは
ないかと思うのです。Windows用シェルスクリプト環境を提供するソフト。

http://images-jp.amazon.com/images/P/4873110068.09.LZZZZZZZ.jpg
http://images-jp.amazon.com/images/P/4873110734.09.LZZZZZZZ.jpg
アマゾンで上の本の表紙を見て、「あれ?wshなんていうシェル、UNIXにあったっけ?」と思ったのが
きっかけでした。知らない人が上の本を見たら、絶対シェルスクリプトの本だと勘違いしそうに思いま
せんか?

思いついてみると、何だか当たり前のようにすら思えたのですが、Googleで検索してみても、直接それを
主張するページは見つかりませんでした。VMS → WNT などはいくらでも見つかったのですが。
うーん、暗黙の前提だから、誰もわざわざ言わないのでしょうか?

私はどうもこういうことが気になってしまうもので、すみませんが書かせていただきます。

いろは さん 2003年 07月 27日 14時 32分 43秒

管理人むたぐち さんへ

いろはです。ご親切なご説明、助かりました。
できなかったら、caclsを呼び出すしかないかと思っておりましたが、これで何とかなりそうです。
ありがとうございました。

みなさんへ

Active Directoryからのユーザ情報の取得は、いまだにできません。
・ASPサーバにアクセスしたユーザのIPアドレスを元に、ユーザの各種情報をActive Directoryから取得。
・DBにある社員番号を元に、ユーザの各種情報をActive Directoryから取得。
こちらは、caclsのような外部コマンドの起動して代用する方法もわからず、本当に困っております。
どなたか参考になる情報を教えていただけないでしょうか?できたら日本語のサイトだと助かるのですが。

あつかましい質問ばかりで恐縮ですが、どうかよろしくお願いいたします。

いりや さん 2003年 07月 27日 13時 58分 12秒

むたぐちさん、

| > とはいうもののわたしは過去 C:\Progra~1 みたいな ~数字 という表示に力
| > が抜けて以来ずっと UNIX 系 (PC UNIX もしくは Cygwin) で仕事をしていま
| > した。
|
| MicrosoftはWin95をリリースする際、LongFileNameを推進するため、わざと
| プログラムフォルダをC:\Program Filesとしたらしいのですが、
| どうせなら内部的に8+3の呪縛を完全に解き放ってからにして欲しかったですね。

過渡期だからしょうがないのかもしれません。。

| それに、コマンドライン作業のことを考えれば、パスにスペースが入ってると
| 処理がめんどくさくなるだけですし、個人的にはファイルシステムレベルで
| スペースを禁止するくらいのことをしても良かったんじゃないかとか思ってたりします。
|
| いまだに
| WshShell.Run """"C:\Program Files\Internet Explorer\iexplore.exe""""
| なんて表記しなきゃならないのは、やっぱどっか気持ち悪くないですか?

たしかに " を四つも重ねることをプログラマに強いるのはどうかと思います
ね。

それで、わたしは、この WshShell>>run() メソッドの引数に設定するときこ
のエスケープ処理を代わりにやってくれる手続きを用意しています。

  http://hidebbs.net/bbs/umiumi?n=15908339&s=7
  http://hidebbs.net/bbs/umiumi?n=15461144&s=7

上記の投稿記事でスクリプトを紹介していますのでよろしければご参考にな
さってください。コマンドを実行するときの準備の手間がずいぶん軽減され
ると思います。

もっとも、投函を見ていただければ分かりますが関数間の役割分担で揺れて
います。しばらく使っていろいろなコマンドラインのパタンをこれで吸収で
きるか見てみる必要があるでしょう、きっと。

いりや

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

どうでもいいことですが、
While...WendのWendってどういう意味なんでしょうね。
辞書には、行く、進める等の意味を持つ文語表現とあります。
一応意味は通りますが、なんでこんな古めかしい語を?
ちなみに、goの過去形wentは、wendの昔の過去形"went"から来ているそうです。(現在では"wended")

で、VB.NETになって、この構文の表記が、While...End Whileに変わったわけですが、
そこから推測すると、もしかすると Wend = WhileEnd の略だったのかもという気がしてきました。
みなさんはどう思われますか?

管理人むたぐち さん 2003年 07月 27日 09時 26分 49秒

Apacheのディレクトリ内ファイル一覧表示に、通し番号をつけるスクリプトを作ってみました。
*.urlファイルとしてお気に入りやリンクフォルダに入れてお使いください。
javascript:var links=document.all.tags("A");var j=0;for (i=0; i<links.length; i++){if (links[i].href.substr(links[i].href.lastIndexOf("/")+1)==links[i].innerText){j++;links[i].insertAdjacentHTML("BeforeBegin", j + ": ");}}


To: ど素人 さん

VBS+WSHでプログラミング入門をやってるサイトというのは、意外と数が少ないような
そうでもないような感じですよね。
技術の進歩は目まぐるしいのに、私のサイトは更新が途絶えてるため、
内容は古くなる一方ですが、それでも需要があるというのは嬉しいですね。

それにしても、VBS講座あたりはそろそろ全面改稿したいもんです。
技術の進歩というより、さすがに4年も経ったら若干ながら私の知識の進歩もあって、
昔、自分の書いた物に「おいおい、それはないだろ」と心の中でツッコミを入れることも
しばしばです。


To: いりや さん

> とはいうもののわたしは過去 C:\Progra~1 みたいな ~数字 という表示に力
> が抜けて以来ずっと UNIX 系 (PC UNIX もしくは Cygwin) で仕事をしていま
> した。

MicrosoftはWin95をリリースする際、LongFileNameを推進するため、わざと
プログラムフォルダをC:\Program Filesとしたらしいのですが、
どうせなら内部的に8+3の呪縛を完全に解き放ってからにして欲しかったですね。

それに、コマンドライン作業のことを考えれば、パスにスペースが入ってると
処理がめんどくさくなるだけですし、個人的にはファイルシステムレベルで
スペースを禁止するくらいのことをしても良かったんじゃないかとか思ってたりします。

いまだに
WshShell.Run """"C:\Program Files\Internet Explorer\iexplore.exe""""
なんて表記しなきゃならないのは、やっぱどっか気持ち悪くないですか?


To: あさじゃけん さん

> 私自身、2ちゃんねるはあまり見ませんが、むたぐちさんの書き込みだけは見たいですね(笑)

向こうに書いたことは、おそらく何らかの形でこちらにもフィードバックしていく
つもりです。やはりこの掲示板も自分のサイトの一部なわけでして、自分のサイトに
情報を集約したくなるのは管理人の性ですよ。うん。


To: いろは さん

> WSHを使って、ActiveDirectoryの共有ファイルのアクセス権を変更できないでしょうか?

ADSIは詳しくないので、あさじゃけんさんに丸投げしてしまいます。
おねがいしまーす。
3年ほど前、ADSIを一通り調べたこともあったんですが、どうもすっかり忘れてしまって
駄目ですねえ…。

WMIで、ローカルファイルのアクセス権を設定する参考例ならありました。
http://216.239.33.104/search?q=cache:KOpm0x4-8kAJ:www.users.gr.jp/ml/archive/wsh/130.asp+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9%E3%80%80wmi&hl=ja&lr=lang_ja&ie=UTF-8


To: いりや さん

> でしょう、仮想世界の正体を暴くのですからドキドキしますよ、きっと。気
> 分は映画マトリクスの緑のコンピュータスクリーンを流れる記号列を解くの
> とおんなしです :-)

私なら青い薬を選びますね。
どちらかというと、仕組みより、「それで何ができるか」を重視しています。
でも、「それで何ができるか」を追跡するには、やはり仕組みもある程度知ってなきゃ
いけないわけですけどね。だから赤い薬もたまに飲んでます。


To: つちや さん

> ですが、この場合は、
> Call simpleSort(Data)
> と明示的に呼び出さないといけないのでは。
> (どうしてそうしないといけないのかは誰かよろしくです)

理由ってあるんでしょうか?
そういう文法だから、と割り切ってますけど。

ちなみにVB.NETでは、
simpleSort(Data)
でSubプロシージャ・メソッドを呼びます。というより、括弧が省略できなくなりました。
(Callは今まで通り使えます)
引数なしのSubプロシージャ・メソッドを呼ぶときも()を省略できません。

ついでに言うと、オブジェクト変数を代入する時のSet構文もなくなったんですよ。
普通の変数と同じように代入します。(というのもVB.NETのすべての型はオブジェクトなので…)
全体的にJScriptみたいです。

> 最近Wordのテキスト部分だけを直接読み込む機能を自家製COMに装備しまして、

Wordが入ってない環境で動くと言うのが中々いいですね。
Wordのオートメーションオブジェクトは、マクロで使うため多機能ですけども、
WSHなど外部から利用する分には、そこまで多機能である必要はあんまりないと思います。
TextStreamオブジェクト並のことができれば、それで十分ですよね。
というわけで、*.docをテキストファイルみたいに扱えるコンポーネントを
目指すと言うのはどうでしょう。

それと、PDFのテキスト取得はかなり需要あると思いますよ。


To: あさじゃけん さん

> ちなみにJavaScriptと違ってVBScriptでのArrayは、オブジェクトでなく関数なので、プロパティはなかったりします(笑)

だからVBScriptの配列は、JScriptの配列より動作が速いんですよね。

ところで、またVB.NETの話になりますが、VB.NETの配列は.NET FrameworkのSystem.Arrayクラスから
派生してるので、そのプロパティ・メソッドが使えます。Sortとか。

Dim arr() As Integer = {1,2,3,4,5}
なんて感じでいきなり1次元配列が作れたりもします(ネストすれば多次元配列もつくれます)。
ここらへんは、ちょっとPerl風かな?

迷い人 さん 2003年 07月 26日 09時 42分 23秒

あさじゃけん さん

アドバイスありがとうございます。
WSH書くのは全く初めてだったのですが、
おかげさまで何とか動くものができました。

常時接続環境で、IPアドレスが変わった場合に(ルータが再接続した等)、
新IPアドレスを指定したFTPサーバにアップロードします。

(注)
basp21を利用してます。
Windowsタスク等に登録して動かします。

Dim str , nowIP , preIP , bUP
Dim WshShell , objExec
Dim objRegEx , Matches
Dim Fs , objTS
Dim bobj , ftp
Dim rc

bUP = false

Set WshShell = CreateObject( "WScript.Shell" )
Set objExec = WshShell.Exec( "ipconfig.exe /renew" )
While objExec.Status = 0
WScript.Sleep 100
Wend
str = objExec.StdOut.ReadAll()

Set objRegEx = New RegExp
objRegEx.Pattern = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
objRegEx.Global = True
Set Matches = objRegEx.Execute( str )
nowIP = Matches(0).Value

Set Fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set objTS = Fs.OpenTextFile( "C:\Tmp\ip.html" , 1 )
preIP = objTS.ReadLine
objTS.Close
If nowIP <> preIP Then
Set objTS = Fs.OpenTextFile( "C:\Tmp\ip.html" , 2 )
objTS.Write nowIP
Set objTS = Fs.OpenTextFile( "C:\Tmp\ftp.html" , 2 )
objTS.Write "<meta http-equiv=Refresh content=0;URL=http://" & nowIP & ">"
bUP = true
End If

If bUP = true Then
set bobj=createobject("basp21")
set ftp=createobject("basp21.FTP")
rc = ftp.OpenLog("c:\Tmp\log.txt",1)
rc = ftp.Connect("<ftpサーバ>", "<id>", "<passwd>")
rc = ftp.PutFile("c:\Tmp\ip.html","public_html")
rc = ftp.PutFile("c:\Tmp\ftp.html","public_html")
bobj.Debug v
End If

つちや さん 2003年 07月 25日 17時 36分 05秒

Dear いりやさん

詳細にわたり、ご苦労さまです。
なるほど。Shellのコマンドって、そうやってレジストリを調べる手があるわけですね。
DDEって太古の産物かと思っていたのですが、まだまだ現役なわけなんですね。


ところで、MySQLの管理をWSHで、という、データベースネタで恐縮ですが、
WSH(& ADO & MyODBC)でなんとか、
◇MySQLユーザー登録
◇MySQLデータベース作成、テーブル作成、データインポート(CSVファイルから)
◇MySQLドライバのODBC(DSN)登録
◇Accessファイル(.mdb)を作成して、MySQLへのリンクテーブル作成
あたりができるようになってきました。

ユーザーインターフェースはDelphiで作成しているのですが、
DelphiのADO用のコンポーネントは個人的に不満があるので(WSHと比べると圧倒的に遅い)、
直接ADODBをCreateOleObjectしてまかなってます。

身近に誰も相談できる人はいないし、いつもの仕事はきちんとあるし、
特別手当もなんにもなし(無給・・・)で、がんばってるぞぉぉ。。..

で本題ですが(いまさら)、昔むかし2001/10頃に紹介した、MySQLを直接扱えるCOMである
MySQLDBを再びとりだしまして、スピードアップを図ろうとしたのですが、
フィールド名をまとめて取得しようとしたら、えっというような現象に出くわしまして、
いろいろ検証していてまた時間が、、

MyODBCの代わりにMyOLEDBを直接ADOで操作ということも試したのですが、
MyODBCと同じSQLがMyOLEDBでは通らないし。。。

結局、高速データベースMySQLをWSHで操作しようという方は(私の他にいないかも、、、あ、でもASPで使う方がいますか)、
ADO + MyODBCというのが無難な選択なのかも。
(いろいろ紆余曲折があって元に戻ったのでした。)


さらにMySQL & WSHの話はつきず、次の段階へ。
で、昨日から今日にかけて、MySQLを直接操作するCOM(MySQLCOM.DLL)を作ってみちゃいました。
操作は(少し)ADOに似せてあります。
本家MySQLのMLに流すのは恥ずかしいので、そのうちコソーリ公開予定。。

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

>彩香さんへ
「simpleSort(Data)」ってやってて、何でエラーが出なかったんだろう・・・
とか思って、考えてたのですが、「On Error Resume Next」されてると、
エラーが出なくて、分からないかも知れませんね。^^;;
(動作未確認ですがおそらく。彩香さんのソースにも入ってますしね。笑)

「Call simpleSort(Data)」と「simpleSort Data」の違いが、なぜあるのかが、私は疑問だったりします(笑)
「どっちでもいいじゃぁないかぁ!」とマイクロソフトに言ってやりたい(笑)

でも、私はCallつけてカッコで括るほうが、「関数呼び出してる!」って感じで好きです。(この場合はサブルーチンか。笑)
カッコないと紛らわしいし・・・


>ちょび太さんへ
多分やってることは、For Eachだと、信じて(笑)
--------------------------------------------------
intCount = 0
For Each strValue01 In ArrayCopy
................
intCount = intCount + 1
Next
--------------------------------------------------
とかの感じで素直にカウントするか、

--------------------------------------------------
For intCount = 0 To UBound(ArrayCopy)
strValue01 = ArrayCopy(intCount)
................
Next
--------------------------------------------------
って所でしょうか。
動作確認してませんが、多分あってると思います。

ちなみにJavaScriptと違ってVBScriptでのArrayは、オブジェクトでなく関数なので、プロパティはなかったりします(笑)


>迷い人さんへ
取得したいのは、自分のマシンのIPアドレスだと信じて(笑)

開発環境等でWinsockがマシンにインストールされているなら、
--------------------------------------------------
Dim objWinsock
Set objWinsock = WScript.CreateObject("MSWinsock.Winsock")
WScript.Echo objWinsock.LocalIP
WScript.Echo objWinsock.LocalHostName
--------------------------------------------------
あたりで、簡単に取得できるのですが・・・

もしくは、ExecやStdOut、RegExpを駆使して、ipconfigの出力結果から取得するかですねぇ・・・

もしくは、WMI使うとか。以下のアドレスを参照して下さい。
http://homepage2.nifty.com/tcubic/wmifun/wmisample/win32_networkadapterconfiguration.html
これに手を加えれば、取得できると思います。

まぁOS限定されそうですが、こんな感じでしょうか^^;;

迷い人 さん 2003年 07月 25日 00時 42分 50秒

IPアドレスを取得する方法をご存じでしたら、教えていただけないでしょうか。
よろしくお願いします。

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

すっかり見落としていました(^^;

Call simpleSort(Data)
simpleSort Data

この書き方でしたかぁ、うっかりしていました、
つまり関数が呼ばれていないだけだったんですね。

simpleSort(Data)
気を付けないと、うっかりこれで書いてしまう事が多いです(^^;

失礼しました。

ちょび太 さん 2003年 07月 24日 18時 17分 46秒

はじめまして、ちょび太と申します。
VBSの配列に関して教えてください。

ArrayCopy = Array(x1,x2,x3)とし、

For strValue01 in ArrayCopy
................
Next
のように、配列ArrayCopyの中から一つ要素を取り出して
順次strValue01に代入して処理するとします。
この時配列の要素strValue01が配列の何番目に入っていたかを
取得するプロパティというのはあるのでしょうか。

どなたかご存知の方がいらっしゃいましたら教えて下さい。

宜しくお願い致します。

彩香 さん 2003年 07月 24日 17時 20分 45秒

To:つちやさん

お返事ありがとうございます。

>ですが、この場合は、
>Call simpleSort(Data)
>と明示的に呼び出さないといけないのでは。
>(どうしてそうしないといけないのかは誰かよろしくです)

この後で、配列Dataにソート結果が反映されていない原因がこれで
しょうか?

どうしてCallを明示的に付けないとダメなのでしょうか?
あんまり考えていませんでした(^^;

適当なミリ秒でSleepを入れて一旦OSに制御を戻すという手も
頭にはあったのですが、ただ、この適当な値がなかなか難しくて。

Delphiのコンポーネントですかぁ、私、ちょうど今はまっています(>_<)
DB関係のコンポーネントを作ろうと思っているのですが、なかなか
難しくて難航しています、これは余談でした(^^;





彩香 さん 2003年 07月 24日 15時 40分 53秒

To:いりやさん

これだけお調べになって下さり、ありがとうございます。
私には到底このような情報には辿り着けません(^^;

お返事ありがとうございます、わかっている事実だけですが。
1.2.3.4.5.6.7.8.9
○.×.○.○.×.×.×.○
のような順不同なプリントアウトになっています。

もう一度繰り返すとまた違う○×になっているかどうかは
検証していませんが規則性は無い様に感じました。

そして、残骸というのはファイル自体はなくて
Wordのアプリケーションのみがファイル数?だけ
起動されてしまっている状態でした。

ちなみに、メッセージボックスの確認印刷では
ちゃんと印刷され、アプリの残骸も残らず正常終了されます。

かなり高度なお話なので直感で理解できたのはここだけでした。
SendMessageA()、PostMessageA()の大きな違いは同期か非同期
かが挙げられますね。

単純に、このフラグをOFFにはできるのでしょうか?

いりやさんでいたらこの場合、どのように対処なさりますか?

彩香

いりや さん 2003年 07月 24日 03時 22分 37秒

よっしーさん、

| お蔭様で、解決できそうです。

それは何よりです。今度はバッチ自身も WSH 側で巻き取えるか試してみるの
はおもしろいかもしれません。そうすれば戻り値の取り扱いも WSH の世界で
とじるので頭を切り替えるときの精神的負荷をすこし軽減できるかもしれま
せんね!


つちやさん、彩香さん、

つちやさん wrote:
| 印刷の抜けは、印刷が非同期で実行されていて、次々と印刷命令がアプリケー
| ションに到着して、処理しきれないのが出てくるのかも。

彩香さん wrote:
| 思うに下記の原因は非同期にあったようです、
| Shellでの印刷のプロセスが終了するまで
| 待機させることができれば良いのですが、
| WSHでは不可能ですよね。


こちらわたしもすこし突っ込んで調べてみました。そうしたところ、どうや
ら .doc の print コマンド (印刷(&P)) の設定で DDE を有効にしているこ
とがポイントのような気がしてきました。

まだ実機で確認しているわけではありませんが msdn と英国の RHA
(Minisystems) 社の文書と、実マシンのレジストリ情報を整理した結果をお
知らせします。(WinXP + Office2000)


まず、.doc の print コマンドはレジストリによれば

HKEY_CLASSES_ROOT\Applications\WINSORD.EXE\shell

    Print
        command
            値 = "C:\Program Files\Microsoft Office\Office\WINWORD.EXE" /x /n
        ddeexec
            値 = [REM_DDE_Minimize][FileOpen("%1")][t=IsDocumentDirty()][FilePrint 0][SetDocumentDirty t][DocClose]

            Application
                値 = WinWord
            ifexec
                値 = [FileOpen("%1")][FilePrint 0][FileExit 2]
            Topic
                値 = System

でした。このような設定の場合に、RHA 社の説明によれば、シェルは、

(1) ddeexec の値に基づいて DDE Execute Command (WM_DDE_EXECUTE) メッ
  セージを Application, Topic の付帯情報とともに送る。
(2) (1) が成功する場合はすでに Word が起動している場合の状況を指して
  いてそのまま終了
(3) (1) が失敗する場合は Word が未起動である場合で、この場合はまず
  command の値に基づいてシェルは Word を起動する。(これは
  CreeateProcess() API のようだ)
(4) (3) の起動が終わったら ifexec (多分 Initiation Failed on
  Execution の略かな?) の値に基づいて DDE Execute Command
  (WM_DDE_EXECUTE) メッセージを送る。
(5) (4) の結果、通常だと DDE のコネクションを受け付けない場合の例外処
  理が続くが Word はサポートするので特になし。

という振る舞いをするだそうです。

一方、DDE の処理は msdn によれば、一部のメッセージ処理シーケンスを除
き、SendMessageA() ではなく PostMessageA() を使用するとのこと。という
ことはあくまで Word への DDE Execute Command の情報はメッセージ・キュー
にキューイングされるだけで、PostMessage() から制御が戻ったからといっ
てすぐに処理が完了したことにはならないようです。


以上の確認のもと、ShellExecute() メソッドをバシバシ実行するとシェル及
び Word はどんな動きをするか考えてみました。こうなんじゃないかな〜と
いうレベルで推測がたくさん入っていますがないよかマシということで書い
てみます。


・最初の一回目は、Word プロセスが起動していないので、上記 (3), (4) の
 順に、メッセージキューに、
    [FileOpen("%1")][FilePrint 0][FileExit 2]
 というコマンドが入る。これはファイルを開いて印刷してプログラムを終
 了せよ、という指示のように読める。(Word の DDE 仕様未確認)

・メッセージキューが処理されるか、次の ShellExecute() メソッドが処理
 されるかは決定的ではないが、ShellExecute() の方が先に処理されたとす
 ると、キューに、
    [REM_DDE_Minimize][FileOpen("%1")][t=IsDocumentDirty()][FilePrint 0][SetDocumentDirty t][DocClose]
 というコマンドが入る。理由は Word が起動しているから (1) のみが実行
 されるため。

 コマンドの内容は、ファイルを開いて印刷した後にプログラムを終了せず
 ただ開いたドキュメントを閉じよ、という指示のように読める。
 (Word の DDE 仕様未確認)

・ShellExecute() の方が何回か優先されたとする。(初回を含め仮に 3 回)
 コマンド内容は、Word が起動しているので (1) のみが実行されるため。

・あるタイミングで Word の優先度があがって、最初のキューイングされた
 [FileOpen("%1")][FilePrint 0][FileExit 2] の処理を Word が完了する
 とプログラムを終了する。このときに、*たぶん* メッセージキューを破棄
 するのではないか??

・残りの 2 個の ShellExecute() でキューイングされたキューが破棄されて
 実行されない。


余談

DDE のコマンドを使用してシェルと Word が通信している様をみていると
Component Object Model に沿って印刷処理の依頼をおこなう場合とインター
フェイスが違う以外にあんまりかわらないな。

上記の推測が仮に本当だとしたら、シェルのサービスとして DDE を使用する
場合、プロセスのライフサイクルを見据えながら依頼をする必要がありそう
で、シェルに単純に print コマンドを送れば後は受け取った側で面倒をみて
くれる、というシンプルな話ではないようです。

さて、実機での確認はこれから、と。

いりや

[ 関連リンク情報 ]

msdn, Verbs and File Associations
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/fileassociations/fa_verbs.asp

RHA (Minisystems) 社, FileAsoc Windows File Association Editor
http://www.angelfire.com/biz/rhaminisys/fileasoc.html

msdn, About Dynamic Data Exchange
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/DataExchange/DynamicDataExchange/AboutDynamicDataExchange.asp

msdn, Using Dynamic Data Exchange
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/DataExchange/DynamicDataExchange/UsingDynamicDataExchange.asp

よっしー さん 2003年 07月 23日 21時 07分 13秒

いりやさん。
お蔭様で、解決できそうです。
ありがとうございました。
また、質問させて頂くと思いますが、
よろしくお願いします。

いりや さん 2003年 07月 23日 18時 04分 17秒

ふむ。。ちょっとご確認です。

| 十分な検証はしていませんが、印刷が飛んでしまう現象が
| 見られました。

飛ぶ飛び方にパタンはみられますか?? 例えば ShellExecute() メソッドに渡
す順番が仮に a.doc, b.doc, c.doc, ..., z.doc として、

(1) a 〜 c まではうまくいくが d 〜 z は全滅 (途中にパタンあり、例えば最後の z だけ失敗)
(2) (1) で、途中を予期できない
(3) b, d, f, ..., みたいに歯抜け (歯抜けにパタンあり、例えば一個とばかし)
(4) (2) で歯抜けのパタンを予期できない

以前 ShellExecute() メソッドを実行するときなぜか最後の一つだけ印刷し
ないうちに終わってしまう事象があって、それは print メッセージを送らな
いうちに呼び出し側の実行が先に終わってしまうから、ということをこの掲
示板で書きました。

そのため、スクリプトが終了するとき *だけ* は配慮が必要だ、というのが
対処の方向だったと記憶しています。

もし飛ぶ飛び方が (3), (4) ではなく (1), (2) に近いようであれば、同現
象の可能性が高いです。

また、

| shellで印刷を実行したあとのWordアプリの残骸が
| 嫌ですね、ファイルの数だけ残ってしまいます。

こちら、この残骸に特徴はありませんか?? 例えば、

(a) ファイルを開いていない本体だけが開いている状態
(b) 印刷に失敗したファイルのみ開いている
(c) 成功したファイルも失敗したファイルも開いている
(d) パタンが予期できない

というような特徴のことをいっています。

印刷が成功する場合は残骸が残らない、にもかかわらず「残る」ということ
は、残すという指示が受け手にとどいていないか、残すという指示を受けて
が忘れたか、そのどちらかの可能性があるとおもっているからです。

彩香 さん 2003年 07月 23日 17時 06分 22秒

こんにちは、彩香です。

思うに下記の原因は非同期にあったようです、
Shellでの印刷のプロセスが終了するまで
待機させることができれば良いのですが、
WSHでは不可能ですよね。

以上、結果報告でした。


つちや さん 2003年 07月 23日 17時 04分 55秒

Dear 彩香さん

> '配列をソート
> simpleSort(Data)

ですが、この場合は、
Call simpleSort(Data)
と明示的に呼び出さないといけないのでは。
(どうしてそうしないといけないのかは誰かよろしくです)

印刷の抜けは、印刷が非同期で実行されていて、次々と印刷命令がアプリケーションに到着して、処理しきれないのが出てくるのかも。
WScript.Sleep 500
とかを挿入してタイミングをずらすといいのかも。(保証はありません)

> それから、フォルダにはWordがありこれを印刷しているのですが、
> shellで印刷を実行したあとのWordアプリの残骸が
> 嫌ですね、ファイルの数だけ残ってしまいます。

こうなると、やはりオートメーションに軍配があがるのでは。
(でもよくOSがメモリ不足をおこしませんね)


Wordというだけで関連性がないのですが、
最近Wordのテキスト部分だけを直接読み込む機能を自家製COMに装備しまして、
(M&Iさんの公開されているDelphiコンポーネント利用)
別にレイアウトはいいから中に何が書いてあるかだけ知りたい時に使ってます。
(Wordが入っていないPCでも使えます)

Set SU = CreateObject("DMC.StringUtils")
MsgBox SU.ReadDoc("C:\なんとかかんとか.doc")

という感じです。
これだけだとつまらないので、なんか面白い使い方を思いついたら公開します。
(本当はPDFのテキスト部分だけを読み込む機能もつけたいのですが、、、)

彩香 さん 2003年 07月 23日 15時 48分 19秒

こんにちは、彩香です。

フォルダの中のファイルを全印刷するサンプルです、
時間が無くて作業ができず今日大急ぎで作りました。

十分な検証はしていませんが、印刷が飛んでしまう現象が
見られました。ファイルを複数選択してポップアップから
印刷を行った時のように印刷が抜けてしまいます、
これを避けたいが為に作ったのにぃ(>_<)

一応、動作確認の為にメッセージ選択を入れたのですが、
これで明示的に印刷を選択してあげると大丈夫でした。

オートメンーションで印刷するとこのような抜けは無いんですけどね。
結局オートメーションのほうが良いという事になってしまうのでは
苦労した甲斐がなくなります・

やっとできあがりましたので挙げさせて頂きました。
悪い点などあればダメだししていただければ幸いです。

皆様にはたいへんお世話になりましたm(__)m

ちなみに、時間が無かったので
ソートは単純比較ソートのアルゴリズムのままです。

2点ほど分らない点がありました。

配列のソートをする関数の呼び出し直後を
コメントアウトしてありますが、
ここで配列を参照したのだとソートが反映されて
いません。

vb系では引数はデフォルトで参照渡しのはずですよね?
それなのにどうしてでしょうか?

それなので汚いですが、
ソート関数の中で印刷を実行してしまいました。

それから、フォルダにはWordがありこれを印刷しているのですが、
shellで印刷を実行したあとのWordアプリの残骸が
嫌ですね、ファイルの数だけ残ってしまいます。

一応、EnumWindowsでWM_CLOSEを送る
ものを作ってありますので、それを最後にまた
Shellで実行しても良いのですが、そんな事するんじゃ
WSH使う意味がないですし。

Set WSell = CreateObject("WScript.Shell")
Set FS = CreateObject("Scripting.FileSystemObject")
Set Shell = WScript.CreateObject("Shell.Application")

Const BIF_EDITBOX = &H10
Const BIF_DONTGOBELOWDOMAIN = &H2
Const BIF_RETURNONLYFSDIRS = &H1
Const SW_SHOWNORMAL = 1

Dim Data()
ReDim Data(0)
S=""
T=""

On Error Resume Next

Set oFolder=Shell.BrowseForFolder(0,"印刷したいフォルダを選んでください。
      ,BIF_EDITBOX+BIF_DONTGOBELOWDOMAIN+BIF_RETURNONLYFSDIRS,"C:\")
If oFolder Is Nothing Then WScript.Quit

Set FF = FS.GetFolder(Fs.GetFolder(oFolder.Items.Item.Path))

'サブルーチン呼び出し
PrintFiles FF

'配列をソート
simpleSort(Data)

'For Each D In Data
' S = S & D(1) & vbNewLine
' Shell.ShellExecute D(1), NULL, NULL, "print", SW_SHOWNORMAL
'Next
'msgbox S

Msgbox "処理が終了しました。"

Sub PrintFiles(F)

'IsFoldersを使ってフォルダかどうか調べてもOK
For Each subf In F.SubFolders

  PrintFiles subf

Next

For Each ObjF In F.Files

  strFilePath = F.Path & "\" & ObjF.Name
  sExt = LCase(Fs.GetExtensionName(strFilePath))

  If sExt = "xls" or sExt = "doc" or sExt = "txt" Then

    Data(UBound(Data)) = Array(Split(ObjF.Name,"-")(0), ObjF.Path, ObjF.Name)
    ReDim Preserve Data(UBound(Data) + 1)

  End If

Next

ReDim Preserve Data(UBound(Data) - 1)

End Sub

Sub simpleSort(ByRef MySort)

lngStart = LBound(MySort)
lngEnd = UBound(MySort)

i = lngStart

Do While i < lngEnd

  j = i + 1

  Do While j <= lngEnd

    If MySort(i)(0) > MySort(j)(0) Then

      temp = MySort(i)
      MySort(i) = MySort(j)
      MySort(j) = temp

    End If

    j = j + 1

  Loop

  i = i + 1

Loop

For Each D In MySort

  ret = msgbox (D(2) & vbNewLine & "を印刷します、宜しいですか?",vbYesNo)

  if ret = vbYes Then
    Shell.ShellExecute D(1), NULL, NULL, "print"
  End If
Next

End Sub

いりや さん 2003年 07月 23日 12時 20分 12秒

あさじゃけんさん、

| > 外部というのは目的の言語の世界を指していて、内部というのはそれを実装
| > するためのプログラム言語の世界です。
| これ見て、「あぁ納得」って感じがしました(笑)
| 内部外部というよりかは、上層下層って感じですね。^^;;;

そうですね、層 (ブロック) で説明する方がしっくりくるかもしれません。
わたしは層の中に自分が飛び込んでそこから眺めようとするので外側とか内
側とかと言ってしまうようです。

| インタープリタを作ろうなんて考えた日には・・・頭がクラクラしそうです(爆)
| 想像しただけで、頭と胸が痛くなりますよ。(^^;;
|
| メモリ上にオブジェクトがどう展開されているのかは、ちょっと興味がありますね。

でしょう、仮想世界の正体を暴くのですからドキドキしますよ、きっと。気
分は映画マトリクスの緑のコンピュータスクリーンを流れる記号列を解くの
とおんなしです :-)

数日前にむたぐちさんが .NET 対応のたくさんのプログラミング言語とその
処理系を紹介されていらっしゃいました。

世の中にはたくさんソースコードと一緒に処理系を公開されている方がいらっ
しゃいます。ですので、自分の趣味に合ったものから少しずつ探し当ててい
くのがいいんじゃないかな、とおもいます。

わたしはやはり関数プログラミングと対象指向プログラミングが趣味です。
皆さんはどのあたりが??

いろは さん 2003年 07月 23日 11時 34分 03秒

いろはと申します。このサイトは以前から、わからないながらも拝見させていただいておりました。今回、初めて書き込ませていただきます。

WSHを使って、ActiveDirectoryの共有ファイルのアクセス権を変更できないでしょうか?
社員一人一人に対して、バッチ処理でレポートが作成されるのですが、
そのレポートファイルへのアクセス権を、対象となる社員だけに限定したいのです。
ADSIとWMIを使えば可能かも知れない、というところまではたどり着いたのですが、そこから先を調べることが私には難しく、困っております。

アドバイスをいただけましたら、大変助かります。どうかよろしくお願いいたします。

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

>むたぐちさんへ
> Part2で取れなかった11、今度は取りましたよ。
私自身、2ちゃんねるはあまり見ませんが、むたぐちさんの書き込みだけは見たいですね(笑)

> ってのがMSの性なんでしょうか。
私はそうだと思います。今までそうやってのし上がってきた会社だと思うので^^;;

> で、WSHで言うところの*.vbsや*.jsに相当するものですが、jsだけが生き残る可能性がありますね。
そうですね。いったいMicrosoftは、VisualBasicをどうしていきたいんだろう。
オブジェクト指向も.NETで完全に取り入れた感がありますし。
CやJavaと並ぶ言語にしたいんでしょうかねぇ。
このまま下手をすると、プログラマがVBからJavaへの移行を加速するきっかけになるかも知れませんね。
あぁ、まるでMicrosoftの回し者だな(笑)

>いりやさんへ
> 外部というのは目的の言語の世界を指していて、内部というのはそれを実装
> するためのプログラム言語の世界です。
これ見て、「あぁ納得」って感じがしました(笑)
内部外部というよりかは、上層下層って感じですね。^^;;;

インタープリタを作ろうなんて考えた日には・・・頭がクラクラしそうです(爆)
想像しただけで、頭と胸が痛くなりますよ。(^^;;

メモリ上にオブジェクトがどう展開されているのかは、ちょっと興味がありますね。
想像はつきますが、本当はどうなっているのか調べたことはないですからねぇ^^;;

DMonkey見たいにソースコードが公開されているって、やっぱりいいことですね。^^オープンソース様様です(笑)
どうやって動いているのか見れるというのは、ホントに勉強になりますしね。

いりや さん 2003年 07月 22日 20時 01分 52秒

よっしーさん、

イメージ湧いてきました。

| 【条件1】
|  バッチファイルでの変数の定義を前提としているため、バッチファイル
|  で、定義した変数をパラメタとして、CScript.exeを介してスクリプト
|  を起動する。
|
| 【条件2】
|  スクリプトでは、あるコマンドプログラムを起動し、そのexitコード
|  を取得(WSHShell.Runメソッドを使用)
|
|  で、スクリプトで取得したexitコードを上位のバッチファイルへと
|  返したいのですが・・・・。

条件2は、

exitCode = .... ;
  WScript.quit(exitCode);

でいけると思います。

条件1は、

  cscript.exe なにがし かにがし
  echo %ERRORLEVEL%

という風に、条件2で設定した exitCode を %ERRORLEVEL% 変数を経由して
取得することができるとおもいます。

また、google でちょっと参考になる掲示板投函記事を偶然発見しましたので
ご参考までにリンクを。

[ Related links ]

(1) Windows Script Host, Quit Method
  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wsmthquit.asp

(2) WinXP Help
C:\> start /?
C:\> exit /?

(3) @Nifty, FPCU DOSプロンプト活用相談室
http://bbso1.nifty.com/nbbin/nb_wrentC_m/fpcu_bbso-003/wr_add=4621/wr_type=C/wr_page=1/wr_sq=03061820384905980015
http://bbso1.nifty.com/nbbin/nb_wrentC_m/fpcu_bbso-003/wr_add=4621/wr_type=C/wr_page=1/wr_sq=03061905555905980067


|  ファイル受け渡しの場合、パラレルでバッチを起動された場合、バッティング
|  する可能性があるので、控えたいです。

確かにおっしゃる通りです。

いりや

よっしー さん 2003年 07月 22日 19時 23分 59秒

いりやさん、ありがうございました。

幾分か、私の説明不足でしたので、もう少しご教授ください。

【条件1】
 バッチファイルでの変数の定義を前提としているため、バッチファイル
 で、定義した変数をパラメタとして、CScript.exeを介してスクリプト
 を起動する。

【条件2】
 スクリプトでは、あるコマンドプログラムを起動し、そのexitコード
 を取得(WSHShell.Runメソッドを使用)

 で、スクリプトで取得したexitコードを上位のバッチファイルへと
 返したいのですが・・・・。
 ファイル受け渡しの場合、パラレルでバッチを起動された場合、バッティング
 する可能性があるので、控えたいです。

 ご教授の程、お願い致します。

いりや さん 2003年 07月 22日 16時 38分 56秒

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

Windows Scripting Host (WSH) の行く末は私も興味津々です。

とはいうもののわたしは過去 C:\Progra~1 みたいな ~数字 という表示に力
が抜けて以来ずっと UNIX 系 (PC UNIX もしくは Cygwin) で仕事をしていま
した。

それが WSH のおかげで ~数字 の呪縛から開放されて Win32 環境でスクリプ
トを書けるようになりました。ですので WSH が使用できなくなる、というこ
とが当面なければあんまり心配はしていませんね〜。

あさじゃけんさん wrote:

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

彩香さん wrote:

| 内部とはOSの領域でしょうか?
| 全てのプログラムは全てOSの上で動いているものですから、
| でも、これじゃ単純過ぎますね。
| でも、普段考えないような事を考えたりできて、
| まだ、今の私には謎解きのような感じですが、
| とても楽しかったです(^^

言葉が舌足らずでした。すみません。

外部というのは目的の言語の世界を指していて、内部というのはそれを実装
するためのプログラム言語の世界です。WSH Lab. 掲示板ではポピュラーな存
在の DMonkey という ECMAScript (JavaScript) エンジンを例にとりますと、
内部というのは Delphi (Object Pascal) の世界で、外部というのは
ECMAScript (JavaScript) 、という意味です。

オブジェクトという新しいデータ構造は一体どのようにメモリ上に表されて
いるんだろう、Variant 型なんてどうしてあるんだろう、変数や戻り値に型
を宣言しないなんてどういうこと? みたいな話は実装にヒントが隠されてい
ると思っています。それでインタープリタにアタックしてみてはと申しあげ
ました。

DMonkey というちょうどよいお手本がありますから、まずはとっかかりとし
て DMonkey のソースコードにトライされていはいかがでしょうか。

プロジェクト: DMonkey
http://sourceforge.jp/projects/dmonkey/

例えば、外の世界である DMonkey (ECMAScript) の String という組み込み
オブジェクトは、ecma_object.pas の 151 行目で TJStringObject =
class(TJObject) というクラスとして Delphi 内部で取り扱われています。
また各種メソッドもそれに続いて定義されています。同様に Array 組み込み
オブジェクトも TJArrayObject (100 行目) におります。

すぐには疑問が氷解しないかもしれませんが、どうぞ少しずつ少しずつ。

いりや / 実装大好き

いりや さん 2003年 07月 22日 15時 18分 44秒

よっしーさん、

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

こんなやり方もありますよ、ということでご紹介します。

(1) は、標準出力をバッチ側で処理したい場合の一例。バッチが頑張るタイ
プです。一方 (2) は、cscript の結果を Windows Scripting Host (JScript)
で取り扱う、というもの。バッチ側の役目は C:\test-scriptExec.js を起動
するところまで。標準出力の処理は test-scriptExec.js にまかせる、そう
いう役割分担です。


(1) .bat ファイルから cscript で起動した JScript プログラムの標準出力
  の結果を sample.log ファイルに格納する

[ c:\sample.js ]

WScript.Echo("1行目のメッセージ");
WScript.Echo("2行目のメッセージ");
WScript.Echo("3行目のメッセージ");

[ c:\sample.bat ]

cscript //nologo c:\sample.js > sample.log

[ 実行の仕方 ]

c:\sample.bat アイコンをダブルクリックするか下記の通りコマンドプロン
プトからファイル名をタイプする。

[ 実行の結果 ]

C:\>sample.bat

C:\>cscript //nologo c:\sample.js 1>sample.log

C:\>type sample.log
1行目のメッセージ
2行目のメッセージ
3行目のメッセージ

C:\>

(2) .js ファイルから cscript で起動した JScript プログラムの標準出力
  の結果を Array オブジェクトに格納して表示する

[ c:\sample.js ]

同上

[ C:\test-scriptExec.js ]

var aShell = new ActiveXObject("WScript.Shell");
var wshScriptExec = aShell.exec("cscript.exe //nologo c:\sample.js");
var outputArray = new Array();

while (!wshScriptExec.stdout.atEndOfStream) {
    outputArray.push(wshScriptExec.stdout.readline());
}

while (wshScriptExec.status == 0) {
    WScript.sleep(0.1 * 1000);
}

array→string(outputArray);
WScript.echo("Exit code = [" + wshScriptExec.status + "]");

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

[ 実行の仕方 ]

上記スクリプトの全角スペースを半角スペース 2 つに置き換えてその名前で
保存する。ファイルをダブルクリックする。

[ 実行の結果 (ウインドウの写し) ]

1回目のウインドウ

  0: [1行目のメッセージ]
  1: [2行目のメッセージ]
  2: [3行目のメッセージ]

2回目のウインドウ

  Exit Code = [1]

[ 参考となるサイト ]

Windows Script Host, WshScriptExec Object
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wslrfscriptexecobject.asp

いりや

よっしー さん 2003年 07月 22日 13時 50分 38秒

はじめて、投稿します。
よろしくお願いします。

本題ですが、バッチ中で、CScript.exeをかまして、スクリプトを呼び出す場合、スクリプトの実行結果を上位のバッチファイルで取得する方法ってあるのでしょうか?

ご教授の程、お願いします。

ど素人 さん 2003年 07月 22日 11時 31分 30秒

こんにちは!
私はまったくのど素人なのですが、プログラムに興味がありまして、
このサイトを見つけました。
こちらは、僕のようなど素人でも、非常に分かりやすく書かれていて、
大変素晴らしいです。
このような有意義なサイトの運営を、これからも頑張って下さい^^

管理人むたぐち さん 2003年 07月 22日 11時 29分 10秒

お前ら、WindowsScripting使ってますか? Part3
http://pc2.2ch.net/test/read.cgi/win/1058829737/

2ch Windows板のWSHスレが新スレに移行しました。
Part2で取れなかった11、今度は取りましたよ。


To: あさじゃけん さん
> まぁ、どうせMicrosoftの事なので、よさそうなものを後から吸収するつもりなんじゃないでしょうか。

いきなり余談になりますが、遅ればせながら.NET Framework SDK 1.1(Japanese)
を入れました。
で、このヘルプが"Microsoft Document Explorer"と称するものなんですが、
これタブブラウザそのものだったりします。
IE7もタブブラウザになるそうですが、やはり良さそうなものは貪欲に吸収、
ってのがMSの性なんでしょうか。

> やはり、作り手としては、既存の文法とほぼ変わらぬ記述の仕方っていうのに、魅力を感じてしまいます。

私もDSHが、おそらくWSH.NETに一番近い姿なんじゃないかという気がしてきました。

で、WSHで言うところの*.vbsや*.jsに相当するものですが、jsだけが生き残る可能性がありますね。
というのも、JScript.NETはそのままJScriptと下位互換性を保っているのに
対して、VBS→VB.NETは全然変わってますからね。
AxSxriptでは、拡張文法を採用して、VB.NETをVBS的に使う方法を提供
してますが、これは何となくMS的じゃない気がするのです。

> #余談ですが、VBXってOLEのやつと名前被ってませんか?(笑)

ええ、私もそれは思いました。
でも.NETな世界では、いくらなんでもVBXはもう過去の遺物でしょうから
それでいいんじゃないかな。

あさじゃけん さん 2003年 07月 22日 10時 03分 57秒

> DOTNET Scripting Host (DSH)
> Toolsack DotNet Script Host (DNSH)
> Alintex Script .NET
ううむ。
既に話についていけてない気がしますねぇ(汗)

でも、個人的には、やっぱりOS標準が「WSHの売り」でもあるので、実際に実装されるまで、「待ち」状態になると思いますね。^^;;

まぁ、どうせMicrosoftの事なので、よさそうなものを後から吸収するつもりなんじゃないでしょうか。
つまり、基盤である.NET Frameworkをマイクロソフトが握っているわけですから、その上で動くものをある程度作らしておいて、よさそうなものが出たら「パクッ」といく感じでしょう(笑)

私は、今のMicrosoftは、しばらく静観して、市場の動きを監察しようってクチな気がします。
だからあえて具体的な将来像はうたっていないのだと思います。

・・・と、話がそれてしまいました(汗)

私はむたぐちさんの説明を見ただけで言うのですが、DSHがいいかなぁと思いました。
やはり、作り手としては、既存の文法とほぼ変わらぬ記述の仕方っていうのに、魅力を感じてしまいます。
確かに、むたぐちさんが言う通り、手軽さは失われてしまいますが、wsfと同じように扱えるのは、今まで触ってきた人に対しては、入りやすい感じがします。
コンパイルできるってのもミソですね(^^

ほかのサンプルプログラム見てる感じでは、ちょっと「WSH離れ」しすぎているような気がするので・・・・って、私が.NET理解していないだけですけどね(笑)
まぁ、.NETでVBもガラリと変わるので、今までのVBに近いか、.NETに近いかの違いなんでしょうけどね^^

まぁ、とにかく、まったく新しいものがMicrosoftから出たら、このサイトのタイトルも変わるかも知れませんね(笑)

#余談ですが、VBXってOLEのやつと名前被ってませんか?(笑)
#まぁ、もう世の中にはほとんどないでしょうが。。
#あれも、「VBX→OCX→ActiveX」と名前が変わっていってますしねぇ・・

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

さっそく訂正。
> また、各ホストとも、スクリプトをコンパイルして実行形式として出力することも
> できるので、

これができるのはDSHだけみたいでした。
AxScriptにも/outputオプションがあるんですが、これはpre-compileされた
キャッシュ(*.dll)を保存するフォルダを指定するものでした。
(デフォルトはtempフォルダに生成される)
この点は、//OUT:でexeを作れるDSHに軍配が上がりますね。

@ Assembly Name="System.Xml.dll"なんてコード中にいきなり書ける
DNSHも捨てがたいし…。
System.Xml.dllもそうですが、よく使うやつは、AxScriptでも宣言
しなくて使えるんですけど、他のを色々試したい時はコマンドライン
を使わなきゃならないんで不便ですね。

ううむ。

管理人むたぐち さん 2003年 07月 20日 11時 24分 44秒

●.NET Script Host

2003年 07月 18日 08時 31分 15秒にも書いたように、.NETなWindows Script Hostが登場するのは
まだ先になりそうである。
が、やはり世の中には待ちきれない人がたくさんいるわけで、
Common Language Runtime(CLR)でプレーンテキストに記述でき、.NET Frameworkのクラスを
用いることのできるスクリプトホスト".NET Script Host"が、Microsoft以外からいくつか
リリースされている。

ここではWindows-Script(http://groups.msn.com/windowsscript)で紹介された、三種類の
.NET Script Hostを取り上げる。
なお、実行にはMicrosoft .NET Framework 1.1が必要になる。
レビューに用いた環境はWindows2000 Pro. sp4, IE6 sp1, Microsoft .NET Framework 1.1(日本語)である。


【DOTNET Scripting Host (DSH)】
http://www.dotnetframework.de/scripting/dotnetscripting/dsh.en.asp

■概要
Windows-Scripting.comの公式(?).NET Script Hostである。(MS公式ではない)
ドイツ人が作っただけにサイトがドイツ語ばかりで面食らうが、リファレンスは英語のpdfが
用意されているので心配ない。

■種別
フリーソフト(メールアドレス等の登録が必要)

■動作環境
.NET Framework 1.1

■インストール
インストーラーがbatとregなのでちょっと面倒。
WinNT、2000では両ファイルのインストールパスをC:\WinNT\System32に書き換えてから
install.batを実行すること。

■特徴(上記サイトのものを和訳)
1. コンパイルなしで、コマンドラインから、またはファイルをクリックで即実行可能。
2. スクリプトにパラメータを渡すことができる。
3. 一つのXML文書内に複数のスクリプトを記述できる。
4. 一つのスクリプトファイル内に複数の言語で書いたスクリプトを混在可能。
5. 言語としてVisual Basic .NET, C#, JScript .NETが使用できる。
6. コンポーネントが使用できる(.NET Framework Class Library クラス 、他の.NET アセンブリによるクラス)
7. スクリプトのリモート実行が可能(Remote Scripting)
8. テキストファイルやWindowsイベントログにログを残すことができる。(オプション)
9. 実行形式としてコンパイルされたスクリプトを保存することができる。(オプション)

■Hello World.dsh
<?xml version="1.0" encoding="Shift_JIS"?>
<scriptdoc>
<script name="hello" language="vb.net">
<![CDATA[
Imports Microsoft.VisualBasic
Module Main
Public Sub Main()
MsgBox("こんにちは、世界。")
End Sub
End Module
]]>
</script>
</scriptdoc>

■レビュー
スクリプトは、XML形式で記述し、基本的にwsfファイルを記述するのとほとんど
変わらないようだ。拡張子は*.dsh。
<xml>要素のencoding属性でShift_JIS等を指定すれば、日本語を使うこともできる。

<script>要素内のコードは、Language属性で指定した各々の言語仕様に準拠しており、
独自拡張はない模様。
スタートアップは<script>要素のstartClass属性で指定する。省略するとMainクラス
(VB.NETではMainモジュール)が実行される。
.NETアセンブリをインクルードするには、<references>要素内で<assembly>要素を用いる。

XML形式のため、残念ながら、VBSやJSのようなちょっと書いてすぐ走らせるような気楽さは
ないといっていいと思われる。また、VB.NETなどは必ずModuleやClassで構造化しなければ
ならないので、ちょっとしたスクリプトを書くのにはいささか大仰である気もする。
JScript.NETを使うのがお勧めかもしれない。
その代わりコンパイル済みの実行ファイルとして保存できるメリットもある。

他にはコマンドラインオプションによって、スクリプトのリモート実行ができるのが特徴的か。

コマンドラインオプションや、XMLの構文等、全体的にWSHを意識した作りをした
.NET Script Hostと言える。


【Toolsack DotNet Script Host (DNSH)】
http://www.toolsack.com/documentation/dotnetscripthost/

■概要
Toolsack DotNet Script Host(DNSH)は、WSHを元にした、.NET Script Hostである。
テキストファイルに記述した.NET言語のスクリプトを実行できる。
現バージョンではC#とJScript.NETが利用可。

■種別
フリーソフト

■動作環境
Windows NT/2000/XP/98/ME
.NET Framework 1.1

■インストール
ダウンロードしたmsiパッケージを実行する。

■Hello World.ns
@ Script Language="csharp"
System.Windows.Forms.MessageBox.Show("こんにちは、世界。");

■レビュー
簡易エディタが付属しているが、もちろん普通のエディタでも記述できる。
テキストファイルをUTF-8で保存すれば、日本語も記述できる。
(Shift_JISは不可だが、Win2000のメモ帳はUTF-8の読み書きが可能なので問題なし)
なお、拡張子は*.nsとなる。

Hello Worldを見てもらえれば分かるが、C#をClassで構造化せずいきなり記述できるという点が
なかなかすばらしい。
C#をJScript.NET同様、スクリプト的に使うことができる。
一行目の@で言語を指定するのは、UNIXのシェルスクリプトに似ている気がする。

@ Assembly Name="System.Xml.dll"のように.NETアセンブリをインクルードすることも可能。

@ Script Language="csharp"を省略した場合、JScript.NETのコードと解釈される
はずなのだが、こちらの環境ではエラーになってしまうのが残念。
.NET Frameworkのバージョン・言語に依存するのか?
DNSHでJScript.NETを使用すると、WSHでJScriptを利用した場合と感覚的に
近くなると思われる(が、なぜか動かないわけで…)。

全体的にシンプルさを追求しているようで、今後はVB.NET(とJScript.NET)の対応が期待される。


【Alintex Script .NET】
http://www.alintex.com/products.htm

■概要
今月8日に登場したばかりの商用アプリ(個人利用はフリー)な.NET Script Host。
高機能。

■種別
個人利用に限ればフリーソフト
商用利用はUS$ 29.50のライセンス料が必要

■動作環境
Windows 98, ME, NT, 2000, XP, Windows Server 2003
.NET Framework 1.1
Java(J#)を利用する場合は、別途Visual J# .NET Version 1.1(フリー)が必要。

■インストール
ダウンロードしたexeファイルを実行するとインストーラーが起動する。

■特徴(上記サイトのものを和訳)
1. VB.NET, C#, JScript.NET, Java(J#) をサポート。
2. .NET Framework クラスライブラリ (FCL) と、 Java JDK 1.1.4 ライブラリをサポート。
3. 他の製品を買わずとも、これだけで.NETアプリ、Javaアプリを作成できる。
4. フレームワーク、オブジェクト、メタデータ、Javaか対応した.NET言語のどちらかで
記述したコードの共有が可能。
5. 一つのAlintex スクリプトに、異なった言語で記述された複数のスクリプトファイルを
含めることができる。
6. スクリプト内では、一つのスクリプトファイルから自動的に他の複数のスクリプトファイル
に含まれる機能にアクセスできる。
7. 複数のファイルから成るスクリプトをコマンドラインから実行できるので、
各スクリプトファイルの再利用が容易。
8. 自動スクリプトキャッシュ・リファレンス機能によって、複数の言語にわたって
最小限のコンパイルを保証する。
9. VB.NET と JScript.NETでは、型なしプログラムおよびレイトバインディングをデフォルトでサポート。
10. JScript.NET はデフォルトでJScriptと下位互換性のあるコードで記述できる。
11. 新しくスクリプト用の拡張子をサポートしたことで、アイコンをクリックする
だけでスクリプトが起動できる。
12. スクリプトにスクリプト#regionコードを含めることで、エントリポイントの
クラス・モジュール・メソッドのコードを省略できる。(なので当然JScript.NETには無い)
13. 全ての言語でコマンドラインオプションがサポートされており、
スクリプト#region内に暗黙的に含まれているargsオブジェクトからアクセスすることができる。
14. アプリ・環境・ランタイム情報にアクセスできるように、言語仕様が拡張されている。
15. 言語仕様拡張により、便利なprintメソッドおよびInputBoxダイアログが使用できる。
16. 言語仕様拡張により、GUI(Windowsアプリ)、CUI(コマンドライン)、Unattended
(自動モード)のどれで実行されてるかを簡単に判断できる。(GCUデザインパターン)
17. 作者、スクリプト情報等をスクリプト内に埋め込める。
18. 複数のスクリプトファイル、設定、作者、スクリプト情報を一つの
Portable Script Fileに含めることができ、コード再利用・配布が容易になる。
19. Portable Script Fileをフォルダに展開することができ、ユーザーはスクリプトを
修正し、自動生成のbatファイルをクリックするだけで簡単にPortable Script Fileに
再パッケージ化することができる。
20. Portable Script Fileの内容の説明は、ファイル内にその情報を持っており、
Webブラウザでそれを表示することが可能。作者情報、スクリプト情報、スクリプト設定、
そしてコードが表示される。
21. 実行環境には、コンソール用(AxScript)とウィンドウ用(AxWscript)がある。
22. ウィンドウ用ホスト(AxWscript)は、コンソール出力をキャプチャー・表示できる。
そのため、コマンドライン・ウィンドウモードのどちらを想定したスクリプトでも、
どちらのホスト環境でも実行することができる。
23. AxWscriptは、タスクトレイの通知アイコンおよびコンテキストメニューにより、
ユーザーへのインターフェースを提供する。スクリプトは手動、または設定した
タイムアウトで自動的に停止できる。エラーは、対応OSのアプリケーションイベントログ
に最適化されて記録される。
24. 内蔵の診断オプションによって、スクリプトの.NET Type(クラス、構造体、
インターフェース、列挙体、デリゲート)が表示できる。
25. モジュール構造により、追加言語を容易にインクルードできる。
26. 対応の全言語にサンプルが用意されている。
27. Getting Started チュートリアルが用意されている。

■Hello World.vbx
#region "Script"
print("こんにちは、世界")
#end region

■レビュー
ます特徴的なの点として挙げられるのが、各言語ごとのファイルタイプを採用しており
(VB.NET = *.vbx, JScript.NET = *.jsx, C# = *.csx)、WSHのvbs、jsファイルと
ほぼ同等の感覚で利用できるという点であろう。
なお、日本語はUTF-8で保存すれば使用できる。

また、#region "Script"という言語拡張機能により、VB.NET、C#でもClassや
Moduleで構造化せずにいきなりコードを書くことができる。
(#region自体が言語拡張機能というわけではない)

よく使われるSystem.dll、System.Windows.Forms.dll、System.Drawing.dll、
System.Xml.dll、System.Data.dllは自動的に参照される。
これ以外の.NETアセンブリを使うには、コマンドラインオプション/referenceを
用いる必要がある。

VB.NETでは上記に加えてMicrosoft.VisualBasic.dllが自動的に参照される上、
Imports Microsoft.VisualBasicを書かなくても名前空間を省略できる。
つまり、VBSとほぼ同じ感覚で関数が使えるわけである。
なお、JScript.NETにおけるMicrosoft.JScript.dllも同様である。
VB.NETではデフォルトでは型なしで記述できることもあり、
VBS的お手軽さをVB.NETでも享受できる。

InputBoxクラス、ScriptInfoクラス等の、スクリプトホストとして有用な機能は、
AlintexScriptという名前空間に属する.NETのオブジェクトとして実装されている。
その中のScriptBaseクラスに属するprintメソッド(コンソールに文字列出力)は、
スクリプト#region内では宣言なしに利用できるのが嬉しい。

各言語別ファイルタイプのほかに、WSHで言うところのwsfファイルに相当するファイル、
Portable Script File(*.psf)というXML形式のファイルフォーマットもサポートしている。
基本的にはwsfと同じく、スクリプトの寄せ集めなのだが、wsfよりも高機能である。
作り方は、まず各言語ファイル(*.vbx等)を記述し、コマンドラインオプション/packを使い
作成した各ファイルを読み込むと、*.psfファイルが生成する。
すなわち、手動でXMLを記述する必要はない。
その際、実行時のコマンドラインオプション(/reference等)も反映される。
また、*.psfファイルの情報をWebブラウザで表示したり、*.psfを元の*.vbxファイル等に
展開することなどもできる。

スクリプト実行中はタスクトレイにアイコンが表示され、ここからスクリプトを停止させる
ことも可能であり、WSHにあった欠点もカバーしている。

ここで紹介しきれなかったこともあるが、Alintex Script .NETが非常に多機能かつ、
スクリプトとしての簡便性を重視した.NET Script Hostと言えるのがお分かりいただけると思う。


【総評】
以上の三つの.NET Script Host、すなわち、
 DOTNET Scripting Host (DSH)
 Toolsack DotNet Script Host (DNSH)
 Alintex Script .NET
は、それぞれに特徴があり、どれが次世代の.NET対応WSHに近いものになるか、
想像すると楽しい。

この中ではAlintex Script .NETが一番完成されている気がする。さすが商用アプリ
というところか。
個人的には今後これを常用していこうかと思う。
しかしながらDSHにはwsfライクなXMLで書け、Shift_JISを使用可能、
DNSHにはエディタ付きのため書いて即実行できる、などの捨てがたい魅力があるのも
事実であり、好みと状況に応じて使い分けるのがいいのかもしれない。
幸いなことに、拡張子はバッティングしていないため、すべてのホストを
共存させることもできる。

実行速度に関しては、やはりコンパイルのステップを挟んでいる分、
WSHよりは時間がかかる。
しかし、同じスクリプトの二回目以降の実行は、いずれのホストにおいても、キャッシュが
効く為か、初回ほどは時間はかからない。
また、各ホストとも、スクリプトをコンパイルして実行形式として出力することも
できるので、スクリプトがある程度完成したらコンパイルしたものを保存し
利用するようにすればいいかもしれない。

これらの.NET Script Hostを用いることは、
*.vb、*.cs、*.jsを逐一コンパイラに通すよりスマートかつ効率的なのは
間違いないので、.NET言語をスクリプト的に用いたいという方は、利用してみてはいかがだろうか。

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

C#Builder Downloads
http://www.borland.com/products/downloads/download_csharpbuilder.html

BorlandのC# Builderにも、Delphiと同様のPersonal版があって、
これもダウンロード版は無料です。
日本語版はまだのようですが、英語版がダウンロードできます。
登録に住所氏名電話番号まで書かされるのがちょっと面倒ですんで、
私は日本語版が出るまで待ちます。


To: つちや さん
> Dictionaryオブジェクトをソート

似たようなのを私も作ったことがあります。
そのときは私も、

For Each key In Sort(D1.Keys)
D1.Item(key)
Next

みたいにして各値を取り出して使いました。

Dictionaryオブジェクト(というか連想配列)は、本来キーの並び順を
保証するものではないので、ソートはこのように出力に対してのみするのが
正解なんだと思います。

つちや さん 2003年 07月 19日 11時 08分 42秒

Dear pochiさん

Set objWSH = WScript.CreateObject("WScript.Shell")
objWSH.Run("C:\winnt\system32\cmd.exe /K DIR /W")
のように、cmdのうしろにコマンドを入れてもだめです?

ちなみに次の一行のようにしても動いたりします。
CreateObject("WScript.Shell").Run "%COMSPEC% /K DIR /W"

つちや さん 2003年 07月 19日 11時 00分 02秒

Dear むたぐちさん

参考になるかわかりませんが、Dictionaryオブジェクトをソートする例を。
(本当はソートされたDictionaryオブジェクトを作っているだけですが)
ソートルーチンはunibonさんのを基本にさせていただいています。
まあ、D2を作らなくても、D1.Item(K(i))で順番にItemを取り出せますが。。。

Set D1 = CreateObject("Scripting.Dictionary")
D1.Add "きじ","雉"
D1.Add "さる","猿"
D1.Add "いぬ","犬"

K = D1.Keys
Call Sort(K)

Set D2 = CreateObject("Scripting.Dictionary")
For i = 0 to UBound(K)
D2.Add K(i),D1.Item(K(i))
Next

MsgBox Join(D2.Keys) & vbNewLine & Join(D2.Items)

'以下ソートルーチン=======================================
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 A(0) < B(0) Then
CompareAB = -1
ElseIf A(0) > B(0) Then
CompareAB = 1
Else
CompareAB = 0
End If
Else
If A < B Then
CompareAB = -1
ElseIf A > B 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

pochi さん (kita_kama@mrj.biglobe.ne.jp) 2003年 07月 18日 13時 51分 02秒

DOSのコマンドラインからWSHを実行する事はできますが、
WSHでDOSのコマンドラインを実行する事はできませんか?
たとえば c:\>DIR /W を実行するとか

Set objWSH = WScript.CreateObject("WScript.Shell")
objWSH.Run("C:\winnt\system32\cmd.exe")
ではDOSを開くだけです。

管理人むたぐち さん 2003年 07月 18日 09時 22分 05秒

と思ったら、ちょっと検索かけると、MS関係以外の国内サイトでも
ちらほら対応サイトがありますね。

JTB Alerts http://act.jtb.co.jp/alerts/
東京三菱クイックアラート http://act.jtb.co.jp/alerts/

(参考)
.NET Alertsサービスの本格提供がスタート - まずはJTB、東京三菱銀行から(MYCOM PC WEB) http://pcweb.pc.mycom.co.jp/news/2003/03/19/05.html
結構最近始まったわけですか。

あとはMSNオークションや、MSのオンラインサポートなど。
さっき書いた「答えてねっと」はMSのサービスでした。

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

MSN Messenger バージョン 6.0
http://messenger.msn.co.jp/

昨日リリースされたばかりのMSN Messenger ver 6.0ですが、これに
自動会話ロギング機能というのが新しく追加されています。
何でここで取り上げたかというと、これ、xmlで保存されるんですよ。

自分のアカウント名\Historyというフォルダ下に、
MessageLog.xsl
話した相手のアカウント名.xml
という形で保存されます。
xslってのはXSLスタイルシートで、XML文書の書式を定義したものです。
どちらもUTF-8で保存されます。

XMLなんでIEで閲覧することももちろん可能です。
また、XMLDOMを使ってWSHから触ってみると面白いかもしれません。

ところで、MSN Messengerは、.NET Passportなるサービスのアカウントで
認証するわけですが(.NET Passportのアカウントは、hotmailの無料アカウントを
取れば漏れなくもらえます)、これの仕組みが良く分からんです。
クライアント側に.NET Frameworkが必須というわけでもないので、
これはサーバー側が.NETな環境だということなんだろうか?
http://www.microsoft.com/japan/net/services/passport/overview.asp

あと、.NET PassportがHotmailとMessenger以外で使われてる例ってあるのかな。
海外では普及してるのかもしれないですが…。

と思ったら、ここがそうだった。
答えてねっと http://www.kotaete-net.net/bbs06001.aspx

WinXPだとOSレベルで.NET Passportが含まれてて、インストール直後は
アカウントを取れ取れと催促してきますな。あれもどうかと思うなあ。

管理人むたぐち さん 2003年 07月 18日 08時 31分 15秒

RPC インターフェイスのバッファ オーバーランによりコードが実行される (823980) (MS03-026)
http://www.microsoft.com/japan/technet/treeview/default.asp?url=/japan/technet/security/bulletin/MS03-026.asp

最大深刻度 : 緊急のセキュリティホールです。
DCOM絡みのようです。なぜかMEだけは問題ないそうですが、そのあたりからこの
セキュリティホールの性質が類推されたりしないんでしょうかね。

しかし、sp4を入れたばかりなのに何たるザマか。


To: いりや さん & 彩香 さん

> > インデントがつかないとソースって見辛いので入れたいのですが、
> > 何かタグを入れれば良いのでしょうか?
>
> こちら、HTML 文書では 1 個以上の半角スペースは 1 個とみなされてウェブ
> ・ブラウザでは表示されるようです。

半角スペースの連続を1個とみなすのはWebブラウザの仕様なのか、
HTMLの仕様なのかちょっと知らないですが多分後者なんでしょうね。

プログラムコードを載せる場合、<pre>タグを使うのが通例ですが、
残念ながらこの掲示板ではタグは使えません。
AKiOSさんの掲示板閲覧HTAを使えば、<pre>が補完されますので、
半角スペースやタブがあっても、表示が崩れずに閲覧できます。

> Variant型

VBSで使われるデータはすべてバリアント型という事実と、内部的には型が扱われて
いるという事実、両者は相容れない気がしますが、「文字列型」、「倍精度浮動小数点
数型」などは「バリアント型の内部処理形式」と表現するんですね。
これ、ヘルプの「VBScriptの基本」ってところに書いてあるんですが、基本を
忘れてました、私。

CIntなどのデータ変換関数の説明も、「指定された式をバリアント型 (内部処理形式が
整数型 (Integer) の Variant) に変換して返します。」と書いてあって、
「指定された式を整数型 (Integer)に変換して返します。」じゃないんですね。
カッコ内を取れば、すべてのC*系関数の説明が「指定された式をバリアント型に変換して
返します。」になってよく考えるとちょっと異様な気もします。

ちなみに、バリアント型は、内部処理形式が数値型なら、処理形式に依存せず、
16バイト固定です。
内部処理形式が文字列型の場合は22バイト+文字列の長さになります。
みなさんご存知と思いますが、私は忘れていたので再確認です。


To: 彩香 さん

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

これは期待通りの動作をしません。
詳しくはArray関数のヘルプを見ていただくことにして、
結論から言うと、
Files = Split(Mid(tempName, 1 ,Len(tempName)-1),",")
で期待する配列が返ります。

Split関数は、文字列から1次元配列を作る関数です。
スプリット文字は任意のものが指定できます。(ここでは , ですね)

ReDim使うならこういうのですかね。
Dim aFileList()
ReDim aFileList(-1)
For Each ObjFile In ObjFolder.Files
ReDim Preserve aFileList(UBound(aFileList) + 1)
aFileList(UBound(aFileList)) = ObjFile.Name
Next

あるいは、最初に変数サイズを決めておくならこうですか。
Dim aFileList()
ReDim aFileList(ObjFolder.Files.Count - 1)
Dim iFileCount
iFileCount = 0
For Each ObjFile In ObjFolder.Files
aFileList(iFileCount) = ObjFile.Name
iFileCount = iFileCount + 1
Next

…どれもあまりかっこよくないですね。
みなさんはどういう風にしてらっしゃるんでしょう?
sortしないなら、私ならこういうときはDictionaryオブジェクトを使っちゃいますね。

> そうなると、当然、VBScriptや Jscriptも言語仕様
> も一変するのだろうという推測ができますね。
>
> ただ、WSHに関しては私には何の情報も無くて、
> 次期Windows(LongHorn?)でのWSHの位置づけも分りません(^^;
> 何か情報をお持ちの方がいらしたら教えて下さい。

ここ2年くらい静観してるんですが、おそらく.NETベースになるであろう、
次世代Windowsスクリプトの実態は謎のベールに包まれたままですね。
MSのスクリプト関係ニュースグループを見ても、しばし待て、という記事しか
みつからないです。私の見落としの可能性もありますけど。

三大ActiveXスクリプトホスト、すなわち、IE(Explorer、HTA、HTMLHelp等含む)、
WSH、ASP(いや私が勝手に決めただけですが)のうち、ASPがASP.NETに移行する
ということは分かりますが、他は全然分かりませんね。

JScript.NETでは従来のJScriptのコードも動くそうなので、これがIEのスクリプト
エンジンとして動く可能性はあるでしょうが、VBScriptはどうなるのか?
まさか廃止というわけにもいかないでしょうから、やはりActiveXスクリプトエンジン
としてのVBScriptは今後も残るのか。
それならJScriptもJScript.NETとは別系統でやはり残るのか。
IEが.NETに移行するなら、HTMLのDOMはCOMから.NETのオブジェクトで実装しなおされるのか。
等々、分からないことが多いです。

どっちにしても、いつまでもクライアント側もCOMばっかりというのもあまり考えられないん
ですが、かといってがすぐに.NET一色になるというのもなさそうですね。


To: あさじゃけん さん

> IBMのAS/400

そういや少し前にYahooオークションで出ていた、ジャンク扱いのS/390は
どうなったんでしょ。

> 「メモ帳で出来るプログラミング」

MSは、WSHを誕生当初から今に至るまで、システム管理者向けの機能と考えてるわけですが、
もっと一般ユーザーに大々的に宣伝しても良かったんじゃないかなあと思いますね。
その分、私が宣教活動に勤しんでいたわけですが。
私の功績というわけでもないんでしょうが、現在ではWSHはそれなりに知名度が上がった
ようで結構なことです。
メモ帳だけでこんなことができるよーと示すと、喜ばれることも多いです。

しかし例のLoveLetterスクリプトワームを始めとする各種ワームが出現しなければ、
もうちっとマシな印象だったと思うんですけどねえ。
どうも普通のユーザーにはいまだに悪名が高いです。


To: 真琴 さん

> .wsfファイルをインクルード

これはできないような気がします。
一つの言語で完結する関数ばかりが格納されているwsfならば、
wsfじゃなくvbsなりjsなりにバラして、インクルードするしかないでしょうね。

もし複数の言語で一つの関数を作ってるようなケースや、
複数の言語で数多くの関数を一つのファイルに収めたいという場合は、
WSCにしてCOMコンポーネント化するのが良いと思われます。

これだと、レジストリに登録することになりますが、
wsf以外のvbsファイル等からでもCreateObject関数一つで呼び出せるし、
ファイルの存在場所も気にしなくていいなど、メリットも多いです。

詳しくはWSHヘルプの「Windows スクリプトコンポーネント」をご覧ください。
(正確にはWindowsスクリプトのヘルプですな)

Return