先のメッセージで書き忘れました。
WSH1.0(VBScript 5.0) には On Error Goto 0 がありましたっけ?
確か以前これがなくて(On Error Resume Next しかなくて)、一度
どこかで Resume Next してしまうと解除できず、随分不便だなと思
った記憶があるのですが、たまたま新しい VBScript 5.1 のマニュ
アルを見ていたら On Error Goto 0 がありました。
使いたいけど WSH1.0 で動かなくても困るスクリプトがあります。マ
ニュアルのバージョン情報ではずっと前からあるような記載ですが、
確か Resume Next しかなかったように思うのですが・・・記憶違いで
しょうか。WSH1.0 やマニュアルの書庫は既に削除してしまいました。
どなたか教えていただけると幸いです。
管理人むたぐちさん
>どうぞどうぞ。よろしくお願いします。
ありがとうございます。私は直接 Windows Scripting Host Lab に入っていますが
やはりリンク先は Mysterious Syndrome にしたほうが良いですね。
>C:\Windows\Systemにありますが、デフォルトでは参照設定の候補になっていません。
このファイル自体が存在しません(Win98SE で IE5 と VB6 と WSH2.0 が入っている
環境です)。うーーん、どこから入手できるんだろう。
PS
>何となく(^^;IE5をインストールしました。
IE5.01 の英語版はすでに出ています。多分日本語版も近いうちに出ると思います。
何となく(^^;IE5をインストールしました。
#カウンタが勝手に透過GIF化しているのには驚いた。
初期のバージョンであった、エクスプローラが使いものにならないほど重くなるバグは
解消されているみたいで一安心です。OEも軽くなったかな?
インストールした目的は、むろん、Shellオブジェクトのためです。Folder2オブジェクト
とか、Shellオブジェクトの拡張(ShellExecuteなど)とかがあって、ちょっと興味を引かれます。
これが現時点で、WSHで使えるかどうかは別として。Win2000で標準機能化すれば、使えるように
なるのかもしれませんので…。
あと、OE5のオブジェクトを何とか使ってみたいですね。無理そうですが…。
ShellUIHelperも、IE4よりメソッドが増えてます。
To: abuku さん
>MsgBox "Hello World!"
>
>というスクリプトを実行すると、「VBScript」というタスクバーが残っ
>てしまいます。
やはり、こんな現象は見たことがないですね…。
WSH2.0は正式版をインストールされていますか?
β版のバグかもしれないので…。
> 今IE5を使ってますが、この現象も出ますね。バグは修正されていない
>のでしょうか??
IE5をインストールしても、デスクトップ回りはIE4のモジュールで動いているので、
治らないわけですね。
To: 【おじさま】 さん
>さらに内容が充実しましたね。ここは是非周囲の人にもご紹介したいサ
>イトなのですが、私のところからリンクしても宜しいでしょうか。
どうぞどうぞ。よろしくお願いします。
>ところで win.tlb ってどこにあるのでしょう。ノートの環境にもデスク
>トップの環境にもこの名前のファイルはなかったのですが。
C:\Windows\Systemにありますが、デフォルトでは参照設定の候補になっていません。
ので、「参照」ボタンから、自分でファイルを指定する必要があります。
【おじさま】 さん
>全然違う話かもしれませんが、多分ビデオカードなどとの相性の問題で
>WSH に限らず本来は消えるはずの画面が消えないで残ることがあります。
>私のマシンはちょっとこの傾向があるのですが、最近 WSH を使い始めて
>みると、WSH で表示させたメッセージボックスなどは(ポップアップは
>自分では使ったことがないので)特にエクスプローラの画面に重なるよ
>うにメッセージボックスが表示された場合などこの傾向が強いような印
>象があります。あくまで印象ですのでちゃんと確認したわけではありま
>せん。
ビデオカードの問題というのは少なからずあるような気がします。こ
の状況についても何度かありますね。PCの性能にもよるのかも知れませ
んが・・・。
むたぐちさん
>ツールバーとは、タスクバーに表示されるボタンのことですか?
>VBSファイルを実行して、ツールバーが表示されるのは、ダイアログが
>出たときだけだと思うのですが、残ったツールバーとは、MsgBoxやPopu
>pによるものでしょうか?また、この現象はどのスクリプトを実行したと
>きにも起こります?
その通りです。タスクバーでした・・・。そうですね、どのスクリプ
トでも起こります。ですからテストで同じスクリプトを少しずつ修正し
て何度も実行していると、いつのまにかタスクバーが10、20になってし
まっていた経験があります。
例えば・・・
MsgBox "Hello World!"
というスクリプトを実行すると、「VBScript」というタスクバーが残っ
てしまいます。他のスクリプトも同じような状況だと思います。
で、他のスクリプトを実行するもしくは別のタスクバーを立ち上げる。
のような処理をすると、空のタスクバーの出来あがりです。
わざわざクリックして消すのが面倒で・・・・・・
>私はこの現象を見たことはありませんが、スクリーンセーバーを解除し
>た後、よくタスクバーに空のボタンが残ってしまいます。これはIE4のバ
>グらしいですが…。
今IE5を使ってますが、この現象も出ますね。バグは修正されていない
のでしょうか??
abuku さん
全然違う話かもしれませんが、多分ビデオカードなどとの相性の問題で
WSH に限らず本来は消えるはずの画面が消えないで残ることがあります。
私のマシンはちょっとこの傾向があるのですが、最近 WSH を使い始めて
みると、WSH で表示させたメッセージボックスなどは(ポップアップは
自分では使ったことがないので)特にエクスプローラの画面に重なるよ
うにメッセージボックスが表示された場合などこの傾向が強いような印
象があります。あくまで印象ですのでちゃんと確認したわけではありま
せん。
管理人むたぐち さん
さらに内容が充実しましたね。ここは是非周囲の人にもご紹介したいサ
イトなのですが、私のところからリンクしても宜しいでしょうか。
ところで win.tlb ってどこにあるのでしょう。ノートの環境にもデスク
トップの環境にもこの名前のファイルはなかったのですが。
ここ数日、この掲示板で得られた新知識を、「オブジェクトの解説」に反映させました。
まあ、見てください。
それと、IEのお気に入りをHTML化するスクリプトも作ってみました。
(暇はかかりますが、履歴もHTML化できます)
Shellオブジェクトを使うとこんなに簡単にできるんですね。FileSystemObjectは
変数をテキストファイルに書き出すのに使っただけです。
BrowseForFolderですが、どこに定数の一覧があるか、わかりました。
興味ある方は、win.tlbというファイルを参照設定してみてください。
これはWinAPIそのものっぽいです。
MSのサイトにある、WSH関連ファイル(*.exe)に直リンクを張ってもいいものなんでしょうか?
ちょっと迷っています。
To: abuku さん
>ふと疑問に思ったのですが、vbsファイルを実行した後に空のツールバー
>のようなものが残ってしまいます。
ツールバーとは、タスクバーに表示されるボタンのことですか?
VBSファイルを実行して、ツールバーが表示されるのは、ダイアログが出たとき
だけだと思うのですが、残ったツールバーとは、MsgBoxやPopupによるものでしょうか?
また、この現象はどのスクリプトを実行したときにも起こります?
私はこの現象を見たことはありませんが、スクリーンセーバーを解除した後、よく
タスクバーに空のボタンが残ってしまいます。これはIE4のバグらしいですが…。
おひさしぶりです。
ふと疑問に思ったのですが、vbsファイルを実行した後に空のツールバー
のようなものが残ってしまいます。
これ何とかならないのでしょうか?
もしくはマシンが悪いのでしょうか?
ニュースを見ていたら、こんな面白いものが。
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Popup "5秒後に閉じます。",5,"ボタンなしダイアログ", 59
59は、ボタンのないダイアログを表示させる引数です。
やはりWSHは隠し機能があって楽しめますね。
それにしてもどこにこんな情報があるのだろう。世界は広い。
WSH3への要望でちょっと盛り上がっていまして、みなさんいろいろ好き勝手言ってます。
その中でも究極なのは、Win32APIを直に呼び出せるようになること(笑)
こんなことができるようになったら、VB(どころかすべての言語ソフト)が売れなくなるので、
さすがに実現しないでしょう。
…それにしても気の早いことですね。
To: 【おじさま】 さん
>本来はそうだと思います。これって仕様というよりもバグなんじゃないかと
>いう気さえしますね。
たしかにバグのような気がしますね。だいたい、特定動作によってページ違反やら
一般保護エラーが出るのはバグと相場が決まっています。
>凄い。ちっちゃなのばかり作っている私など聞いただけでやる気がなくなる
>テーマですが(私の場合大物を狙うには年齢的にも・・・・(^^;))
私のD:\vbディレクトリには、未完成のVBソースが山ほど転がってます(^^;
しかも小物ばかり(^^;;
前の書き込みはだいぶハッタリが入ってます(爆)
フリーのニュースリーダーで、OEと同等の性能を持つものがないので、誰か
作って欲しいというのが本音です。
>MSDN ライブラリ日本語版
高いですよね。とても趣味でプログラミングをやっているような人が購読できるものでは
ありませんね。
To: G.B.F. さん
Word95にはVBAがついていないので、WSHからも操作できないらしいです。
(Excel95のみ)
#これもニュース投稿にありました。
管理人むたぐち さん
>*.httはJavaScriptで書かれているのですが、ここから使えないとしたら、
>どこで使うために設計されているんでしょうね。
>
>Folderオブジェクトなどは、*.httで使うことを想定して設計しているのだと
>思っていたのですが。
本来はそうだと思います。これって仕様というよりもバグなんじゃないかと
いう気さえしますね。
As FolderItemVerb と宣言しなくてはならないということは VB でも参照設
定していないと使えないということです。そうじゃないと FolderItemVerb
なんて変数の型はないよと叱られますから。でも仕様上は VB で参照設定し
た Early Bind であっても、参照設定しない Late Bind でオブジェクトを取
得しても、Late のほうがちょっと遅くなるというだけで書き方としては間違
いではないはずで、それが「スクリプトゆえの制限」ではなく VB ですらダ
メだとなると「なんだか変だな」という感じです。Folder Object や Folder
Item Object は Valiant でも使えて、FolderItemVerb Object はちゃんと型
宣言しないとダメというのも・・・。
>実は、Outlook Expressがわりに使える、ニュース&メール統合ソフトを作っ
>てみたいのですが、
凄い。ちっちゃなのばかり作っている私など聞いただけでやる気がなくなる
テーマですが(私の場合大物を狙うには年齢的にも・・・・(^^;))、管理人
むたぐちさんは私と違って基礎的なことをちゃんとご存知なので是非やって
みてください。
MSDN ライブラリ日本語版は、やたら高価な年間契約をしていると毎月更新さ
れたものが送られてくるそうですが、私はしていないので VB6 付属の古いも
ののままです。今回 Visual Studio 6.0 Plus Pack(\5,250) を申し込みまし
たので、多分これに新しい MSDN ライブラリ日本語版が含まれていると思い
ます。FolderItemVerb などについては英語で、しかもあんまり詳しくない説
明しかないので、こういうのが日本語になっていると良いのですが。
To: 【おじさま】 さん
>結局少なくとも FolderItemVerb Object だけは As FolderItemVerb
>としっかり型宣言してやらないとこのエラーになるようです(それじゃ
>やっぱりスクリプトからは使えない)。
やはりスクリプトからは使えない…ですか。何とかしたいものですが。
#何に使うかは後で考えるとして(^^;
>以前 Java を使う方から、本家 Java だと問題がなくても、JavaScript
>だと変数の型がないので(すべて Valiant 相当扱いなので)複雑なオブ
>ジェクトを代入したときに挙動不審なエラーが起こりやすいと聞いたこ
*.httはJavaScriptで書かれているのですが、ここから使えないとしたら、
どこで使うために設計されているんでしょうね。
Folderオブジェクトなどは、*.httで使うことを想定して設計しているのだと
思っていたのですが。
もしFolderItemVerbが使えたら、情報ペインに右クリックメニューを列挙して、
右クリックが必要ないエクスプローラに改造できるのですが。
まあ、VBなどで、エクスプローラライクのファイラーを作るのには役立ちそうです。
私も何かソフトを作ってみようかな…。
よく考えると、最近VBを立ち上げるのは「オブジェクトブラウザ」
を見るためだけです(^^;
あと、付属の「MSDNライブラリ」と「APIビューア」も活躍しています。
…何かもったいないですね。
実は、Outlook Expressがわりに使える、ニュース&メール統合ソフトを作ってみたいのですが、
これをつくるには、どれほどの知識が要求されることでしょうか。
またおまけです。BrowseForFolderとは関係ないですが。いつまで続くか?
時刻が変更されると、変更されたことを教えてくれるスクリプト。
例によって、何の役にも立ちません。
Set sys=WScript.CreateObject("SYSINFO.sysinfo","sys_")
Do
WScript.Sleep 100
Loop
Sub sys_TimeChanged()
msgbox Time
WScript.Quit
End Sub
変数の型宣言をすべて省略したら VB でも FolderItemVerb Object で
WSH と同じエラーを再現できました。
省略ではなく、すべて As Valiant でもだめ、As Object でもだめで、
結局少なくとも FolderItemVerb Object だけは As FolderItemVerb
としっかり型宣言してやらないとこのエラーになるようです(それじゃ
やっぱりスクリプトからは使えない)。
以前 Java を使う方から、本家 Java だと問題がなくても、JavaScript
だと変数の型がないので(すべて Valiant 相当扱いなので)複雑なオブ
ジェクトを代入したときに挙動不審なエラーが起こりやすいと聞いたこ
とがあり、今回の件ももしやと思いやってみましたら「当たり」かもし
れません。
管理人むたぐちさん
>そういえば、objItem.Verbs.Itemで返るFolderItemVerbオブジェクトの挙動はやはり変
>ですね。
>DoItしようとすると、WSH自体が落ちてしまいます。これができれば、右クリックメニ
>ューを列挙して、実行できるのですが…。
---------------------------
For Each objVerb in objItem.Verbs 'objItem は FolderItem だとして
「ここで objVerb をいろいろ試す」
Next
---------------------------
で objVerb には FolderItemVerb Object が順に入っている筈ですよね?
でもプロパティの Application と Parent を使うと不正な処理で落ちるし
Name プロパティはそんなプロパティはないといわれるし、DoIt もそんな
メソッドはないといわれます。
全く同じ事を VB でやって、「ここで objVerb をいろいろ試す」のところ
を Debug.Print objVerb.Name にすると下記のように表示されましたので
(拡張子 .txt のファイルを選択したとき)書き方は間違っていないと思
います。Verb って右クリックで表示されるメニューと同じなんですね。
---------------------------
Hidemaru
Notepad(Print)
クイック ビューア(&Q)
切り取り(&T)
コピー(&C)
ショートカットの作成(&S)
削除(&D)
プロパティ(&R)
---------------------------
それから上記の For 文ではなく
Set objVerb = objItem.Verbs.Item(0)
objVerb.DoIt
にしてテキストファイルを指定したら、それを読みこんでエディタが起動
しましたので DoIt もちゃんと働いています。
ということで、VB では問題なく使えるが、WSH では使えないということだ
と思います。
To: 【おじさま】 さん
>BrowseForFolder でファイルを拾う件については
デスクトップ直下のリンクを選択すると、「オブジェクトがありません」という
エラーが発生しているようです。デスクトップはFolderオブジェクトとして
取得できないようです。
また、Favoritesフォルダのurlファイルを選択しても同じエラーが発生しますが、
原因はわかりません。
他の場所にある.lnk,.urlは大丈夫のようです。
私が実験したファイルが、たまたまうまくいかない場所にあったというだけでした。
>ダウンロードした書庫に入っていた WSH.chm は WSH チュートリアルとリフ
>ァレンスなんですけれど、これのことではないのですか。
見落としてました(^^;
「ダウンロード」ではなく、「ドキュメント」のコーナーに、ダウンロード用が
ちゃんと用意されていたのですね。いやはや、申し訳ないです。
>VB は少し経験がありますが、最近 WSH が面白くてたまりません。
以下、私も同じ意見です。私もVBを使っていたのですが、ソフトを公開するには至りませんでした。
#一つアップしてたりしますが(^^;
VBは、とにかく何か高度なことをやろうとすると、APIの知識が要求されたりして、なかなか
大変でした。そこで出会ったWSHは、最初VBの機能縮小版のようにとらえて、侮っていました。
しかし、ファイル操作などに関しては、本家を上回るくらいの機能を持っていることが
判明してからは、いろいろなスクリプトを書いて、習得に努めるようになりました。
WSHが楽しくなるのは、自分の思った処理を、自分でほぼ何でもスクリプト化できるように
なってからだと思います。
WSHは、【おじさま】さんご指摘の良さに加えて、「スクリプトの配布が容易」「資料がネットで得られる」などの
メリットもあると思います。
あと、隠されている機能を暴くのが何とも言えません。
WSHはかめばかむほど味が出てきますね。
最後におまけ。
BrowseForFolderはシェル代わりになるかどうかの実験。
IE5をインストールしてから、エクスプローラが重くてストレスがたまっている方に
おすすめします。
実行できるアクションはopenだけですが、これでも結構使えます。
右クリックメニューを実行したい場合は、フォルダを開けばいいだけのことですから。
Const BIF_BROWSEINCLUDEFILES = &H4000
Set Win=Wscript.CreateObject("Shell.Application")
Do
Set objFolder=Win.BrowseForFolder(0,"開くファイル・フォルダを選んでください。",BIF_BROWSEINCLUDEFILES)
If Not objFolder Is Nothing Then
Set objParentFolder=objFolder.ParentFolder
If Not objParentFolder Is Nothing Then
For Each objItem In objParentFolder.Items
If objFolder.Title=objItem.Name Then
objItem.InvokeVerb
End If
Next
End If
Else
WScript.Quit
End If
Loop
そういえば、objItem.Verbs.Itemで返るFolderItemVerbオブジェクトの挙動はやはり変ですね。
DoItしようとすると、WSH自体が落ちてしまいます。これができれば、右クリックメニューを
列挙して、実行できるのですが…。
そういえば、folder.httに、このVerbオブジェクトを使うスクリプトを組み込んでみたことが
あるのですが、やはりうまく動きませんでした。
ちなみにfolder.httはエクスプローラのWeb表示を規定する、HTMLファイルです。左の情報ペインに
サイズや更新日時が表示されますが、これはGetDatailsOfメソッドを使っています。
また、「属性」リンクが表示されますが、これはInvokeVerbメソッドで、右クリックメニューの
「プロパティ(&R)」を実行しているわけです。
*.httをみていると、また新たな発見があるかもしれませんよ。
管理人むたぐちさん
早速掲示板レス書きツールをダウンロードしました。
分かりやすいスクリプトですね。大変参考になり第二引数の意味も
良く分かりましたし(こういうことができるんですね)、マウスイ
ベントなどでお悩みの件も何となく分かったように思います。あり
がとうございました。
今回 Microsoft からダウンロードした WSH2.0 のヘルプを見る限り
は、確かに ConnectObject が可能性ありです。ただちょっと試した
限りではヘルプの例題と同じようにやってみても「オブジェクトと
接続できない」みたいなエラーが出て、ちゃんとした使い方が良く
分かりませんでした。
BrowseForFolder でファイルを拾う件については
--------------------------------------
If Err.Number = myErrorNumber Then
Err.Clear
省略
End If
--------------------------------------
のブロックを
--------------------------------------
If Err.Number Then
Err.Clear
省略
Else
ErrClear
If Not objItem.IsFolder Then
GetFileName = objItem.Path
End If
End If
--------------------------------------
だとどうでしょう。またダメかも。
管理人むたぐちさん
>第二引数を使った例は、私が愛用している、掲示板レス書きツールなので、
>興味がある方は、ダウンロードしてみてください。
早速ダウンロードさせていただきます。第二引数うんぬんの話は全然分かっ
ていないのでサンプルが欲しいところでした。
>で、どうもlnkファイルやurlファイルを選択してもパスが返らないようなんです。
あれっ、まずい。エラー番号7以外のエラーが起こったか、それともエラーが
起こっていないか。
>それと、以前実験したときに確認したのですが、メモリ不足エラーは、起こらない
>こともあるようです。確か…。
FolderItem を得るのに、敢えて FolderObject.Items.Item にしたのは、
FolderObject.ParentFolder.ParseName(FolderObject.Title) だと abc.lnk
や abc.url を選択したときにたまたま同じフォルダ内に abc というサブフ
ォルダがあるとそっちを取得してしまうのと、どうもルートを選択すると親
がいないためかエラーになるようでこっちにしました。メモリ不足エラーに
ならない時には別のエラーになるのでしょうか。もしもエラーにならないの
ならば FolderItem は取得できているので、それはそれで良いような。7に
こだわらずにエラーが起こったときと起こらないときみたいに大雑把な分け
方のほうが良かったかも。
>でも、HTMLヘルプ版WSHリファレンスがないようですね。
ダウンロードした書庫に入っていた WSH.chm は WSH チュートリアルとリフ
ァレンスなんですけれど、これのことではないのですか。
>と思ったら、チュートリアルは「Windows Script Host」になってますね。
リファレンスも Windows Script Host でした。
VB は少し経験がありますが、最近 WSH が面白くてたまりません。なにせお
手軽。パワーのない旧式のノートでも問題ありません。変数の型を指定でき
ないのと DoEvents がないのがちょっと・・・だったのですが、どうもこれ
に限らずスクリプトってどれも変数はすべて Valiant 扱いなのが普通みた
いですし、WSH2.0 からの Sleep(これって API の Sleep そのもの?)が
DoEvents らしいし、ショートカットへのドラッグドロップもサポートされ
たし、もうちょっと普及しても良いと思います。プログラムやってみたいけ
ど開発ツールは高いしっていう人には最適。
ビット比較Andで、ファイルの属性を取得できますね。なんで気づかなかったのだろう(^^;
Function attr(num)
'数字が与えられると、その属性を返す。
If (num And 1)=1 Then attr=attr & "読み取り専用 "
If (num And 2)=2 Then attr=attr & "隠しファイル "
If (num And 4)=4 Then attr=attr & "システム "
If (num And 16)=16 Then attr=attr & "フォルダ "
If (num And 32)=32 Then attr=attr & "アーカイブ "
End Function
To: 【おじさま】 さん
>ないと知って驚きました。
私もこの事実を最近知り、VBSを選択して良かったなあ、と心から思ったものです(やや嘘)。
>やはり全く同じものではないのですね。この後のご説明はなかなか難しい
>です
これも私がこのサイトを立ち上げてから、この掲示板で教わったことです。
1年前のASCIIの記事に、イベントの宣言の仕方がわからない、とあったので
私もずっとわからなかったのです。
第二引数を使った例は、私が愛用している、掲示板レス書きツールなので、
興味がある方は、ダウンロードしてみてください。
>今回の難しさが分かってきました。要するに
略させていただきましたが、私の言いたかったことをわかりやすくまとめていただき
感謝です。
Titleプロパティでファイル名を取得しようとするのがイレギュラーなんですね。
あらかじめパスがわかっているファイルなら、NameSpaceメソッドでFolderオブジェクト
(実際はファイルを指定するが)を取得し、ParentFolderなどを使う例の方法で、
FolderItemオブジェクトを取得できるのですが…。
#その例は、「オブジェクト解説」にあります。
結局、ファイルも表示させる機能で、コモンダイアログの代用をさせようと言うのが
そもそも無理なんでしょう(^^;
ちょっと役に立つかもしれないスクリプトをおまけにつけておきます↓
'選んだプリンタの名前を表示。意味はあまりない。
Const ssfPRINTERS = 4
Const BIF_BROWSEFORPRINTER = &H2000
Set Win=Wscript.CreateObject("Shell.Application")
Set f=Win.BrowseForFolder(0,"プリンタを選んでください",BIF_BROWSEFORPRINTER,ssfPRINTERS)
MsgBox f.title,,"選んだプリンタ"
'選んだコンパネのアイテムの説明表示。実行もできる。やや実用的?
Const ssfCONTROLS = 3
Const BIF_BROWSEINCLUDEFILES = &H4000
Set Win=Wscript.CreateObject("Shell.Application")
Set f=Win.BrowseForFolder(0,"コンパネのアイテムを選んでください",BIF_BROWSEINCLUDEFILES,ssfCONTROLS)
For Each objItem In f.ParentFolder.Items
If f.Title=objItem.Name Then
msg=MsgBox (f.ParentFolder.GetDetailsOf(objItem, 1) & vbCrLf & "これを起動しますか?",vbYesNo,objItem.Name)
If msg=vbYes Then objItem.InvokeVerb "開く(&O)"
End If
Next
>一応私なりに書いてみました。長いのでメールします。
わざわざどうもありがとうございます。非常に参考になります。スクリプトの
書き方とか…。(見るところが違う?(^^;)
で、どうもlnkファイルやurlファイルを選択してもパスが返らないようなんです。
まだよくスクリプトを見ていないので、ちょっと原因が分かりませんが…。
それと、以前実験したときに確認したのですが、メモリ不足エラーは、起こらないことも
あるようです。確か…。
>うーーん、今翌日で職場で確認したのですが、Win98SE(含 IE5)+ VB6SP3 で
>も BIF_ナンタラは Const しておかないとエラーになります。オブジェクトブ
>ラウザでもそれらしき定数は見つけられません。
あれ、そうなんですか。
これはニュースに投稿して聞いてみるしかないのか…。
誰か私に英語力(writing)をください(爆)
別の投稿によると、shlobj.hというファイルにこれらの定数が書いてあるそうですが、
IEのソースって公開されてないですよね?
じゃあこれって何でしょう。
>WSH 2.0、VBScript 5.1、JScript 5.1 の 日本語 Documents が全部
>新しくなっています。
そのようですね。
でも、HTMLヘルプ版WSHリファレンスがないようですね。
いちいちWebを参照しないといけないのはちょっと問題です。
よって、私は英語版を愛用することにします(^^;
それと、Windows Scripting Hostの名称は残ったようです。一安心。
と思ったら、チュートリアルは「Windows Script Host」になってますね。
どっちなんだ、MS。
Wscript.exeのプロパティでは、昔から「Windows Based Script Host」になってたと
思います。
To: げん さん
>そうですね。SendKeysだけでは少々無理があるかもしれませんね。
>Windowがアクティブにならないうちにキー送信されたりしますから。
>AppActivateも併用しなければならないんでしょうね。
AppActivateを併用するのは、結構常套手段のようです。
Sleepメソッドも併用して、キーコードを送るタイミングを
調整する必要もありますね。
ただ、何か処理が遅れたりすると、とんでもないウィンドウにキーコードが
送られる可能性があって、重要な処理を任せるのはちょっと怖いです。
結論として、SendKeysを使うのは、わりと最終手段と言うことになるかも
しれません。
WSH 2.0、VBScript 5.1、JScript 5.1 の 日本語 Documents が全部
新しくなっています。
ついでにインストール先フォルダ名まで旧版とは変更になってます。
管理人むたぐち さん
>JSにもCreateObjectに準ずる関数があります。おそらくMSが独自拡張を
>施した部分でしょう。
ActiveXObject というのがそうですね。JavaScript の解説本には記載が
ないので、おっしゃるように Microsoft が拡張した JScript の機能なの
でしょう。
>#どうせなら、InputBox関数も追加しておけば…。
ないと知って驚きました。HTML に埋め込んだときだけ window.prompt が
あるようですが(実はスクリプトを埋め込んだ HTML というものをほとん
ど書いたことがない)デスクトップ上で動かすときには入力用の窓らしき
ものが全然ないんですね。IE で代用するサンプルというのもありました
が、難しくて良く分かりませんでした。
>VBSのCreateObject関数と、WScriptオブジェクトのCreateObjectメソッドでは、
>第二引数のもつ意味が違います。
やはり全く同じものではないのですね。この後のご説明はなかなか難しい
です。何とか理解できるように勉強してみます。ご質問の件も分かりませ
ん。お答えいただくばかりですみません。
>おお、これはありがとうございます。どこにあったんでしょう?
URL は忘れましたが、VB の Tips 集がある個人のサイトです。指定したフ
ォルダが開いた状態で BrowseForFolder 画面が出るように Shell Object
ではなく API の SHBrowseForFolder を使ったサンプルでした。今回の件
の参考にならないかなと思いましたが、当然 FolderItem のパスを得るに
も API の SHGetPathFromIDList を使っていますし、ファイルも表示する
設定ではありませんでしたので直接参考にはなりませんでした。
今回の難しさが分かってきました。要するに最終的には FolderItem Object
の Path を得るのですが、フォルダならば FolderItem は Items.Item で
あっさり得られるのに、ファイルだと Items コレクションを得る時点でエ
ラーになります。仕方がなく親フォルダに戻って ParseName で FolderItem
を得ているんですね。ところが Folder Object の Title というのが特定の
拡張子を省略しちゃう。特に同じフォルダ内に abc というサブフォルダと
abc.url と abc.lnk がある時なんかは非常に難しいです(無理なんじゃな
いかと思う)。やはり BrowseForFolder というくらいで基本的にはフォル
ダが対象なのでしょうか。ファイルはオマケみたいなものでやたら扱いにく
いです。
一応私なりに書いてみました。長いのでメールします。非常に田舎臭いスク
リプトです。結果表示がループしてますのでスクリプトの最初に書いてある
終了方法を確認してから試してください。
>すると、IE(shdocw.dll)とShell(shdoc401.dll)に分離するのです。
これは Visual Basic Magazine(確か今年の4月号が5月号あたり)に記載
があり存じておりました。実は職場のデスクトップには Win98SE がインスト
ールされており、当然 IE5 なのですが、自宅では古いノートですので IE5
では重過ぎて IE4.01SP2(だったかな)です。たまたま深夜自宅で調べたた
めに BIF_ をオブジェクトブラウザで参照できず気付かずにいました。明日
職場で確認してみます。
うーーん、今翌日で職場で確認したのですが、Win98SE(含 IE5)+ VB6SP3 で
も BIF_ナンタラは Const しておかないとエラーになります。オブジェクトブ
ラウザでもそれらしき定数は見つけられません。
参照設定で、Microsoft Shell Controls And Automation(SHDOC401.DLL) を
チェックして
Private Sub Form_Load()
Dim objShell As New Shell
Dim objFolder As Folder
Set objFolder = objShell.BrowseForFolder(Me.hWnd, "Test", BIF_イロイロ)
End Sub
とやったのですが・・・・・・。
To:管理人むたぐちさん
早速試してみたところ、うまく動きだしました。
ありがとうございました。
>ただし、これが根本的な解決方法かどうかはよくわかりません。
>何か、オブジェクトを使った華麗な解決法がありそうですが。
そうですね。SendKeysだけでは少々無理があるかもしれませんね。
Windowがアクティブにならないうちにキー送信されたりしますから。
AppActivateも併用しなければならないんでしょうね。
To: げん さん
>VBの様にSendKeysがVBSでも使えれば何とかなりそうなのですが、VBSでは
>使えない様ですし・・・
WSH2.0ではSendKeysが使えるようになっていますよ。
ただし、これが根本的な解決方法かどうかはよくわかりません。
何か、オブジェクトを使った華麗な解決法がありそうですが。
To: 【おじさま】 さん
>試してみましたが
フォローありがとうございます。助かります(^^)
>あっ、そうでしたか(^^;)。
orにはビット比較の意味もあって、こういう使い方ができるそうです。
ビット比較orは、足し算に対応するわけです。
>ってほとんど知らないのだけれど)、VB ってオブジェクトだけ特別扱い
>みたいです。ご存知のように Set を使わなければだめだし、比較のとき
本家Basicの名残でしょうか。
>ところで初歩的なことを質問してしまいますが、WScript.CreateObject と
>ただの CreateObject の使い分けはあるのでしょうか。単に JScript に
>CreateObject がないので WSH 自体も WScript.CreateObject を用意した
>というだけなのでしょうか(結局同じもの?)。例えば上記の Word.Appli
>cation は WScript.CreateObject でも CreateObject でも問題がないので
>すが。
JSにもCreateObjectに準ずる関数があります。おそらくMSが独自拡張を
施した部分でしょう。
#どうせなら、InputBox関数も追加しておけば…。
VBSのCreateObject関数と、WScriptオブジェクトのCreateObjectメソッドでは、
第二引数のもつ意味が違います。
メソッドの方は、第二引数にプレフィックス(接頭語)を指定すると、作成した
オブジェクトのイベントをバインド(宣言)する事ができます。
よって、逐次処理だけでなく、イベントドリブン的なスクリプトがWSHでは
書けるのです。
ただし、スクリプト中でループを作っておかないと、
イベントが発生する前にスクリプト自体が終了してしまいます。
そのループを取る方法が、WSH1.0ではいろいろやっかいだったのですが、2.0になって
Sleepメソッドが追加され、容易に行えるようになりました。
もっとも初期のβ版では、Sleep中にイベントが発生しないという、致命的な
バグがあったため、使えなかったらしいのですが、今は大丈夫です。
この機能のおかげで、IEを自在に操れるようになっています。
関数の方の第二引数は、オブジェクトを作成するサーバー名を指定するために
あるようですが、詳細はわかりません。
ところで、オートメーションオブジェクトでないオブジェクトのイベントをバインドする方法が
よくわかりません。
たとえば、IEのDocumentオブジェクトで、MouseClickイベントとかがあるのですが、これらを
発生させるにはどうすればいいのでしょうね。
WSH2.0で追加された、ConnectObjectメソッドが怪しいのですが、よくわかりません。
>それと Windows Scripting Host を Windows Script Host と記載してあ
>る場合があって、特に新しい記述で Windows Script Host になっていま
>すが(Microsoft 自体がこの記述をしていたと思う)、名称に変更があっ
>たのでしょうか。
日本語サイトの方では、見出しがWindows Scripting Hostとなっていますが、
英語サイトではWindows Script Hostになってますね。変更があったのかもしれません。
#うちのサイトも名称変更しなきゃいけないのか?
語感的にはingがあった方が良いと思います。まあ、略せばどちらもWSHですので、
あまり気にしないことにしましょう。
それにしても、日本語サイトの情報の遅れは何とかして欲しい…。
WSH2.0の資料が英語でしか手に入らないのは問題だと思う。
>資料がありました。
おお、これはありがとうございます。どこにあったんでしょう?
MSのサイトは検索をかけてみたのですが…。
ところで、MSのサイトにはちゃんとShellオブジェクトの解説が
ありますね。あとでリンクはっときます。にしても英語only…。
BROWSEINFO構造体に、Win2000で次のものが追加されているそうです。
BIF_BROWSEINCLUDEURLS
BIF_NEWDIALOGSTYLE
BIF_SHAREABLE
BIF_USENEWUI
おそらく&H40〜&H800のどれかでしょう。
何か惹かれるものがありますね。
実は、このBrowseForFolderに関する議論が、microsoft.public.scripting.wshという
ニュースグループでされていて、
BrowseForFolderでファイルを表示するにはどうするんですか?
↓
16384を指定すればOK
↓
その数字はどこで知ったの?
↓
VBのオブジェクトブラウザです。オブジェクトブラウザはほんとに役に立ちます。
↓
え?私のには表示されませんが?
↓
IE4のデスクトップアップデートしたWin98かWin2000なら、Microsoft Shell Controls And Automation
(SHDOC401.DLL)を参照設定できるようになりますよ
というスレッドが進行中です。
IE4のみの段階では、ShellとIEを同じファイル(shdocw.dll)で参照できますが、IE5をインストール
すると、IE(shdocw.dll)とShell(shdoc401.dll)に分離するのです。これは私が実際に
IE5を入れてみて確認済みです(今はアンインストールしてますが)。
shdoc401.dllでは、BIF_...という定数をこのオブジェクトブラウザで参照できるようです。
shdocw.dllではこの定数は表示されません。
というわけで、この情報はIE5を入れた人、もしくはWin2000をインストールしている人にしか
得られないわけです。
資料がありました。
Const BIF_RETURNONLYFSDIRS = &H1
Const BIF_DONTGOBELOWDOMAIN = &H2
Const BIF_STATUSTEXT = &H4
Const BIF_RETURNFSANCESTORS = &H8
Const BIF_EDITBOX = &H10
Const BIF_VALIDATE = &H20
Const BIF_BROWSEFORCOMPUTER = &H1000
Const BIF_BROWSEFORPRINTER = &H2000
Const BIF_BROWSEINCLUDEFILES = &H4000
だそうです。
始めまして。
VBSをはじめてから一週間足らずの初心者です。
いきなりの質問で恐縮なのですが、WindowsNTのコントロールパネル内の
サーバー情報(?)に表示されている接続ユーザすべてを切断するスクリプ
トの作成で悩んでいます。
こちらのHPを参考にしてコントロールパネル内のプログラムを起動する
ことは出来る様になったのですが、そこから先がわからないのです。
VBの様にSendKeysがVBSでも使えれば何とかなりそうなのですが、VBSでは
使えない様ですし・・・
何か良い方法がありましたら、ご教授ください。
G.B.F. さん
試してみましたが
>Set obj = CreateObject("Word.Application")
私のところではこの後 obj.Visible = True で Word が起動します。
ただし Word2000 です。
だからこの書き方自体は全然おかしくないので、管理人むたぐちさんが
おっしゃるように Word95 だからなのか、それともレジストリに Word.
Application で登録されていないのか(私のところでは Word.Applicati
on 以外に Word.Application.8 と Word.Application.9 も登録されてい
ていました。どれを指定しても Word が起動します)、いずれにしても
私も Word95 を持っていないのでこれ以上は分かりません。ともかく書
き方は変じゃありません・・・と思います。
管理人むたぐち さん
>これは単純に+(プラス)でもいいですよ。数値を足しあわせてオプションを指定するので。
あっ、そうでしたか(^^;)。
>Isってこうやって使うんですね…(知らなかった(^^;)
Java だと何から何までとにかくオブジェクトみたいなんですが(Java
ってほとんど知らないのだけれど)、VB ってオブジェクトだけ特別扱い
みたいです。ご存知のように Set を使わなければだめだし、比較のとき
にも If objFolder = Nothing Then じゃなくてオブジェクトに限っては
Is で比較するんですね。何でなのかは存じません。
>じつは、このobjFolder.Titleというのが問題ありで、エクスプローラで拡張子を
>表示しないファイル(.lnk,.urlなど)は、拡張子を除いたファイル名を返すのです。
あらら、それは困りますね(・・・って解決になりませんが(^^;)
>【おじさま】さん作のOjKeyも、どちらかというとランタイム配布優先の
>ツールのようですね(DLしてないのでわかりませんが…)。
>残念ながら、OjKeyにはMSWINSOCK.OCXはついていないようですね。
無理矢理配布するために、ラベルで済むところをリッチテキスト使ったり
してますが(問題あるかも)、さすがに Winsock はありません。
ところで初歩的なことを質問してしまいますが、WScript.CreateObject と
ただの CreateObject の使い分けはあるのでしょうか。単に JScript に
CreateObject がないので WSH 自体も WScript.CreateObject を用意した
というだけなのでしょうか(結局同じもの?)。例えば上記の Word.Appli
cation は WScript.CreateObject でも CreateObject でも問題がないので
すが。
それと Windows Scripting Host を Windows Script Host と記載してあ
る場合があって、特に新しい記述で Windows Script Host になっていま
すが(Microsoft 自体がこの記述をしていたと思う)、名称に変更があっ
たのでしょうか。
ではがんばってレスをつけていきます(爆)
レス書きツール大活躍!
To: G.B.F. さん
>Set obj = CreateObject("Word.Application")
>これだとWordが起動してくれません。何故でしょうか?
>
>OSがWin95で、Word, Excelも95なのですが・・・。
Officeは持ってないので、私にはわかりませんです…。が、
たしかにExcelを操る例は、C:\Windows\sample\wshにありますが、
Wordのはなかった気がします。
Word95なのが駄目なのかもしれませんが(97以上ならOKとか?)、ちょっとこれ以上は…。
To: 【おじさま】 さん
>がありますが具体的な数値までは記載がなく(API Viewer にもない)、参照
>設定してもこの定数が使えるわけでもないので実際に試す以外に探ることも
>できません。
どうもありがとうございます。実は、私もここまでは確認済みでした。
(過去ログ参照)
>こうなるでしょうか。残りが分かりません。また試してみますと複数指定する
>場合には Or で繋ぐと良いみたいですが、これは自信がありません。
これは単純に+(プラス)でもいいですよ。数値を足しあわせてオプションを指定するので。
>If objFolder Is Nothing Then
Isってこうやって使うんですね…(知らなかった(^^;)
>GetFileName = objFolder.ParentFolder.ParseName(objFolder.Title).Path
>一応これで選択したファイル名が拾えるようですが、どんなもんでしょう。
じつは、このobjFolder.Titleというのが問題ありで、エクスプローラで拡張子を
表示しないファイル(.lnk,.urlなど)は、拡張子を除いたファイル名を返すのです。
そのため、これらのファイルを選択すると、「ファイルがない」といって怒られてしまいます。
ここら辺は対策が必要です。
>IE のキャッシュ
>フォルダにあるファイルのようにコモンダイアログではちゃんと拾えないフ
>ァイル名も拾えるという利点もあるようです。
シェルを直に操ることによる効果ですね。何か応用ができないかな?
>あらら、半角スペースのインデントが消えちゃいました。
>見にくくてすみません。
これ、ここの掲示板の仕様なんですね。タブも消えてしまいます。
To: SIGNAL9 さん
>ただNoboruさんのこのエラーは、なんとなくクラス名以下が
>違っているような気もします(MSWinsock.Winsock.1ではなくてMSWinsock.Winsockとか)。
これはどっちでもOKだったと思います。
>あとはCOM-OLEオブジェクトビューワ
うちのページからリンクを張ってます。「技術情報」のページです。
>ローカルのIPアドレスでしたら、やっぱりipconfigの出力を拾うほうがいいのでしょう
>ね。ただ個人的にはこの類は専用のCOM(ActiveX)を作ってしまった方がはるかに簡単・
>保守性がよいと思います。
ipconfig /Batch filename
でファイルに出力できるようです。ActiveXは、作らなくても誰かがすでに作っていそうな
気がします。
>*処理系にまかせるのはキモチ悪い
>*使い終わったらすぐ解放した方が基本的にはよい作法。特にASPなど、マルチで使
> う環境では、性能上キいてくる場合がある。
>ので、ぼくは大体つけるようにしています。
なるほど。ためになります。私は作法など知りませんから(^^;
To: abuku さん
> おひさしぶりです、むたぐちさん。
どうもです。
>早速おまけ発見しました。
>なかなか味のある事をしますねぇ(笑)
>面白かったです。
そうですかー?
それはダミーかもしれませんよ(謎)
To: kia さん
>私個人が使うのにはDOS窓でも十分なのですが、
>他人に使ってもらうとなると、あーゆーインターフェースが欲しいですから・・。
全く同感です。ちょっとMSに聞いてみましょうか?
#駄目に決まってる(^^;
To: Noboru さん
>やはり、むたぐちさんの言われるように、「WinsockコントロールのOCX」が
>必要なのではないでしょうか?
そうですね。MSWINSOCK.OCXです。普通のVB6のランタイムのセットには、入っていないかも
しれません。
VB6のランタイムやActiveXコントロールは、単体で配布できないんです。何か
ソフトをVBで作って、それと一緒でないと駄目なんですね。
【おじさま】さん作のOjKeyも、どちらかというとランタイム配布優先の
ツールのようですね(DLしてないのでわかりませんが…)。
残念ながら、OjKeyにはMSWINSOCK.OCXはついていないようですね。
私が何かwinsockを使うアプリを作って配布してもいいんですけどね。
#「ローカルIPアドレス確認ツール」(笑)
VB6基本ランタイムをセットにすると、5Mのホームページ領域のうち大半を占めそう…。
(現在0.7M使用済みらしい)
>かなり奥が深いですね。やりがいありますねー。
ありますねー(笑)。
始めて書き込みさせて頂きます。
WSH初心者のG.B.F.と申します。
宜しくお願いします。
早速ですが質問宜しくお願いいたします。
Dim obj
Set obj = CreateObject("Excel.Application")
っとするとExcelが起動してくれるのですが、
Set obj = CreateObject("Word.Application")
これだとWordが起動してくれません。何故でしょうか?
OSがWin95で、Word, Excelも95なのですが・・・。
宜しくお願いします。
あらら、半角スペースのインデントが消えちゃいました。
見にくくてすみません。
管理人むたぐち さん
BrowseForFolder はファイルも扱うのですね。全然考えていませんでした。
で、こちらでも調べてみましたが、VB6 のヘルプでは英語の記載があり、オ
プションの部分には BROWSEINFO 構造体の ulFlags を指定するようです。
で、この ulFlags には
BIF_BROWSEINCLUDEFILES
BIF_BROWSEFORPRINTER
BIF_BROWSEFORCOMPUTER
BIF_DONTGOBELOWDOMAIN
BIF_EDITBOX
BIF_RETURNFSANCESTORS
BIF_RETURNONLYFSDIRS
BIF_STATUSTEXT
BIF_VALIDATE
がありますが具体的な数値までは記載がなく(API Viewer にもない)、参照
設定してもこの定数が使えるわけでもないので実際に試す以外に探ることも
できません。
今回の管理人むたぐちさんの情報と照らし合わせてみますと
BIF_BROWSEINCLUDEFILES &H4000 (16384)
BIF_BROWSEFORPRINTER &H2000 (8192)
BIF_BROWSEFORCOMPUTER &H1000 (4096)
BIF_EDITBOX &H10 (16)
BIF_RETURNONLYFSDIRS &H1 (1)
こうなるでしょうか。残りが分かりません。また試してみますと複数指定する
場合には Or で繋ぐと良いみたいですが、これは自信がありません。
Function GetFileName()
Dim objShell
Dim objFolder '今回は File ですが BrowseForFolder はあくまで
'Folder を戻すのでこうしてみました。
Const BIF_RETURNONLYFSDIRS = &H1
Const BIF_BROWSEINCLUDEFILES = &H4000
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0,"読み込みファイルの選択",_
BIF_RETURNONLYFSDIRS Or BIF_BROWSEINCLUDEFILES)
If objFolder Is Nothing Then
GetFileName = ""
Else
GetFileName = objFolder.ParentFolder.ParseName(objFolder.Title).Path
End If
Set objShell = Nothing
Set objFolder = Nothing
End Function
一応これで選択したファイル名が拾えるようですが、どんなもんでしょう。
コモンダイアログのように特定の拡張子のファイルだけ表示するとか、前回
開いたフォルダを次も開くといったことは難しいのですが、IE のキャッシュ
フォルダにあるファイルのようにコモンダイアログではちゃんと拾えないフ
ァイル名も拾えるという利点もあるようです。
kia さん
>いえいえ、まだ入ってますよ。 <「まだ」って?
ども(^^;)。
■MSWinsockの件
管理人むたぐちさん >このWinsockコントロールは、VBについてくるOCXなんですが、
管理人むたぐちさん >SIGNAL9さんはVBをお持ちなんでしょうか。WinsockはVBランタ
管理人むたぐちさん >イムだけで動くか、引き続き情報を求む。
Noboru さん >「ActiveX コンポーネントはオブジェクトを作成できません。
Noboru さん >: 'MSWinsock.Winsock.1'」
Noboru さん >というメッセージを出力して、エラーで停止してしまいます。
Noboru さん >やはり、むたぐちさんの言われるように、「Winsockコントロー
Noboru さん >ルのOCX」が必要なのではないでしょうか?
あ、そうですね(失礼しました)。私自身はVBは使用していないのですが、ランタイム
やVBで作ったプログラムの類は入れたり出したりしています。サーバにしているベアな
NTマシンではこのコントロールは入っていないので、いずれかのインストーラで入った
ものと思われます(爆)。ただNoboruさんのこのエラーは、なんとなくクラス名以下が
違っているような気もします(MSWinsock.Winsock.1ではなくてMSWinsock.Winsockとか)。
いちおう、Windowsディレクトリ下にMSWINSOCK.OCXが無いかどうか確認してみてはいか
がでしょう。あとはCOM-OLEオブジェクトビューワ(英語版だったらMSのサイトのどっ
かに転がっていたと思います)で登録されているコントロール一覧を確認されて見るの
もよろしいかと。
ローカルのIPアドレスでしたら、やっぱりipconfigの出力を拾うほうがいいのでしょう
ね。ただ個人的にはこの類は専用のCOM(ActiveX)を作ってしまった方がはるかに簡単・
保守性がよいと思います。
■ Set foo = Nothing
管理人むたぐちさん >私はいつもSet Nothingを省略してしまうのですが、VBSでは、
管理人むたぐちさん >スクリプト終了後、変数のメモリを勝手に解放してくれるん
管理人むたぐちさん >じゃないか、と思ってるんですが実際はどうなんでしょう?
Set Nothingは、同じWindowsScriptでもプラットフォームで若干挙動が異なるようで
すね。典型的なのはASPですが、コイツはIISがオブジェクトごとキャッシュしますの
で、実際にはこのコマンドは参照を削除するだけで一定時間キャッシュプールされま
す。
WSHなどでは基本的にはスクリプト終了=Nothing=参照解除=オブジェクト解放、と
捉えていいようですが(非常に短い時間で終わるので)、
*処理系にまかせるのはキモチ悪い
*使い終わったらすぐ解放した方が基本的にはよい作法。特にASPなど、マルチで使
う環境では、性能上キいてくる場合がある。
ので、ぼくは大体つけるようにしています。
おひさしぶりです、むたぐちさん。
早速おまけ発見しました。
なかなか味のある事をしますねぇ(笑)
面白かったです。
それではまた・・。
>【おじさま】さん
>「当たり」です。全く問題なく起動するようになりました。VB6 がイ
良かったです。(^_^)
私の環境でしか確認してなかったので・・・(汗
>残して OjKey 自体はアンインストールされたかもしれませんね(あれ
いえいえ、まだ入ってますよ。 <「まだ」って?
>むたぐちさん
>レジストリキーの件ですが、確かにこれはライセンスの問題が関係してきそうな気もしますね。
やはり、そんな感じですか。
私個人が使うのにはDOS窓でも十分なのですが、
他人に使ってもらうとなると、あーゆーインターフェースが欲しいですから・・。
ありがとうございました。また来ます。
こんばんは、おひさしぶり(?)です
To:SIGNAL9さん、むたぐちさん
貴重な情報をありがとうございます
> むたぐちさんがおっしゃっているこの方法はWSHでもちゃんと動きま
> すよ(当方環境では動作確認済)。
>
> Set Wsock = CreateObject("MSWinsock.Winsock.1")
> Wscript.Echo Wsock.LocalIP
> Set Wsock = Nothing
これを、自分の環境で試してみたのですが、どうもうまく動きません
「ActiveX コンポーネントはオブジェクトを作成できません。: 'MSWinsock.Winsock.1'」
というメッセージを出力して、エラーで停止してしまいます。
やはり、むたぐちさんの言われるように、「WinsockコントロールのOCX」が
必要なのではないでしょうか?
WSHの2.0が出たんですね、さっそく入れてみます。
コモンダイアログが使えるとか、ぜんぜん知りませんでした(^^;
とても勉強になります。
かなり奥が深いですね。やりがいありますねー。
それでは、また。失礼いたします。
To: 【おじさま】 さん、kia さん
レジストリキーの件ですが、確かにこれはライセンスの問題が関係してきそうな気もしますね。
微妙です。スクリプトを公開する人は、コモンダイアログを使用するスクリプト中に、
レジストリにこの値を書き込むルーチンを加えるとかは、やめておいた方がいいかもしれません(^^;
comdlg32.ocxに依存しない方法が判明したので書いておきます。まだ解決しなければ
いけない問題もありますが…。
Set Win=Wscript.CreateObject("Shell.Application")
Set f=Win.BrowseForFolder(0,"ファイルを選んでください",16384,"C:\")
MsgBox f.ParentFolder.ParseName(f.Title).Path
このようにしてフォルダ選択ダイアログに、ファイルも表示できるのです。
#結構珍しいものが見られます。
ルートフォルダ(ドライブ)とリンクの処理を解決する必要があります。
16348という値はニュースの記事を見てわかったのですが、他のオプションの値も
だんだんわかってきました。
16384 ファイルも表示
8192 プリンタの検索
4096 コンピュータの検索
2048 ?
1024 ?
512 ?
256 ?
128 ?
64 ?
32 ?
16 エディットボックス表示
8 選択不可?
4 ?
1 仮想アイテム非表示
ついでにCopyHereメソッドの引数もわかりました。これはAPIビューアにありました。
Const FOF_ALLOWUNDO = &H40
Const FOF_CONFIRMMOUSE = &H2
Const FOF_FILESONLY = &H80
Const FOF_MULTIDESTFILES = &H1
Const FOF_NOCONFIRMATION = &H10
Const FOF_NOCONFIRMMKDIR = &H200
Const FOF_RENAMEONCOLLISION = &H8
Const FOF_SILENT = &H4
Const FOF_SIMPLEPROGRESS = &H100
Const FOF_WANTMAPPINGHANDLE = &H20
まだ確認はしてません(^^;
そのうち「オブジェクトの解説」をアップデートします。
---管理人によって削除---
さきほど書き忘れましたが、このようにレジストリを書きかえるのが
ライセンス上問題ある行為なのかどうかもわかりませんのです。
どなたかご存知ならばご教示ください。
---管理人によって削除---
WSH2.0日本語版、DLしました。
まだ見つけていませんが、日本語版ヘルプはあるのかな?
これでWSH2.0は正式版が登場したわけで、このページもあちこちを書き直す
必要がでてきて、ちょっとしんどいです。
ところで、英語β版との違いが一ヶ所判明しているので紹介しておきます。
・wsファイルの拡張子がwsfになった
以上(^^;
ところでLesson14は60%くらい完成しています。もうちょっと待ってくださいね。
一応出来かけのものはアップしておきます。リンクはありませんが、URLはすぐわかると思います。
To: 【おじさま】 さん
>WSH のスクリプトだと公開するにし
>ても中身が見えて恥ずかしいかなと思っていましたが、ちゃんとエンコーダが
>あるのもここの情報で知ることができました。
エンコードしてしまうと、使う人が手直しできないので、ちょっと難ありですね。
私のスクリプトのコードは汚いですが、恥を忍んで公開しています(^^;
オープンソース!(誤)
>ActivePerl は存じていましたが(全然書けないのですが、最新版と JPerl の
>差分をインストールしています)WSH2 からは VBScript や JScript のように
>WSH そのものに標準で付属するものと思っていました。
私もそう思っていたクチです。例のWSH2.0英語版のヘルプに、PerlScriptのサンプルが
載っていたので…。
>今後とも宜しくお願いいたします。
いえいえこちらこそ。
管理人むたぐち さん
早速のレスありがとうございました。
やはり無理なのですね。昨日ここからのリンクで WSH 関連のページをいくつか
覗かせていただきましたが、どうも私の質問は FAQ だったようです。
それにしてもここはすごい情報量ですね。WSH のスクリプトだと公開するにし
ても中身が見えて恥ずかしいかなと思っていましたが、ちゃんとエンコーダが
あるのもここの情報で知ることができました。早速日本語版というのを落とし
てきました。ありがとうございます。
ActivePerl は存じていましたが(全然書けないのですが、最新版と JPerl の
差分をインストールしています)WSH2 からは VBScript や JScript のように
WSH そのものに標準で付属するものと思っていました。
WSH はつい最近始めたばかりで何も分からないのですが、この掲示板を巡回コ
ースに入れて勉強させていただきます。
今後とも宜しくお願いいたします。
Win2000RC2が月刊ASCII1月号につくそうです。
しかし、12月号、初心者歓迎とかいいながら、あのマニアックな付録は何なんでしょう。
To: 【おじさま】 さん
>こちらのページのオブジェクトについて記載されたところにランタイムとして
>インストールしただけでも動くかどうかは不明といった記載がありましたが、
>これにつきまして解決策はあるでしょうか。
どうもコモンダイアログに関しては、ランタイムだけではだめなようです。
残念ながら…。
ランタイムのインストールだけでは、正常にシステムに登録されない?のが原因らしく、
コントロールそのものはVBランタイムに含まれるものと、VB本体に含まれるものは
同じなんですけどね。(当たり前ですが)
>どうもこれは WSH2 日本語(正式?)版のようです。ページに記載されている最
>終更新日はやたら古いのですが、中身のファイルはつい最近のものばかりでした。
あ、本当ですね。5.1になっている…。あとでDLします。情報ありがとうございます。
にしても、最終更新日に何か意図はあるんでしょうか?
>WSH2 は Perl もサポートと聞いた記憶がありますが、Perl はサポートされてい
>ないようです。
これはActiveStates社のActivePerlを別途インストールする必要があります。
#5.5MB(^^;
>できれば、
>WSH1 のままでも何とか解決できないかと思っています。
私のページにはいくつかユーザーが作成したコントロールが公開されているサイトへの
リンクがありますが、その中に、コモンダイアログをcomdlg.ocxを使わずに呼び出す
機能がついているものがあったような覚えがあります。探してみてはいかがでしょう?
WSH2.0を導入した方が早いですかね(^^;
フォルダをダイアログから選択するなら、Shellオブジェクトを使えば可能です。
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shell.htm
To: SIGNAL9 さん
>むたぐちさんがおっしゃっているこの方法はWSHでもちゃんと動きま
>すよ(当方環境では動作確認済)。
どうもありがとうございます。
このWinsockコントロールは、VBについてくるOCXなんですが、SIGNAL9さんは
VBをお持ちなんでしょうか。WinsockはVBランタイムだけで動くか、引き続き
情報を求む。
>Set Wsock = Nothing
私はいつもSet Nothingを省略してしまうのですが、VBSでは、スクリプト終了後、変数の
メモリを勝手に解放してくれるんじゃないか、と思ってるんですが実際はどうなんでしょう?
はじめまして。
今日初めてこのページを見つけましたので、過去に同様な質問がありましたら
すみません。
ある掲示板の HTML ファイルを読み込んでメッセージごとに切り分けるツール
を WSH で作りました。
Windows98 + IE4.01SP1
Windows98 Second Edition(含 IE5)
では問題なく動いたのですが、たまたま家内のマシンで動かすとエラーになり
ました(Windows98 Second Edition(含 IE5))。
エラーの個所は
・VBScript
Set objCdl = CreateObject("MSComDlg.CommonDialog")
・JScript
var objCdl = new ActiveXObject("MSComDlg.CommonDialog");
で、どちらもコモンダイアログの呼び出しで起こります。今ここに家内のマシ
ンがないのでエラーメッセージがどんな内容かは不確かですが、Win32 エラー
でメッセージのところに文字列ではなく 16 進表記の数字が出ていたと思いま
す。
動いたマシンもダメだったマシンも Comdlg32.ocx(VB6SP3) はインストールさ
れていますが、違いは動いたマシンは VB6SP3 そのものが、ダメだったマシン
は VB6SP3 そのものではなくランタイムとしてインストールしています。
こちらのページのオブジェクトについて記載されたところにランタイムとして
インストールしただけでも動くかどうかは不明といった記載がありましたが、
これにつきまして解決策はあるでしょうか。
また、比較的最近 Microsoft Japan の Script のページにあったのは ste50jp
.exe だったのですが、たまたま昨日覗きましたら ste51jp.exe がありました。
どうもこれは WSH2 日本語(正式?)版のようです。ページに記載されている最
終更新日はやたら古いのですが、中身のファイルはつい最近のものばかりでした。
WSH2 は Perl もサポートと聞いた記憶がありますが、Perl はサポートされてい
ないようです。
実はコマンドラインパラメータとして読み込みファイル名を記載しても良い作
りにしていたために(パラメータがない時だけダイアログが開く)、上記の問
題は WSH2 でショートカットへのドラッグドロップが可能になり、それで何と
かなりそうなのですが(まだ家内のマシンでは試していませんが)できれば、
WSH1 のままでも何とか解決できないかと思っています。ダイアログがエラー
ならば普通の入力ボックスが開くという手もありますが、普通の入力ボックス
にフルパスでファイル名を記載するのはユーザーにとっても面倒なので。
VB ではプログラムを書いたことがありますが、スクリプトは初めてですので、
変な質問でしたらごめんなさい。
では宜しくお願いします。
To: Noboru さん、管理人むたぐち さん
こんにちは。再び通りすがったSIGNAL9でございます。
>VB6があれば、こんな方法でIPアドレスが取得できます。
むたぐちさんがおっしゃっているこの方法はWSHでもちゃんと動きま
すよ(当方環境では動作確認済)。
Set Wsock = CreateObject("MSWinsock.Winsock.1")
Wscript.Echo Wsock.LocalIP
Set Wsock = Nothing
NICのバインドが複数ある場合は試していないですが、MSWinsockオブジェク
トでいけるのではないでしょうか。
To: Noboru さん
>値=hex(7):xx,xx,xx・・・・ (通常は 値=hex:xx,xx,xx,・・・)
>
>この(7)が曲者のような感じがします
確かに曲者ですね。こんなのは見たことがありません。
The RegRead method supports only REG_SZ, REG_EXPAND_SZ, REG_DWORD, REG_BINARY,
and REG_MULTI_SZ data types. If the registry has other data types, RegRead returns
DISP_E_TYPEMISMATCH.
とヘルプにはあるので、RegReadの返値がDISP_E_TYPEMISMATCHなら、サポートされていない
形式と言うことなんでしょう。
>レジストリに頼らずに、IpConfigなどのコマンドをファイルに出力させて
>それからIPアドレスを拾うことも考えています。
それができるなら、それがいいですね。
VB6があれば、こんな方法でIPアドレスが取得できます。
Set ws=Wscript.CreateObject("MSWinsock.Winsock")
msgbox ws.LocalIP 'ローカル マシンの IP アドレス取得。
To: me さん
>none
ん? なんでしょう?
おはようございます
>>HKLMの中の、マシンに設定されているTCPIPを読もうと思ったのですが、
>>エラーになってしまいます。自分で作成したレジストリは読めるのですが。。。
>HKLMのどこでしょう? ちょっと調べてみたいので、教えていただけますか?
えっと、使用しているのはWindowsNTなのですが、
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\カード名\Parameters\Tcpip]
に書かれています。
IP Addresでサーチすると出てきます
Win9xだと、
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\4桁のカード番号]
の下にありそうですね。
Win9xだと、文字列として書き込まれているので読めそうなのですが
NTだとバイナリで書きこまれていて、しかも特殊なバイナリみたいです
Win9xで、同じようなバイナリを探していないのでなんとも言えませんが、
ファイルに書き出してみると、値の頭の部分が、以下のように書かれています
値=hex(7):xx,xx,xx・・・・ (通常は 値=hex:xx,xx,xx,・・・)
この(7)が曲者のような感じがします
とりあえず、こんな感じです(^^;
レジストリに頼らずに、IpConfigなどのコマンドをファイルに出力させて
それからIPアドレスを拾うことも考えています。
none
Lesson14、ただいま執筆中(笑)
サンプルスクリプト、予定の7個のうち5個完成しました。本文はまだです。
意外とコンパクトにまとまりそうで、いつもの2倍くらいですみそうです。
ただ、サンプルスクリプトが、なかなかえげつない長さです。
To: Noboru さん
>今夜は遅くまでWSHと格闘してます(笑)
おや、本当にご苦労様です。
>今日本屋さんに行ったら、けっこう新しい感じの本がありましたね。WSHについての。
なんで私の回りには影も形もないのだろうか(^^;
何にせよ、WSHが注目され始めているようで、いい傾向ですね。
>HKLMの中の、マシンに設定されているTCPIPを読もうと思ったのですが、
>エラーになってしまいます。自分で作成したレジストリは読めるのですが。。。
HKLMのどこでしょう? ちょっと調べてみたいので、教えていただけますか?
>・ネットワークドライブが正常に接続できたことを確認したいのですが、
> 接続後に接続数のCountを調べようとしたら、すぐにはCountに反映されないようです。
WshNetworkオブジェクトのEnumNetworkDrivesメソッドが返す
WshCollectionオブジェクトのCountプロパティですね?
Lesson12に書いたサンプルは、私がネットワーク環境を有していないこともあり、
動作未確認で、Countプロパティが正常に返されない原因も調べられません。
が、それが単にタイミングの問題ならば、適当なところでウェイトを入れてやると
うまくいくかもしれません。
WSH2.0ならWScript.Sleepが使えますが、1.0の場合は適当にLoopを取るしかないでしょう。
> なにか接続の成功・失敗を判定するような仕組みはないでしょうか?
こんなのはいかが?
もっとも、WshNetworkで正常に判定できないものが、FileSystemObjectではできるという
根拠はありませんが。
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
drvl="Z" 'ネットワークドライブのドライブレター
If Fs.DriveExists(drvl) Then 'そのドライブが存在して
Set drv=Fs.GetDrive(drvl)
If drv.IsReady Then 'そのドライブが準備できていて
If drv.DriveType= 3 Then 'しかもネットワークドライブであれば
msgbox drv.DriveLetter & "ドライブは、ネットワークドライブとして認識されています。共有名は" & drv.ShareName
End If
End If
End If
とここまで前もって書いておいたのですが、自己フォローで解決されたようですね(^^;
To: チャブーン さん
>仕方ないので、再インストールして、現在はスタンドアロンサーバ
>になっております(笑)
スタンドアロンサーバ…なんかすごいですね。クライアント=サーバというわけですか。
>ひとつ笑えたのが、“Active Directoryでトラブらないように、非AD環境で
>サーバを立てよう”という企画です。現実的ですが、(ビジネスシーンでは)
>Win2000の宣伝とはかなり違うと^^;
せっかくの新機能を使わないようにする企画を、発売前からやるとは…。
よほどMSが提供する「新機能」は信頼されてないんでしょうかね。
ところで、Win2000の新機能と言えば、ビジネスシーンではActive Directoryに
焦点が当てられているのかもしれませんが、開発者が注目しているのは
COM+でしょうね。
自己フォローです
>・ネットワークドライブが正常に接続できたことを確認したいのですが、
> 接続後に接続数のCountを調べようとしたら、すぐにはCountに反映されないようです。
> なにか接続の成功・失敗を判定するような仕組みはないでしょうか?
ネットワーク接続をしたあとに、Err.Numberを調べることで実現できました
失敗すると、意味の無い数字が入るようです。(成功だと0)
レジストリの方はやっぱり駄目みたいですね。
普通の値と違うのかな?
また、いろいろやってみます
こんばんは、いつもありがとうございます。
今夜は遅くまでWSHと格闘してます(笑)
>>Microsoftからダウンロードした、HelpにはArgumentsプロパティについて
>>特に書いてありませんね。
>書いてますよ。「オブジェクトモデル」というHTMLファイルの方ですね。
うう(^^;
またやってしまいましたね。もっとよく調べなくては。
今日本屋さんに行ったら、けっこう新しい感じの本がありましたね。WSHについての。
さて、今日も質問なのですが・・・
・レジストリで取れない値があるのですが、なにか良い方法はありませんか?
取りたい値は、バイナリ値なので、Lesson9に書いてあるように配列に読みこもうと思ったのですが、どうやら特殊なものらしく読めません。
HKLMの中の、マシンに設定されているTCPIPを読もうと思ったのですが、
エラーになってしまいます。自分で作成したレジストリは読めるのですが。。。
・ネットワークドライブが正常に接続できたことを確認したいのですが、
接続後に接続数のCountを調べようとしたら、すぐにはCountに反映されないようです。
なにか接続の成功・失敗を判定するような仕組みはないでしょうか?
もし、また調べ足りないようでしたら、すみません(^^;
もうちょっと勉強しておこうとは思います。
それではおやすみなさい
どうもです。
なかなかお返事できず、恐れ入ります。
ところでActive Directoryなんですが、やはりLANカードがないと
正常にインストールできないようです。(;o;)
仕方ないので、再インストールして、現在はスタンドアロンサーバ
になっております(笑)
ちょっと手詰まり状態になったので、雑誌等で機能の確認をしてます。
さすがにRC2のアナウンスはマズいとみえて、やはりBeta3の記事が中心
です。
一応MSホワイトペーパーは見ているので“目新しい”って感じでは
ないですが、まあ、懇切丁寧に書いてあるのから、さわりしかないものまで
いろいろです。
ひとつ笑えたのが、“Active Directoryでトラブらないように、非AD環境で
サーバを立てよう”という企画です。現実的ですが、(ビジネスシーンでは)
Win2000の宣伝とはかなり違うと^^;
#しかしこれでもかなりのことができるようです
ヨタ話でごめんなさい。
ドラクエ7よりWin版風来のシレンを買いましょう。(WSHと無関係)
To: Smile さん
>VBScriptでスクリプトファイルに、処理したいファイルを
>ドロップして、そのファイル名を何らかの方法で
>スクリプト内で参照する方法はありますでしょうか。
これは、11/11の私がNoboruさんへ書いたレスをふまえてのご質問でしょうか?
ドロップされるファイル名も「オプション」なので、WshArgumentsオブジェクトを使うのは
同じです。
なお、VBSファイルへのファイルのドロップは、WSH2.0の機能です。WSH1.0の場合は、
「ファイル名を指定して実行」などで、ファイル名をつけて実行することになります。
参考例を、「WSHテクニック集」にアップしときました。
To: Noboru さん
>Microsoftからダウンロードした、HelpにはArgumentsプロパティについて
>特に書いてありませんね。
書いてますよ。「オブジェクトモデル」というHTMLファイルの方ですね。
>こういう書かれていない機能ってけっこうあるんでしょうか?
それは結構あります(笑) まあ、極端なことを言えば、WSHはActiveXによって無限に
機能拡張できるので、「書かれていない機能」を定義するのが難しいですが…。
書かれていないと言うか、不明瞭だったり、不適切だったり、日本語でなかったり
する事は多いです。
もっともすべてのドキュメントが完璧なら、このサイトは不要になりますが(^^;
>ちなみに昨日アクセスしたときはカウンターが
>11144でしたよ。
ということは、メモリアルアクセスはメモリアルデイには達成されなかった
ということですか(T_T)
いや、泣くほどのことではないですね。でもおしい。
はじめまして。質問します。
VBScriptでスクリプトファイルに、処理したいファイルを
ドロップして、そのファイル名を何らかの方法で
スクリプト内で参照する方法はありますでしょうか。