>>domingo さん 2006年 07月 03日 22時 53分 02秒
閉じるのですが、これは私も95時代からずっと不思議に思ってたんですが、エクスプローラでCDドライブを右クリックしても開ける方しかないですよね? なぜなんでしょう?
昔の話なので忘れてしまいましたが、確か、閉じるコマンドがなぜか正常に機能しないドライブがいくつもあったような・・・
ただ、コマンド(ATAPIやSCSIの)としてはちゃんと存在しているのでDOS用のコマンドライン型CD-ROMプレイヤーとかで閉じる事は可能だと思います。どっかにあったはず。(Niftyかも)
ウィンドウのキャプションは例によってスキル低い私にはわからないですが、DWだと一応できます。
>>管理人むたぐち さん 2006年 07月 02日 15時 05分 37秒
>とするとここはどう書くべきだったんでしょう?
うーん・・・だからやっぱり使わない方が・・・(^^;)
これは元々「OLEオートメーション」って言う名称だったんです。これなら一般語っぽくないでしょ?
しかし現在では正式名称はただの「オートメーション」・・・
プロフェッショナルな方々には通用する語だと思いますが、初心者にはあまり聞かせない方がいい単語です。混乱してしまいます。
>ADODB.StreamでもVBScriptでは任意のバイト配列を作れないのでWriteができませんね…。
いくつかのテクニックがあります。やめときますが。
Outlook Expressでメール一覧のウィンドウはリストビューコントロールなのですが、クラス名が少し変わっています。
で、これに対応するためにリストビュー調査官をバージョンアップし、クラス名を設定可能にしてみました。
これを使えばとりあえずメール一覧は取れます。
LVI002.LZH:リストビューコントロールからデータを盗むコンポ
http://winscript.s41.xrea.com/upload/source/No_0017.lzh
後はSendKeysで何とか。誤爆防止にはDWが使えます。尤も本人は最早要らないみたいですが。
はじめまして、随分前からお世話になっていましたが、初めて投稿
させて、頂きます。よろしくお願いします。
WSHでCDトレイをイジェクト出来る所までは行ったのですが、閉じる事は
出来ないでしょうか?
ついでで申し訳ないのですが、起動中のウィンド(最小化も含む)の
タイトルの取得とか出来ないものでしょうか?
はじめまして、随分前からお世話になっていましたが、初めて投稿
させて、頂きます。よろしくお願いします。
WSHでCDトレイをイジェクト出来る所までは行ったのですが、閉じる事は
出来ないでしょうか?
ついでで申し訳ないのですが、起動中のウィンド(最小化も含む)の
タイトルの取得とか出来ないものでしょうか?
≫ ねじゅみ さん
> 改行コードが全く変化しません・・・
ADODB.Stream の LineSeparator は、ReadText / WriteText には
影響を与えますが、CopyTo に対しては影響を与えないかと思います。
経験則ですけど…。(undocumented)
>ねじゅみ さん (null) 2006年 06月 30日 10時 13分 48秒
本当だ、改行が変わらないですね。
なぜだろう。
申し訳ありませんが、私には原因がわかりませんでした。
便乗ですが、諸先生方で原因をご存知の方がいらっしゃれば、私も教えて頂きたいです。
とりあえずですが、文字列を読み込ませてから、
Replace関数でvbCrLfをvbLfに置き換えるのでは駄目でしょうか。
私だとこんな感じでお茶を濁してしまいます。
(これだとUTF-8じゃなくUTF-16になっちゃいます)
Set objFso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Set Src = objFso.OpenTextFile("test.txt",ForReading)
str = Src.ReadAll
Src.Close
str = Replace(str,vbCrLf,vbLf)
Set Dst = objFso.CreateTextFile("utf-out.txt",False,True)
Dst.Write(str)
Dst.Close
お役に立てなくてごめんなさい。m(_ _)m
管理人様
ありがとうございます。
WSHではできないのですね。
BASP21を参考にします。
またわからないことがあるかと思いますが、
その時はご教授お願いします。
2006年7月に、みたびMSMVP for Visual Developer - Scriptingを受賞しました。
これも皆様のご支援の賜物だと思います。ありがとうございます。
これから1年間またよろしくお願いします。
To: AKA さん 2006年 06月 26日 00時 58分 42秒
> どっかにOE用のダンプツールないんでしょうか・・・?
これなどが該当するんじゃないかなあと思います。
おしえてくださいDirect Viewer さんもこれでどうですか?
OutlookExpress-To - OE5/6 Multi Converter(Windows95/98/Me/インターネット&通信)
http://www.vector.co.jp/soft/win95/net/se229601.html
> 'Platform SDK: Automation'という文書に書いてあります。これは'アクティブスクリプト'とか'.NET'とかと同じ、技術(テクノロジ)の名前なのです。
>
> >アプリケーションをWSHなどの外部から操作することを「オートメーション」という
とするとここはどう書くべきだったんでしょう?
オートメーションという技術を用いてアプリケーションをWSHなどの外部から操作することができる、
とすればあっているかな?
文脈上はちょっとおかしくなるので、その意味では抹消したほうがいいかもしれません。
しかしまあ、なかなか満点の記事を書くのは難しいものです。たとえ編集さんの助けがあっても…。
To: mm さん
> テキストファイルに16進コードでWRITEしたいのですが、
未確認ですがTextStreamでは無理なんじゃないかと思います。
ADODB.StreamでもVBScriptでは任意のバイト配列を作れないのでWriteができませんね…。
84-24 管理人むたぐち さん 2003/06/13 12:29 の記事にあるように、BASP21を使うのが良いでしょう。
To: A さん
> IMEをVBScriptで操作する方法はありますか?
何をするのかによると思いますが、IME200xはオートメーションできない気がします。(知らないだけかも)
ひらがなの文字列を漢字に変換するなら、
Ajax を使った 日本語 IME
http://www.chasen.org/~taku/software/ajax/ime/
などがあります。
IMEをVBScriptで操作する方法はありますか?
>新米MCP さん
ありがとうございます。
Dst.LineSeparator=10
とするのと同じですよね?
確かにエラーにはならなくなったのですが、
改行コードが全く変化しません・・・
UTF-8へのエンコードは成功します。
Const adTypeText = 2
Const adSaveCreateOverWrite = 2
Const adLF=10
Set Src = CreateObject("ADODB.Stream")
Src.Open
Src.Type = adTypeText
Src.Charset = "Shift_JIS"
Src.LoadFromFile "test.txt"
Set Dst = CreateObject("ADODB.Stream")
Dst.Open
Dst.Type = adTypeText
Dst.Charset = "UTF-8"
Dst.LineSeparator=adLF
Src.CopyTo Dst
Src.Close
Dst.SaveToFile "utf-out.txt", adSaveCreateOverWrite
Dst.Close
Set Src = Nothing
Set Dst = Nothing
>ねじゅみ さん (null) 2006年 06月 29日 16時 30分 54秒
adLFが空っぽの変数だからです。
Const adLF = 10
と、定数にしてあげれば動きますよ。
改行コードの変換が出来ない
ここの過去ログを参考にして、
sjis → utf-8 に変換するコードを書いています。
しかし改行コードの変換でなぜかエラーがでます。
LineSeparatorの行です。
そこさえ外せばコードは通ります。
何がいけないのか教えてください。
Const adTypeText = 2
Const adSaveCreateOverWrite = 2
Set Src = CreateObject("ADODB.Stream")
Src.Open
Src.Type = adTypeText
Src.Charset = "Shift_JIS"
Src.LoadFromFile "test.txt"
Set Dst = CreateObject("ADODB.Stream")
Dst.Open
Dst.Type = adTypeText
Dst.Charset = "UTF-8"
Dst.LineSeparator=adLF
Src.CopyTo Dst
Src.Close
Dst.SaveToFile "utf-out.txt", adSaveCreateOverWrite
Dst.Close
Set Src = Nothing
Set Dst = Nothing
Folders.dbx
は
ダイレクトに読み書きはできないのでしょうか?
ちなみに、
Direct Viewer が
ネット上のフリーソフトで
さがしてみましたが、
どこにあるかわかりませんでした。
Folders.dbx
は
ダイレクトに読み書きはできないのでしょうか?
ちなみに、
Direct Viewer が
ネット上のフリーソフトで
さがしてみましたが、
どこにあるかわかりませんでした。
お世話になります。
ひとつ教えてください。
テキストファイルに16進コードでWRITEしたいのですが、
うまいいきません。
具体的に、ファイルの終端、つまりEOF(0x1a)を書きたいのですが、
&h1Aを付けると,26(32、36)で書かれてしまいます。
WSHで、16進を書くことはできないですか?
宜しくお願いします。
>>haya さん (m-hayasi@hitachi-system.co.jp) 2006年 06月 23日 10時 22分 19秒
OutlookExpressがオートメーション非対応なら基本的にはできないと思うのですが・・・
何かコンポ入れたり特殊なツールを使えばできるのかも。誰か教えてください。
ちなみにスキル低い私がやるならば、例えば、.DBXファイルをダンプします。
で、文字列部分ですが、これはシフトJISとそれ以外のコードが混じっているので、変換しながらダンプしたりします。
で、作りかけなので日付はわからずプレーンJISしか変換はやってないのであまり役に立ちません(^^;)
DBXD001.LZH:DBXファイルをダンプするサンプル(作りかけ)(C)
http://winscript.s41.xrea.com/upload/source/No_0014.lzh
どっかにOE用のダンプツールないんでしょうか・・・?
他には一件ずつプレビュー画面に表示させてプレビュー画面のウィンドウ内からデータを盗む、というのも考えられますが、プレビュー画面はWebBrowserコントロールのようです。これはウィンドウメッセージで盗めるのかどうかよくわかりません。(WebBrowser自体はオートメーションなのでウラ技使えば操作できる可能性はある)
#メール一覧だけでも盗めないかと思って以前投稿したリストビュー調査官をちょっと使ってみたが、微妙にクラス名が違うので取れず(^^;)
他にも印刷機能を使うとか、1件ずつファイル保存するとか、SendKeysの嵐をやればできるような気もしますが、よくわかりません。
-------------------------------------------------------------------------------
>>管理人さん
MSDNライブラリ持ってますよね?
'Platform SDK: Automation'という文書に書いてあります。これは'アクティブスクリプト'とか'.NET'とかと同じ、技術(テクノロジ)の名前なのです。
>アプリケーションをWSHなどの外部から操作することを「オートメーション」という
もし、
「簡便なテキストファイルを用いて簡易プログラミングを行うことを「アクティブスクリプト」という」
とか、
「コードの信頼性を確保したり、ネットワーク対応のオブジェクト指向プログラミングを行うことを「.NET」という」
と書いたらかなり恥ずかしいですよね?
確かに一般語でもありますが、立派なCOMの用語なので、誤解を与えない為には使わない方が賢明です。
しばらく前にWScript.ConnectObject()ができないオブジェクトにConnectObject()させるコンポーネントを投稿しました。
これでIEはConnectObject()で使えます。
しかし、まだExcelは使えません。Excelのイベントはキャッチできません。
これは、Excelがイベントプロシージャの呼び出しに名前付きパラメータを入れてくるせいです。アクティブスクリプトではたいてい名前付きパラメータ機能が省略されているからです。(ただし通常とは逆で、呼び出すのでなく呼び出される訳ですが・・・)
(実際にはWSHはイベント接続にはタイプライブラリを使っていたりするので、イベント接続の場合のみ名前付きパラメータをサポートしてもよいのではないかと思うのだが・・・ スクリプトエンジンに関係なく、スクリプトホスト側の機能なのだし。)
それで例によってコンポーネントで何とかしてみました。
WWUPE001.LZH:Excelオブジェクト等の名前付きパラメータで発行されたイベントをスクリプトから受け取り可能に
http://winscript.s41.xrea.com/upload/source/No_0013.lzh
イベントシンクに対する呼び出しをフックして、イベントソースからの名前付きパラメータを名前なしパラメータに変換します。
これでExcelのイベントがキャッチできるようになりました。
-------------------------------------------------------------------------------
WSHでJScript使っている人いますけど、無理ですね。オートメーションの仕様とはあまりにマッチしなすぎる。
まあ配列が直接使えないとかパラメータに値を返されても受け取れないとか色々ありますが、こないだShell.Windowsを使ったスクリプトで困ったのは、
1. TypeName()が使えないのでie.Documentが何のオブジェクトなのかわからない。これではせっかくのタイプ情報が宝の持ち腐れ。対策は無いみたいです。
2. For Eachでコレクションの要素列挙ができないので.Item()を使わねばならなかった。なのでItem()のインデックスベースを調べなければならなかった。
2.はShell.Windowsはまだいいですが、数値インデックスを許容しないコレクションだと致命的ですね。まあEnumerator使えばいいんだけど、言語仕様に入ってないと面倒ですね。
あと、コンポーネントによってはvbNullStringを特別の目的で使うものがあるので、これも問題ですね。
やはり言語は扱う対象にマッチした言語を使わねば。WSHを使うならVBScriptがベストですね。
表題:outlook expressから1つずつメールデータを取り出す方法
表題の件について考えております。
1つずつ取り出して日付をつけて保存したいのですが、WSHでできる方法はありませんか?あれば教えてください
先に検索すべきでした。申し訳ありません。
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/techinfo.htm#HTA(HTMLアプリケーション)について
に大変詳しい説明をしていただいておりました。
申し訳ございません。
お題:HTAを使用する場合の制約
HTAで簡単なローカルファイルの内容検査を行うツールを
開発することを考えています。
WSHでの開発経験はかなりありますが、HTAはやったことが
ありません。HTMLはあります。
勿論HTAを使う以上、VBScript(Or JScript)が動作する環境
(つまりOSがWindows2000以上+IE)である必要がありますが、
純粋に言語仕様としての制約条件があれば、ご教示ください。
なお、ごく簡単なHTAを組んで、以下の点はチェックしました。
【チェック済み事項】
○ローカルファイルシステムにアクセスできることは確認した。
○フォルダ選択ダイアログなどShellに相当する内容も動作する
ことを確認した。
○GUIは基本的にHTMLの部品の範囲内で実現する。
【現時点でよくわからないこと】
○IEのインターネットオプションのセキュリティ関係で
何らかの制約を受けるのか?つまり、WSHで実現できることの
全ての内容が実現できるとは言えないのか。セキュリティ設定に
影響を受けるのか。(なお、マイコンピュータでのファイルの
アクティブコンテンツの実行を許可するのチェックには影響を
受けないようである=無関係である)ようだという点は
動作確認しました。
わんくま同盟http://www.wankuma.com/に加入し、そこで
Scripting Weblog II
http://blogs.wankuma.com/mutaguchi/
というのを始めました。主にPowerShellの記事を紹介していこうと思っています。
前のブログはなかったことに…とは言いませんがこんどは真面目に書こうと思います。
プライベートなこともちょっと書いていこうかなっと思ってます。
遅くなってしまいましたが返信を。
To: AKA さん 2006年 06月 11日 00時 34分 13秒
> あと、メインページからはファイルへの直リンにならず、いったんページを通過するのには何か理由があるのでしょうか?
おそらく、リンクを張るときのためにワンステップ前の画面を表示させたいという
要求によるものだと思います。
ファイル名が変わってしまうのは、まあこの手のアップローダではお約束
みたいなものかもしれません。書庫であればそれほど問題は発生しないと思います。
> 何かいきなりエディタの説明とかちょっと初心者向けとしてはマニアックなような気が・・・(^^;)
メモ帳で書けといってもなかなか大変なのが現実でしょうから、使いやすいエディタをと
思って書きました。まあ初回としては他にあまり書くことがなかったというのが
正直なところです。
> ちょっと違うと思います。一般語のオートメーションならそうかもしれないですけどね。非オートメーションのCOMを使った記事も投稿したのに〜(^^;)
ご指摘ありがとうございます。一般語に近い意味で使いました。あまりちゃんとオートメーション
という言葉を把握してなかったかもしれません。もし可能なら訂正しようと思います。
To: shobohn さん
> 何気に記事を読んでたら拙作ツールが紹介されててビックリしました。
本文で勝手に紹介させていただきました。遅ればせながらありがとうございました。
補完クンのようなツールがないとなかなか書くのはしんどいと思いまして。
To taka さん 2006年 06月 21日 11時 12分 56秒
WQL が間違っています。
とりあえず、直接与えるのではなく、一度変数に格納して
WScript.Echo とかで出力しましょう。debug の鉄則です。
それから、見やすいように query を書くのも重要です。
strQuery = strQuery & "Select *"
strQuery = strQuery & " from Win32_NTLogEvent"
strQuery = strQuery & " Where Logfile = 'System'"
strQuery = strQuery & " and EventCode = '54'"
strQuery = strQuery & " & TimeWritten >= '" & MyDate & "'"
strQuery = strQuery & " and TimeWritten < '" & NewDate & "'"
どこが悪いか一目瞭然でしょう。
To ちゃっぴ さん
ご教授ありがとうございます。参考にさせていただきましたが、
オートメーションエラーになってしまいます。
解決方法が分かりません。
たびたび申し訳ございませんがご教授お願い致します。
また、動作環境はWindows2000Server SP4です。
現在作成したスクリプトは下記のものです。
------------------------------------------
Dim MyDate
Dim NewDate
MyDate = Date
NewDate = DateAdd("d", -1, MyDate)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent Where Logfile = 'System' and " _
& "EventCode = '54' & TimeWritten >= '" _
& MyDate & "' and TimeWritten < '" & NewDate & "'")
if colEvents.Count => 1 then
Const EVENT_SUCCESS = 1
Set objShell = Wscript.CreateObject("Wscript.Shell")
objShell.LogEvent EVENT_SUCCESS, _
"○○" , "\\○○.○○.○○.○○"
end if
----------------------------------------------
To taka さん 2006年 06月 19日 11時 50分 52秒
WMI で扱う日付時刻の型はちょっと特殊です。
VBS で扱う内部形式の Date とは仕様が異なるので変換することが必要になります。
CIM_DATETIME [WMI]
http://msdn.microsoft.com/library/en-us/wmisdk/wmi/cim_datetime.asp?frame=true
WMI DATETIME の仕様は上記のとおりですので、それを参考にすると変換関数がかけるでしょう。
なお、Windows XP 以降であれば SWbemDateTime が使えるのでそれを利用してやるともっと間単に変換ができると思います。
なお、今回は WQL で使用するときのことなので、ここも参考になるでしょう。
WQL-Supported Date Formats
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wql_supported_date_formats.asp
初めまして、takaと申します。
現在、イベントログを全て検索し、エラー監視のスクリプトは作成できたのですが、検索範囲を指定された日(実行日)のみにしたいのですが、どのようなスクリプトにすればいいか分かりません。
どなたかご存知の方ご教授お願い致します。
現在作成したスクリプトは下記のものです。
------------------------------------------
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent Where Logfile = 'System' and " _
& "EventCode = '6008'")
if colLoggedEvents.Count => 1 then
Const EVENT_SUCCESS = 1
Set objShell = Wscript.CreateObject("Wscript.Shell")
objShell.LogEvent EVENT_SUCCESS, _
"○○" , "\\○○.○○.○○.○○"
end if
-----------------------------------------------------------------
>>てるてる さん 2006年 06月 13日 17時 46分 31秒
またもわからないですが(^_^;;;)、本当に何も設定を変えてないとするとハード(線とかかも)の不良か、あるいはドライバかOLE/RPCのバグの匂いが・・・
一応C++で同じような事をするコードを書いてみましたが、多分これを実行してもREGDB_E_CLASSNOTREG(0x80040154)が出るだけであまり意味が無いと思いますね・・・(滝汗)他のエラーコードが出ればしめたものなんですが・・・
RMCSMP1.LZH:WSHRemote生成チェックサンプル(C++)
http://winscript.s41.xrea.com/upload/source/No_0010.lzh
まずは、そのリモートコンピュータにはスクリプト以外の方法では完全に正常にアクセスできるのかどうか、ですね。できるのだとすると面倒な事に・・・ まあ再現性があれば時間さえかければ必ず原因は判明しますが、デバッガは必要です。
よくある問題点と言えば、日本語のフォルダ名とか何か日本語が関係している場合ですね・・・もっとバカげたバグも多いです。
WSH互換スクリプトホストを作ってみました。
SCR003.LZH:WSH互換スクリプトホスト。無制限再配布可能。
http://winscript.s41.xrea.com/upload/source/No_0008.lzh
WScriptオブジェクトは一部ができていません。できていないものは
1. ArgumentsオブジェクトのShowUsage
2. GetObject()のURL指定
になります。後は一応作りました。
あと、WSFと、各種スイッチはサポートしていません。
Win98/Win2000でしかテストしていないので、どなたかXP他でテストお願いします。
特に、WScriptオブジェクトでイベント接続したりArgumentsオブジェクトを使うスクリプトを使っている方はよろしくお願いします。
で、これは何に使うのか、と言うと、 無制限の再配布を許可、にしているので、WSHを導入禁止とかしている場合にちょこっと入れればスクリプトが実行できます。レジストリも一切使いません。MSのソフトウェアと違いライセンス違反とかも無いのでどんな状況のマシンにコピーして頂いても結構です。
-------------------------------------------------------------------------------
>>list156
>>しょういち さん 2006年 05月 30日 16時 09分 27秒
MSDNライブラリ
http://msdn.microsoft.com/library/ja/
のフレーム内のHTMLが取得できない、とのことなのですが、以下のスクリプトで取得できるようなのですが・・・?
(再掲)
Const SaveFolder = "C:\TMP\"
Set Shell = CreateObject("Shell.Application")
For Each ie In Shell.Windows()
Set doc = ie.Document
If TypeName(doc) = "HTMLDocument" Then
SaveDoc doc, doc.title
End If
Next
WScript.Quit
Sub SaveDoc(doc, title)
SaveTextToFile doc.body.parentElement.outerHTML, SaveFolder & title & ".htm"
Dim frames
Set frames = doc.frames
Dim i
For i = 0 To frames.length - 1
Dim docx
Set docx = frames(i).document
SaveDoc docx, title & "_" & i
Next
End Sub
Sub SaveTextToFile(text, path)
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
Dim stream
WScript.Echo path
Set stream = fs.CreateTextFile(path)
stream.Write text
stream.Close
End Sub
検索してから表示させたり、リンクを踏んだりしてフレーム内のページを変えてみましたが、私がやった範囲ではどれも取得できるようです。
しかし、どれも単独で使える状態のHTMLではないみたいで、取得したHTMLをIEで表示させてもエラーになります。中を色々改造しないとまともに表示できないでしょう。
「取得できない」という意味が違うのでしょうか? あるいはページのロードが完了していない状態で取得してるとか??
-------------------------------------------------------------------------------
>新米MCP さん 2006年 06月 02日 23時 04分 07秒
>Runで動かしたコマンドプロンプトからテキストへ書き出させて、それを読む…といった方法なら可能です。
>詳細はこの掲示板のログにもありますが、下記URL(ベクター)で解説とサンプルがダウンロードできます。
>http://www.vector.co.jp/soft/winnt/util/se373943.html
>セキュリティなどについても詳しく書かれているので、こちらがお薦めです。
なるほど。
ここいらへんから始まる長〜いお話。
list118
>ばんのしゃーによかばんた さん 2004年 11月 06日 15時 50分 26秒
>命題[P1]
>VBSをWScript.EXEで実行するとWScript.StdIn/StdOutは使えない。は正しいか。
結論ぽいのがこれなのですが、
>>ばんのしゃーによかばんた さん 2004年 11月 06日 15時 52分 17秒
>ウィンドウアプリが標準入出力を使えないのは、COMMAND.COMやCMD.EXEなどのシェルが
ウィンドウアプリに対して標準入出力を単にサービスしてないからです。ケチ!
>ウィンドウアプリでも、標準入出力をサービスしてやれば、使えるのです。
>wShell.Exec()はウィンドウアプリに対しても標準入出力をサービスしているようです。>あんたは偉い!
なぜこういう妄説が「大発見」という事になってしまうのか・・・
COMMAND.COMやCMDはウィンドウアプリに対してちゃんと標準入出力をサービスしています。
こういうスクリプトに対して、
<X.VBS>
MsgBox WScript.StdIn.ReadLine
コマンドラインから
ECHO "ABC" | WSCRIPT X.VBS
とか、
WSCRIPT X.VBS < ABC.TXT
(ABC.TXTの内容はただ中にABCと書いてあるだけ)
とやればちゃんと"ABC"は表示されます。なぜこんな簡単な事もわからないのか。
そもそもなぜ、
>VBSをWScript.EXEで実行するとWScript.StdIn/StdOutは使えない
と思ったのでしょうか?
おそらくこの人はコマンドプロンプトから
C:\>WSCRIPT X.VBS
とした場合にコンソールからの入力をStdInで使用したい、と考えたのだと思います。
残念ながらこれはできません。
Cプログラマであれば、子プロセスが必ずしも親の標準ハンドルを継承するとは限らない、という事はよく知っているわけですが、それとは別に、コンソールにだけ特別に適用されるルールがあります。GUIアプリにはコンソールは継承できないのです。コンソール以外に対するハンドルは継承可能なので上のようにファイルをリダイレクトしたり、パイプを使った場合には継承できるわけです。
なのでWSCRIPT X.VBSでStdInを使うことができないのはCOMMAND.COMやCMD.EXEのせいではありません。これはシステムの仕様なのです。
それにこれはやはりCプログラマであれば常識的ですが、子プロセスがCUIアプリなのかGUIアプリなのかを判断するのは、方法はありますが、簡単ではありません。わざわざCUIアプリだけを選んで何かを行う、というのは面倒なのです。
>http://www.vector.co.jp/soft/winnt/util/se373943.html
で、このソフトに同梱の文書TECHNOTE.TXTですが、こっそりというかうやむやというか、この間違いに気付いたらしいので上のガセとは微妙に違う事が書かれています。
何で間違いに気付いたのに大ガセ書いた掲示板に訂正やおわびを書かないんでしょうかね?
責任者出てこい!(なんちて(^^;))
To いいの さん 2006年 06月 13日 21時 40分 26秒
> またその値を取得する方法などはあるのでしょうか。
> WSHやWMIとは関係ないかもしれませんが・・・
いや、無ければ強引に取ってきて、ゴリゴリと出力してやればいいだけでしょう。
WMI で perfomance counter はとってこれるので、あとはそれをゴリゴリと出力してやればよいだけ。
Windows 2000 ということなら Win32_PerfFormattedData_ で始まる class は使えないけど、Win32_PerfRawData_ で始まるものは使えます。
むたぐちさん、ご無沙汰しております。shobohnです。
遅ればせながら@ITでの連載開始おめでとうございます。
いや、ほんとすごいですね〜。
何気に記事を読んでたら拙作ツールが紹介されててビックリしました。
お礼も兼ねてこれからも益々のご活躍を期待しつつレスさせていただきました。
Runを利用してtypeperfコマンドの実行を行い、パフォーマンスカウンタの値をファイル出力しています。
XP(Home Edition以外?)ではこのコマンドが使えるのでいいのですけど、
Windows2000にはtypeperfが入っていないそうなので、
Windows2000にはXPにあるtypeperfみたいなパフォーマンスカウンタ値をファイル出力するコマンドなどはあるのでしょうか。
またその値を取得する方法などはあるのでしょうか。
WSHやWMIとは関係ないかもしれませんが・・・
よろしくお願い致します
急にスクリプトが動かなくなってしまいました。
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "10.10.200.11"
strScript = "1gouki.vbs"
Set objRegProv = GetObject("winmgmts:{impersonationLevel=Impersonate}" & _
"!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Microsoft\Windows Script Host\Settings"
objRegProv.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,"Remote","1"
set objController = WScript.CreateObject("WshController")
set objRemote = objController.CreateScript(strScript, strComputer)
上記のリモートオブジェクトを利用し、遠隔操作を行っております。
今までは問題なく動いていたのですが先日突然、上記スクリプト最終行で
"ActiveXコンポーネントはオブジェクトを作成できません"
と、実行エラーを起こすようになってしまいました。
操作対象のマシンの構成、パラメータを変更した覚えはありません。
エラーするようになったのは1号機のみで、同じサーバー構成の2号機、3号機は正常に動いています。何が考えられますでしょうか?
操作対象の環境はWindows2000 SP4、IE6.0です。
操作する側の環境はWindowsXP、IE6.0です。
よろしくお願いいたします。
>>uni さん 2006年 06月 07日 15時 24分 56秒
サービスアプリのサンプルを書いてみたので何かの参考になれば。Cですが。
検索したら同じようなものがあるんじゃないかと思いますが・・・
SVCSMP1.LZH:Win32サービスアプリ スケルトン サンプル(C)
http://winscript.s41.xrea.com/upload/source/No_0007.lzh
> 新米MCP さん 2006年 06月 10日 02時 44分 39秒
新米MCP さん。レスが遅くなって申し訳ありません。emledit.vbsが使えないのはKB911567のせいだったのですか。家にあるPCではできていたのでおやと思ったのですが。
いちおう同様のツールがないかと探しましたら、こんなものがありました。
http://www.forest.impress.co.jp/article/2006/06/07/oetemplater.html
何とか使えているのでここに質問をポストしたことを忘れていました(~_~;)
本当にごめんさい。
>>uni さん 2006年 06月 07日 15時 24分 56秒
あまり大したレスでないので申し訳無いですが・・・
適当にでっちあげたEXEを登録してみたら全く同じエラーが出ます。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=Impersonate}!\\" & strComputer & "\root\cimv2")
Set objService = objWMIService.Get("Win32_BaseService")
errReturn = objService.Create("X", "X", "C:\TMP\X.EXE")
Wscript.Echo errReturn
で、エラーは出ますが、EXE自体は実行されてます。
何のプログラムを登録しようとしたのかわかりませんが、サービスアプリになってないんじゃないでしょうか?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/services.asp
>>管理人さん
新ローダの感想を。
一行コメントは良いですね〜
しかし、
1. 元のファイル名が消えてしまう。
2. DL数は表示されず。
は残念・・・
あと、メインページからはファイルへの直リンにならず、いったんページを通過するのには何か理由があるのでしょうか?
今さら変える事もできないとは思いますが、何かの参考に。
>チェック式 WSH入門
>―― 演習方式で身につけるWSH超入門 ――
拝見しました〜
何かいきなりエディタの説明とかちょっと初心者向けとしてはマニアックなような気が・・・(^^;)まあ聞いて損になる話ではないですが。変なエディタを選ばないように、という気遣いなのでしょうね。
#私だったらいきなりHello Worldかましてたかも。
初心者がよく戸惑うのは例えば、オブジェクトって何?というものだと思います。オレはファイル内の文字を置き換えたいだけなんだよ。何でそんなオブジェクトとか作らねばならんのだ?と。
で、本題と関係ないのでどうでもいいのですが
>アプリケーションをWSHなどの外部から操作することを「オートメーション」という
ちょっと違うと思います。一般語のオートメーションならそうかもしれないですけどね。非オートメーションのCOMを使った記事も投稿したのに〜(^^;)
何かしょっちゅうそういう感じの話が出るので、作ってみました。
CRYF001.LZH:スクリプトを暗号化してEXE化
http://winscript.s41.xrea.com/upload/source/No_0005.lzh
スクリプトを暗号化してさらにEXEファイル化します。例のWSHコンパイラと同じようなコンセプトのものですが、もう少しまともに使える(多分)ように作ってみました。
飯岡氏の物とは違い、WScriptオブジェクトも使えます。スクリプトコントロールを使うわけではないので、ノーマルなWin98とかでも動きます。
とは言え、環境やセキュリティの状態によっては動かない可能性があります。ので、動作確認お願いします。
私はWin98とWin2000(アドミニ/ユーザー)で動作確認しました。
そうそう、後、前回投稿のWrapWithClassInfoですが、どんなものかわからないと興味もわかないと思うので、コードを貼ってみます。
これは、WScript.CreateObject()したものではない既存のIEオブジェクトに対してイベント接続を行うものです。閉じ用のIEを一つだけ起動してから本スクリプトを起動し、それからそのIEを閉じてみてください。
このサンプルを同梱し、ドキュメントを少し修正して再UPします。
WWCI002.LZH:WScript.ConnectObjectできないオブジェクトをConnectObject可能に
http://winscript.s41.xrea.com/upload/source/No_0004.lzh
Set Shell = CreateObject("Shell.Application")
Set ies = Shell.Windows
Found = False
For Each ie In ies
If TypeName(ie.Document) = "HTMLDocument" Then
Found = True
Exit For
End If
Next
If Not Found Then
WScript.Echo "IE not found"
WScript.Quit
End If
Set wwci = CreateObject("WrapWithClassInfo")
Set iex = wwci.Wrap(ie, "InternetExplorer")
WScript.ConnectObject iex, "ie_"
ie_OnQuitCalled = False
Do While True
WScript.Sleep 100
If ie_OnQuitCalled Then
WScript.Quit
End If
Loop
Function ie_OnQuit
MsgBox "ie_OnQuit"
ie_OnQuitCalled = True
End Function
それで前回の書き込みで訂正。MSTHMLはIProvideClassInfoサポートしてます(^^;;)
しかし、IProvideClassInfoより優先されるIProvideMultipleClassInfoもサポートしています。ですが、IProvideMultipleClassInfo::GetInfoOfIndex()の実装をMSHTMLのプログラマが完全に間違えているために、結局ConnectObject()で接続できません。WrapWithClassInfoを使うとIProvideMultipleClassInfoをハネているので接続できます。あと、MSHTMLはプロパティに関数オブジェクト代入すりゃそれでいいじゃん、という突っ込みはなし(^^:)
>sakurou さん 2006年 06月 09日 16時 06分 24秒
それはWindows Updateのセキュリティパッチ、KB911567を適用したときの動きですね。
KB911567を適用すると、emlファイルのヘッダにあるX-Usentフィールドが無視されるようになります。
X-Usentフィールドは、送信済みかどうかの判別用フィールドです。
emledit.vbsはX-Usentフィールドを未送信に書き換えることで編集を可能にしています。
ですがKB911567を適用すると、スクリプトは正常に動いていても、編集はできなくなります。
これはセキュリティ強化の一環なので、回避方法はありません。
// 仮に回避方法を知っていても、お教えできませんが…。
KB911567をアンインストールすればまた使えるようになりますが、
危険度の高い脆弱性が復活してしまうので、やめておいた方がいいです。
PCを乗っ取られる危険を防ぐためです。多少の不便は我慢しましょう。
どうしてもアンインストールしたい場合はKB911567、KB908531、KB911562をアンインストールし、
再起動してからWindows UpdateでKB908531、KB911562をインストールしなおします。
自動アップデートが有効になっているとまたKB911567がインストールされてしまうので、
自動アップデートも停止しておく必要があります。
よほどの事情がない限りは、やめておきましょう。
// 私もemledit.vbsが使えないのは残念なんですけどね。
emledit.vbsを使わせていただきましたが、emlファイルをドロップして開いてももとの状態のままです。
OSはWinXP SP2
mailerはOutlook Express Ver.6です。
アプリケーションのサービス化を行いと思っているのですが
うまく行かなくて困っています。
参考にしたサイトは
http://www.netdive.jp/memo.asp
になりまして、
VBScript を使った 登録 仮想サービス Db.exe をインストールします
という部分にあるソースを参考にして行っています。
登録自体は出来るのですがサービスを開始にすると
そのサービスは指定時間内に開始要求または制御要求に応答しませんでした。
とエラーメッセージが表示されてしまいます
とりあえずコマンドラインから登録が出来るかscを利用して
出来るか試してみたところ登録は出来るのですが
サービスの開始が行えませんでした。
エラー内容は
[SC] StartService FAILED 1053:
と表示されています
また、scはXP以上とかかれてましたので
Windows2000からでも行えるサービスの登録方法も探しています
(ユーザー側に何かソフトのインストールなどをさせない方法で)
何か原因などがわかる方がいましたら教えて頂けませんでしょうか
よろしくお願いします
To rur さん 2006年 06月 04日 00時 46分 38秒
> WSH、WMIで何か良い本とかってありませんか?
WSH はともかくとして、WMI ではろくに無いでしょうね。
# 以前、調べたときは日本語のものは1冊しかなくて、しかもそれほど突っ込んだものはないので・・・
# WSH に関してはここの管理者のむたぐちさんがいろいろ調べているようなので参考にするとよいでしょう。
> (最近は公式ページで調べるのが一番いいのかなって思ってますが英文だったりするので大変・・・)
それが正解です。苦労してでも読むべきでしょう。
わたしもそうやって勉強しましたし・・・ひたすら SDK の document を読みまくる
> (毎日3時間も電車に乗ってるのでたくさん読めるのです・・・)
すっげー。正直頭が下がります。
というか、正直な話ここまで理解できているならすごいと思いますけど。
>ちゃっぴ さん 2006年 06月 03日 15時 22分 55秒
>これはやっている内容を考えれば容易に理解できると思います。
すみませんです。
あまり自分で調べずに色々質問しちゃってたので
色々迷惑かけてしまいました・・・。
>ExecQueryAsync の場合、永遠に監視し続けるわけはなく、1度取得したら終了なので懸念しているようなことは発生しません。
なんかうまくいかないなーと思ってたましたらそれが正常な処理でしたか・・・。
>ExecQueryAsync が威力を発揮するのは、remote object に対し query を発行する場合とかで、例えば複数の client に ping 実行する場合なんかは非常に効果的です
たしか公式ページの方にpingを例にした説明を読んだ気がします。
>local で複数の query を実行する場合には対して効果が無い場合が多いかもしれません。
そうですか〜・・・、でもとりあえず勉強という意味でどんなものか試しにやってみたいなとは思ってます。
ちょっぴさん、詳しく色々ありがとうございます。
出来れば自分で色々調べてから質問とかした方が
多少はちょっぴさんの話についていけたと思ってたのですが
あまり時間がなかったもので思いつく事で質問させて頂きました。
(言い訳にしかなりませんが・・・)
教えて頂いた事を少しずつ整理しながら進めたいと思います。
話が変わってしまいますが
WSH、WMIで何か良い本とかってありませんか?
一週間ぐらい前からWSHを触りだしてから
仕事で平日は買い物に行けないので
通販で2冊買ったのですがどれも自分が欲しい情報とか
載ってるものではなくてまだ探してる最中です。
それとこの手の本って少ないですよね。探した感じですとあまりない気がしました。
(最近は公式ページで調べるのが一番いいのかなって思ってますが英文だったりするので大変・・・)
ちょっぴさんが教えてくれた事とかネットでもなかなか探せなかったり
見つけられたとしても英文だったり、時間がかかってしまいますので
出来れば本で欲しいなーと。
(毎日3時間も電車に乗ってるのでたくさん読めるのです・・・)
もし何かオススメの本とかありましたら教えて下さい!
新米MCPさん
> テキストフィールドでEnterを押した時に動くのは、formのsubmitイベントです。
> formタグでactionが指定されていないので、submitではHTA自身が再度開かれます。
> ところが hta:application の中で navigable="yes" が指定されていないので、
> HTAは同じウィンドウの中で開かれず、IEで開かれてしまう。
> これが、別ウィンドウが開いてしまう理由です
根本的にHTMLの知識不足だったみたいですね。
説明をみて理解できました。
代替案を参考に自分なりに変更してみたいと思います。
> WshShell.Execでは非表示や最小化、最大化といった指定はできません。
> WshShell.Runでは非表示で起動することができますが、標準出力が取得できません。
ショートカットなら最小化を指定できるので、なにか方法があるのかな?と
思ったのですが、やっぱり無理でしたか。
教えていただいたサンプルをダウンロードしてみたのですが、今の自分には少し難解なのでゆっくり勉強したいと思います。
ありがとうございました。
To rur さん 2006年 06月 02日 12時 26分 05秒
> ExecQueryAsync
> http://www.showg.net/monoiziri/WMI/Search/Search02.htm
これは、sample が適切ではありませんね。ExecQueryAsync ではなく、ExecNotificationQueryAsync なので。
ExecQueryAsync の場合、永遠に監視し続けるわけはなく、1度取得したら終了なので懸念しているようなことは発生しません。
それと、WSH と HTA では使い方が若干異なります。
> WSH で WMI の Event を受け取る場合、その event を受け取るまで待機するよう coding する必要があります。
ExecQueryAsync が威力を発揮するのは、remote object に対し query を発行する場合とかで、例えば複数の client に ping 実行する場合なんかは非常に効果的です。
local で複数の query を実行する場合には対して効果が無い場合が多いかもしれません。
その端末ですでに bottle-neck が発生しているでしょうから。
WScript.ConnectObject()ではInternetExplorerオブジェクトにはイベント接続ができません。
これはIEオブジェクトがIProvideClassInfo、すなわち自分のクラスについてのタイプ情報提供をサポートしないためです。(IPersist系を使う方法もあるのだが・・・ConnectObjectはそれはやらない・・・)
そこで、何とかConnectObject()を成功させるために、任意のオブジェクトにIProvideClassInfoをサポートさせるようなラッピングオブジェクトを作ってみました。(ただし元のオブジェクトがタイプライブラリをサポートしている必要はあります。)
http://winscript.s41.xrea.com/upload/source/No_0003.lzh
本来IProvideClassInfoもタイプライブラリも無くてもオートメーション接続は可能なのですが、Excel、IEやMSHTML(の片方)はそうなっていません。当然のようにクライアントがタイプライブラリを使うことを強制します。
通常の開発環境だとタイプライブラリがあるのが当然だからなのかと思いますが、はっきり言ってMSのアプリのオートメーションイベント接続は正しくありません。
このようなExcelやIEの挙動に合わせるためにWScriptのConnectObject(CreateObject/GetObject)は非常に手間がかかる処理になっています。(どころかタイプライブラリが無いと接続できなくなっている)
(タイプライブラリを使わない方法をとる場合、スクリプトホストなら、シンクで必要とされる処理は、そのままスクリプトディスパッチに丸投げするだけでできます。)
タイプライブラリは必須機能ではないので、オブジェクトがどの程度タイプライブラリをサポートするかはオブジェクト自身にまかされているし、使い方も厳密には決まっていない所があります。
だからIEなど、何もかも完璧にサポートしているとは限らないわけで、ConnectObject()が動作しないオブジェクトが出てくるわけです。
だから、オートメーションのイベント接続にはタイプライブラリを使ってはいけない。
しかし残念ながらMSのプログラマはそれがわかっていなかったのです。
OLE2が出た初期にVBやVBAの設計者が、名前とDISPIDの対応を管理するのが不都合(?)と思ったのでしょうか。
しかし結局、のちにはIDispatchExというインターフェースでそういう仕組みをスクリプトのシステム標準に取り入れることになります。
先見の明が無くとも、冷静にオートメーションの仕様を考えればその方が自然だとわかったはずなのですが・・・ 当時はVBAで動きさえすれば深く考えない、ということだったのでしょう。
To rur さん 2006年 06月 02日 14時 37分 49秒
>>あと、ExecQuery の場合、第三引数 iFlags で scroll mode を変更できるので、それによっても若干変わってきたと思います
> この値で適してる値がよく見かける48なのでしょうか・・・
48 って書くとわかりにくいので、
wbemFlagReturnImmediately Or wbemFlagForwardOnly
とかいてやらないと。
wbemFlagReturnImmediately は query の結果が全部返ってくるまで待つのではなくて、それを使うときに自動的に展開する
wbemFlagForwardOnly はいわゆる 前方 scroll ですね。
ADODB.RecordSet とかでもおなじみの。
要するに猪突猛進なので、後ろに振り返ることができません。
影響を受けるのは、Clone_ method だけではなくて、Count property とかも影響受けます。
これはやっている内容を考えれば容易に理解できると思います。
どちらにしても、data size が大きくならないとそれほど変わらなかった気がします。
> 非同期の処理を実行してもし終了の処理をいれずに放置されてた場合には
> PCの電源を抜いた後でも動いてるのかが気になる所です。
いくらなんでもそれは無いでしょう(笑)電源を抜いているのですから・・・
どちらかというと、認識が逆ですね。
WSH で WMI の Event を受け取る場合、その event を受け取るまで待機するよう coding する必要があります。
event を受け取る前に呼び出し元の process が終了した場合には query が完了した時点で開放されると思います。
# query 自体は内部的に別の process (wmiprvse.exe) で動いていますので・・・
>うに さん 2006年 06月 02日 00時 21分 23秒
>これを回避するにはどうしたら良いのでしょうか?
代替策ですが、送信ボタンにlabelタグを使用して
<button type="button" id="submitcmd" onclick="CMD_Submit">
<label for="submitcmd" accesskey="S">送信(<u>S</u>)</label>
</button>
というように書けば、Alt + S キーで送信ボタンを押せるようになります。
これでは駄目でしょうか?
テキストフィールドでEnterを押した時に動くのは、formのsubmitイベントです。
formタグでactionが指定されていないので、submitではHTA自身が再度開かれます。
ところが hta:application の中で navigable="yes" が指定されていないので、
HTAは同じウィンドウの中で開かれず、IEで開かれてしまう。
これが、別ウィンドウが開いてしまう理由です。
navigable="yes" を指定すれば別ウィンドウが開くことは抑えられます。
formタグにonsubmit="CMD_Submit" を指定してやれば、同時にCMD_Submitを動かすこともできます。
しかしsubmitイベントは送信後にactionを開くところまでがひとつの機能なので、
空白のaction、つまりHTAがリロードされてしまい、リロードされると入力フィールドがリセットされます。
そこでCMD_Submitが正常に動いても、結局うまく表示できないことになります。
ですから、回避方法を考えるより、代替策をお勧めします。
この代替策を使う場合は、テキストフィールドでEnterを押すとsubmitされるのは邪魔なので、
formタグは消しておいた方がいいかもしれません。
formタグなしでもinputやbuttonの表示には問題ありませんし、inputのidを直接指定すれば操作もできます。
たとえば fm.cmdtext.value は、formタグを消しても cmdtext.value という形で使えます。
>最小化状態(WindowStyle=7みたいな)で表示することは可能でしょうか?
WshShell.Execでは非表示や最小化、最大化といった指定はできません。
WshShell.Runでは非表示で起動することができますが、標準出力が取得できません。
Runで動かしたコマンドプロンプトからテキストへ書き出させて、それを読む…といった方法なら可能です。
詳細はこの掲示板のログにもありますが、下記URL(ベクター)で解説とサンプルがダウンロードできます。
http://www.vector.co.jp/soft/winnt/util/se373943.html
セキュリティなどについても詳しく書かれているので、こちらがお薦めです。
>ただし、data 量が少ない場合、InstancesOf の方が速い結果が出ました。
おー、そうでしたか。dataを見ながら作った方がよさそうですね。
>あと、ExecQuery の場合、第三引数 iFlags で scroll mode を変更できるので、それによっても若干変わってきたと思います
この値で適してる値がよく見かける48なのでしょうか・・・
まだそんなに2つとも調べていないのではっきりとはわかりませんが
SWbemRefresherは使える環境がXPと2003となっているので
Windows2000から対応させたいので使用するか悩んでます。
(OSの種類を見て処理を振り分けるようにすればいいとは思いますが…)
ExecQueryAsyncですが非同期で実際にイベントが発生した時に
現在、私が開発を行っているアプリケーションで
その値を受け取る事ができるかっていう事が問題になるかなと思っています。
(まだ実際に試していないのでなんともいえませんが)
試せばわかる事ですが
非同期の処理を実行してもし終了の処理をいれずに放置されてた場合には
PCの電源を抜いた後でも動いてるのかが気になる所です。
とても参考になりました。
ありがとうございました
また何かあった場合にはよろしくお願いします
SWbemRefresher
https://www.microsoft.com/japan/technet/scriptcenter/scripts/misc/wmi/mswmvb01.mspx
ExecQueryAsync
http://www.showg.net/monoiziri/WMI/Search/Search02.htm
To rur さん 2006年 06月 02日 11時 33分 50秒
InstancesOf と ExecQuery の速度ですが、
data 量が多い場合、当然ですが、ExecQuery の方が速いでしょう。
ただし、data 量が少ない場合、InstancesOf の方が速い結果が出ました。
# 以前実験したときの記憶では
あと、ExecQuery の場合、第三引数 iFlags で scroll mode を変更できるので、それによっても若干変わってきたと思います。
あと、おなじものを何回も利用する場合には、SWbemRefresher を使ってやるとか、同時に複数のものを取得する場合、ExecQueryAsync で非同期呼び出ししてやるとかも有効でしょう。
ちょっと見にくいですが
先ほどリンクを張らせてもらった所からいけるページに
データ取得の速度っぽいのがあったので載せておきます。
(Query Bytes Returnedって載ってるから速度ではないのかもしれませんが・・・)
Table 1. Comparing different WMI instance retrieval methods and queries
Method/WQL Query Bytes Returned
objSWbemServices.InstancesOf("Win32_Service") 157,398
objSWbemServices.ExecQuery("SELECT * FROM Win32_Service") 156,222
objSWbemServices.ExecQuery("SELECT Name FROM Win32_Service") 86,294
objSWbemServices.ExecQuery("SELECT StartMode FROM Win32_Service") 88,116
objSWbemServices.ExecQuery("SELECT StartMode FROM Win32_Service WHERE State='Running'") 52,546
objSWbemServices.ExecQuery("SELECT StartMode, State FROM Win32_Service WHERE State='Running'") 56,314
objSWbemServices.ExecQuery("SELECT * FROM Win32_Service WHERE Name='WinMgmt'") 27,852
objSWbemServices.Get("Win32_Service.Name='WinMgmt'") 14,860
この結果だと
instancesOfが一番サイズが大きいですね。
だとしたらやっぱりExecQueryでデータ名取得して行ったほうが良いのかな
適当に英文を訳して読んでたらそんなような事も書いてあった感じでした。
後はSWbemObject.Clone_の事がわかるといいのですが…。
WMIからデータを取得する方法がいくつかあると思いますが
取得方法によってどちらが早いとかあるのでしょうか。
ちょっと処理が重い気がするので出来るだけ早く処理を行いたいと思っています。
たとえば
(1)
Set ServiceSet =
GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_Service")
(2)
Set ServiceSet =
GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_Service")
1.2ではどちらが早いのでしょうか?
以下のサイトでは
http://www.showg.net/monoiziri/WMI/FirstStep/FirstStep01.htm
直接全部取得する[InstancesOf]と、条件付きで取得する[ExecQuery]の違いかな。
面倒だったら全部[ExecQuery]でいいかも。
と載ってました。
InstancesOfが全部取得するのであれば
取得データが少ないならselect文の取得データー名を*じゃなくてそのデータの名前にしてあげて
取得した方が早いのでしょうか?
また以下のサイトに
http://www.exchange-admin.biz/blog/archives/000019.html
ExecQueryの引数にフラグを追加すると早くなると載ってましたが
これを指定した場合でどちらが早いのかお分かりになる方はいますでしょうか?
またこれを指定した場合にSWbemObject.Clone_が使えなくなると載ってますが
これはどういったものが使えなくなるのか教えて頂けませんでしょうか?
よろしくお願いします
はじめまして。
行き詰ってしまったので質問させてください。
<html><head><title>sample</title>
<hta:application applicationname="sample" singleinstance="yes" />
<script language="vbscript">
Sub CMD_Submit
Set Wshell = Createobject("Wscript.Shell")
Set objExec = Wshell.Exec("%ComSpec% /c " & fm.cmdtext.value)
fm.resultArea.value = objExec.StdOut.ReadAll
End Sub
</script>
</head>
<body>
<form id="fm">
<input type="text" id="cmdtext" value="help">
<input type="button" value="送信" id="submitcmd" onclick="CMD_Submit"><br />
<textarea rows=50 cols=50 id="resultArea" style="width:100%;"></textarea>
</form>
</body>
</html>
というHTAを作ったのですが、
ボタン押下で処理を実行するのが大変なので
fm.cmdtextにフォーカスがあるときにEnterキーでCMD_Submitを
実行しようと思ったのですが、Enterキーを押すと
別窓が立ち上がってしまいます。
これを回避するにはどうしたら良いのでしょうか?
また、この処理を実行すると一瞬コンソールが表示されてしまいますが
最小化状態(WindowStyle=7みたいな)で表示することは可能でしょうか?
よろしくお願いします。