AKA さん 2006年 07月 08日 20時 33分 04秒

>>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ができませんね…。
いくつかのテクニックがあります。やめときますが。

AKA さん 2006年 07月 08日 19時 36分 43秒

Outlook Expressでメール一覧のウィンドウはリストビューコントロールなのですが、クラス名が少し変わっています。
で、これに対応するためにリストビュー調査官をバージョンアップし、クラス名を設定可能にしてみました。
これを使えばとりあえずメール一覧は取れます。

LVI002.LZH:リストビューコントロールからデータを盗むコンポ
http://winscript.s41.xrea.com/upload/source/No_0017.lzh

後はSendKeysで何とか。誤爆防止にはDWが使えます。尤も本人は最早要らないみたいですが。

domingo さん 2006年 07月 03日 22時 53分 02秒

はじめまして、随分前からお世話になっていましたが、初めて投稿
させて、頂きます。よろしくお願いします。

WSHでCDトレイをイジェクト出来る所までは行ったのですが、閉じる事は
出来ないでしょうか?

ついでで申し訳ないのですが、起動中のウィンド(最小化も含む)の
タイトルの取得とか出来ないものでしょうか?

domingo さん 2006年 07月 03日 22時 52分 29秒

はじめまして、随分前からお世話になっていましたが、初めて投稿
させて、頂きます。よろしくお願いします。

WSHでCDトレイをイジェクト出来る所までは行ったのですが、閉じる事は
出来ないでしょうか?

ついでで申し訳ないのですが、起動中のウィンド(最小化も含む)の
タイトルの取得とか出来ないものでしょうか?

魔界の仮面弁士 さん 2006年 07月 03日 03時 13分 49秒

≫ ねじゅみ さん
> 改行コードが全く変化しません・・・

ADODB.Stream の LineSeparator は、ReadText / WriteText には
影響を与えますが、CopyTo に対しては影響を与えないかと思います。

経験則ですけど…。(undocumented)

新米MCP さん 2006年 07月 02日 22時 50分 20秒

>ねじゅみ さん (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

mm さん 2006年 07月 02日 15時 44分 27秒

管理人様
ありがとうございます。
WSHではできないのですね。
BASP21を参考にします。
またわからないことがあるかと思いますが、
その時はご教授お願いします。

管理人むたぐち さん 2006年 07月 02日 15時 05分 37秒

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/
などがあります。

さん 2006年 07月 02日 09時 05分 30秒

IMEをVBScriptで操作する方法はありますか?

ねじゅみ さん (null) 2006年 06月 30日 10時 13分 48秒
URL:null

>新米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

新米MCP さん 2006年 06月 29日 21時 23分 29秒

>ねじゅみ さん (null) 2006年 06月 29日 16時 30分 54秒

adLFが空っぽの変数だからです。

Const adLF = 10

と、定数にしてあげれば動きますよ。

ねじゅみ さん (null) 2006年 06月 29日 16時 30分 54秒
URL:null

改行コードの変換が出来ない

ここの過去ログを参考にして、
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


おしえてくださいDirect Viewer さん (hanaemarkan.yahoo.co.jp) 2006年 06月 26日 11時 23分 04秒

Folders.dbx

ダイレクトに読み書きはできないのでしょうか?


ちなみに、
Direct Viewer が
ネット上のフリーソフトで
さがしてみましたが、
どこにあるかわかりませんでした。

おしえてくださいDirect Viewer さん (hanaemarkan.yahoo.co.jp) 2006年 06月 26日 11時 00分 21秒

Folders.dbx

ダイレクトに読み書きはできないのでしょうか?


ちなみに、
Direct Viewer が
ネット上のフリーソフトで
さがしてみましたが、
どこにあるかわかりませんでした。

mm さん 2006年 06月 26日 09時 48分 11秒

お世話になります。
ひとつ教えてください。
テキストファイルに16進コードでWRITEしたいのですが、
うまいいきません。
具体的に、ファイルの終端、つまりEOF(0x1a)を書きたいのですが、
&h1Aを付けると,26(32、36)で書かれてしまいます。
WSHで、16進を書くことはできないですか?
宜しくお願いします。

AKA さん 2006年 06月 26日 00時 58分 42秒

>>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の用語なので、誤解を与えない為には使わない方が賢明です。

AKA さん 2006年 06月 24日 15時 17分 35秒

しばらく前に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がベストですね。

haya さん (m-hayasi@hitachi-system.co.jp) 2006年 06月 23日 10時 22分 19秒

表題:outlook expressから1つずつメールデータを取り出す方法

表題の件について考えております。
1つずつ取り出して日付をつけて保存したいのですが、WSHでできる方法はありませんか?あれば教えてください

Nomu さん 2006年 06月 22日 11時 23分 27秒

先に検索すべきでした。申し訳ありません。

http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/techinfo.htm#HTA(HTMLアプリケーション)について

に大変詳しい説明をしていただいておりました。
申し訳ございません。

Nomu さん 2006年 06月 22日 11時 20分 43秒

お題:HTAを使用する場合の制約

HTAで簡単なローカルファイルの内容検査を行うツールを
開発することを考えています。
WSHでの開発経験はかなりありますが、HTAはやったことが
ありません。HTMLはあります。

勿論HTAを使う以上、VBScript(Or JScript)が動作する環境
(つまりOSがWindows2000以上+IE)である必要がありますが、
純粋に言語仕様としての制約条件があれば、ご教示ください。

なお、ごく簡単なHTAを組んで、以下の点はチェックしました。

【チェック済み事項】
○ローカルファイルシステムにアクセスできることは確認した。
○フォルダ選択ダイアログなどShellに相当する内容も動作する
 ことを確認した。
○GUIは基本的にHTMLの部品の範囲内で実現する。

【現時点でよくわからないこと】
○IEのインターネットオプションのセキュリティ関係で
 何らかの制約を受けるのか?つまり、WSHで実現できることの
 全ての内容が実現できるとは言えないのか。セキュリティ設定に
 影響を受けるのか。(なお、マイコンピュータでのファイルの
 アクティブコンテンツの実行を許可するのチェックには影響を
 受けないようである=無関係である)ようだという点は
 動作確認しました。





管理人むたぐち さん 2006年 06月 21日 23時 51分 11秒

わんくま同盟http://www.wankuma.com/に加入し、そこで

Scripting Weblog II
http://blogs.wankuma.com/mutaguchi/

というのを始めました。主にPowerShellの記事を紹介していこうと思っています。
前のブログはなかったことに…とは言いませんがこんどは真面目に書こうと思います。
プライベートなこともちょっと書いていこうかなっと思ってます。



遅くなってしまいましたが返信を。

To: AKA さん 2006年 06月 11日 00時 34分 13秒

> あと、メインページからはファイルへの直リンにならず、いったんページを通過するのには何か理由があるのでしょうか?

おそらく、リンクを張るときのためにワンステップ前の画面を表示させたいという
要求によるものだと思います。

ファイル名が変わってしまうのは、まあこの手のアップローダではお約束
みたいなものかもしれません。書庫であればそれほど問題は発生しないと思います。

> 何かいきなりエディタの説明とかちょっと初心者向けとしてはマニアックなような気が・・・(^^;)

メモ帳で書けといってもなかなか大変なのが現実でしょうから、使いやすいエディタをと
思って書きました。まあ初回としては他にあまり書くことがなかったというのが
正直なところです。

> ちょっと違うと思います。一般語のオートメーションならそうかもしれないですけどね。非オートメーションのCOMを使った記事も投稿したのに〜(^^;)

ご指摘ありがとうございます。一般語に近い意味で使いました。あまりちゃんとオートメーション
という言葉を把握してなかったかもしれません。もし可能なら訂正しようと思います。


To: shobohn さん

> 何気に記事を読んでたら拙作ツールが紹介されててビックリしました。

本文で勝手に紹介させていただきました。遅ればせながらありがとうございました。
補完クンのようなツールがないとなかなか書くのはしんどいと思いまして。

ちゃっぴ さん 2006年 06月 21日 15時 05分 21秒

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 & "'"

どこが悪いか一目瞭然でしょう。

taka さん 2006年 06月 21日 11時 12分 56秒

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
----------------------------------------------

ちゃっぴ さん 2006年 06月 19日 12時 23分 12秒

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 さん 2006年 06月 19日 11時 50分 52秒

初めまして、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
-----------------------------------------------------------------



AKA さん 2006年 06月 18日 17時 16分 54秒

>>てるてる さん 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


まずは、そのリモートコンピュータにはスクリプト以外の方法では完全に正常にアクセスできるのかどうか、ですね。できるのだとすると面倒な事に・・・ まあ再現性があれば時間さえかければ必ず原因は判明しますが、デバッガは必要です。
よくある問題点と言えば、日本語のフォルダ名とか何か日本語が関係している場合ですね・・・もっとバカげたバグも多いです。

AKA さん 2006年 06月 17日 19時 42分 48秒

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ですが、こっそりというかうやむやというか、この間違いに気付いたらしいので上のガセとは微妙に違う事が書かれています。

何で間違いに気付いたのに大ガセ書いた掲示板に訂正やおわびを書かないんでしょうかね?

責任者出てこい!(なんちて(^^;))

ちゃっぴ さん 2006年 06月 15日 03時 13分 41秒

To いいの さん 2006年 06月 13日 21時 40分 26秒

> またその値を取得する方法などはあるのでしょうか。
> WSHやWMIとは関係ないかもしれませんが・・・

いや、無ければ強引に取ってきて、ゴリゴリと出力してやればいいだけでしょう。
WMI で perfomance counter はとってこれるので、あとはそれをゴリゴリと出力してやればよいだけ。

Windows 2000 ということなら Win32_PerfFormattedData_ で始まる class は使えないけど、Win32_PerfRawData_ で始まるものは使えます。

shobohn さん 2006年 06月 15日 02時 39分 01秒

むたぐちさん、ご無沙汰しております。shobohnです。
遅ればせながら@ITでの連載開始おめでとうございます。
いや、ほんとすごいですね〜。

何気に記事を読んでたら拙作ツールが紹介されててビックリしました。
お礼も兼ねてこれからも益々のご活躍を期待しつつレスさせていただきました。

いいの さん 2006年 06月 13日 21時 40分 26秒

Runを利用してtypeperfコマンドの実行を行い、パフォーマンスカウンタの値をファイル出力しています。
XP(Home Edition以外?)ではこのコマンドが使えるのでいいのですけど、
Windows2000にはtypeperfが入っていないそうなので、
Windows2000にはXPにあるtypeperfみたいなパフォーマンスカウンタ値をファイル出力するコマンドなどはあるのでしょうか。
またその値を取得する方法などはあるのでしょうか。

WSHやWMIとは関係ないかもしれませんが・・・
よろしくお願い致します

てるてる さん 2006年 06月 13日 17時 46分 31秒

急にスクリプトが動かなくなってしまいました。

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です。

よろしくお願いいたします。

AKA さん 2006年 06月 12日 22時 45分 33秒

>>uni さん 2006年 06月 07日 15時 24分 56秒
サービスアプリのサンプルを書いてみたので何かの参考になれば。Cですが。
検索したら同じようなものがあるんじゃないかと思いますが・・・

SVCSMP1.LZH:Win32サービスアプリ スケルトン サンプル(C)
http://winscript.s41.xrea.com/upload/source/No_0007.lzh

sakurou さん 2006年 06月 12日 18時 28分 05秒

> 新米MCP さん 2006年 06月 10日 02時 44分 39秒

新米MCP さん。レスが遅くなって申し訳ありません。emledit.vbsが使えないのはKB911567のせいだったのですか。家にあるPCではできていたのでおやと思ったのですが。
いちおう同様のツールがないかと探しましたら、こんなものがありました。

http://www.forest.impress.co.jp/article/2006/06/07/oetemplater.html

何とか使えているのでここに質問をポストしたことを忘れていました(~_~;)
本当にごめんさい。

AKA さん 2006年 06月 11日 00時 34分 13秒

>>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を使った記事も投稿したのに〜(^^;)

AKA さん 2006年 06月 10日 20時 13分 26秒

何かしょっちゅうそういう感じの話が出るので、作ってみました。

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はプロパティに関数オブジェクト代入すりゃそれでいいじゃん、という突っ込みはなし(^^:)

新米MCP さん 2006年 06月 10日 02時 44分 39秒

>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が使えないのは残念なんですけどね。

sakurou さん 2006年 06月 09日 16時 06分 24秒

emledit.vbsを使わせていただきましたが、emlファイルをドロップして開いてももとの状態のままです。
OSはWinXP SP2
mailerはOutlook Express Ver.6です。

uni さん 2006年 06月 07日 15時 24分 56秒

アプリケーションのサービス化を行いと思っているのですが
うまく行かなくて困っています。

参考にしたサイトは
http://www.netdive.jp/memo.asp
になりまして、

VBScript を使った 登録  仮想サービス Db.exe をインストールします

という部分にあるソースを参考にして行っています。
登録自体は出来るのですがサービスを開始にすると

そのサービスは指定時間内に開始要求または制御要求に応答しませんでした。
とエラーメッセージが表示されてしまいます

とりあえずコマンドラインから登録が出来るかscを利用して
出来るか試してみたところ登録は出来るのですが
サービスの開始が行えませんでした。

エラー内容は
[SC] StartService FAILED 1053:
と表示されています

また、scはXP以上とかかれてましたので
Windows2000からでも行えるサービスの登録方法も探しています
(ユーザー側に何かソフトのインストールなどをさせない方法で)
何か原因などがわかる方がいましたら教えて頂けませんでしょうか

よろしくお願いします

ちゃっぴ さん 2006年 06月 04日 01時 27分 55秒

To rur さん 2006年 06月 04日 00時 46分 38秒

> WSH、WMIで何か良い本とかってありませんか?

WSH はともかくとして、WMI ではろくに無いでしょうね。
# 以前、調べたときは日本語のものは1冊しかなくて、しかもそれほど突っ込んだものはないので・・・
# WSH に関してはここの管理者のむたぐちさんがいろいろ調べているようなので参考にするとよいでしょう。

> (最近は公式ページで調べるのが一番いいのかなって思ってますが英文だったりするので大変・・・)

それが正解です。苦労してでも読むべきでしょう。
わたしもそうやって勉強しましたし・・・ひたすら SDK の document を読みまくる

> (毎日3時間も電車に乗ってるのでたくさん読めるのです・・・)

すっげー。正直頭が下がります。

というか、正直な話ここまで理解できているならすごいと思いますけど。

rur さん 2006年 06月 04日 00時 46分 38秒

>ちゃっぴ さん 2006年 06月 03日 15時 22分 55秒

>これはやっている内容を考えれば容易に理解できると思います。
すみませんです。
あまり自分で調べずに色々質問しちゃってたので
色々迷惑かけてしまいました・・・。


>ExecQueryAsync の場合、永遠に監視し続けるわけはなく、1度取得したら終了なので懸念しているようなことは発生しません。
なんかうまくいかないなーと思ってたましたらそれが正常な処理でしたか・・・。

>ExecQueryAsync が威力を発揮するのは、remote object に対し query を発行する場合とかで、例えば複数の client に ping 実行する場合なんかは非常に効果的です
たしか公式ページの方にpingを例にした説明を読んだ気がします。

>local で複数の query を実行する場合には対して効果が無い場合が多いかもしれません。
そうですか〜・・・、でもとりあえず勉強という意味でどんなものか試しにやってみたいなとは思ってます。

ちょっぴさん、詳しく色々ありがとうございます。
出来れば自分で色々調べてから質問とかした方が
多少はちょっぴさんの話についていけたと思ってたのですが
あまり時間がなかったもので思いつく事で質問させて頂きました。
(言い訳にしかなりませんが・・・)
教えて頂いた事を少しずつ整理しながら進めたいと思います。


話が変わってしまいますが
WSH、WMIで何か良い本とかってありませんか?
一週間ぐらい前からWSHを触りだしてから
仕事で平日は買い物に行けないので
通販で2冊買ったのですがどれも自分が欲しい情報とか
載ってるものではなくてまだ探してる最中です。
それとこの手の本って少ないですよね。探した感じですとあまりない気がしました。
(最近は公式ページで調べるのが一番いいのかなって思ってますが英文だったりするので大変・・・)

ちょっぴさんが教えてくれた事とかネットでもなかなか探せなかったり
見つけられたとしても英文だったり、時間がかかってしまいますので
出来れば本で欲しいなーと。
(毎日3時間も電車に乗ってるのでたくさん読めるのです・・・)

もし何かオススメの本とかありましたら教えて下さい!

うに さん 2006年 06月 03日 23時 17分 24秒

新米MCPさん

> テキストフィールドでEnterを押した時に動くのは、formのsubmitイベントです。
> formタグでactionが指定されていないので、submitではHTA自身が再度開かれます。
> ところが hta:application の中で navigable="yes" が指定されていないので、
> HTAは同じウィンドウの中で開かれず、IEで開かれてしまう。
> これが、別ウィンドウが開いてしまう理由です

根本的にHTMLの知識不足だったみたいですね。
説明をみて理解できました。
代替案を参考に自分なりに変更してみたいと思います。


> WshShell.Execでは非表示や最小化、最大化といった指定はできません。
> WshShell.Runでは非表示で起動することができますが、標準出力が取得できません。

ショートカットなら最小化を指定できるので、なにか方法があるのかな?と
思ったのですが、やっぱり無理でしたか。
教えていただいたサンプルをダウンロードしてみたのですが、今の自分には少し難解なのでゆっくり勉強したいと思います。

ありがとうございました。

ちゃっぴ さん 2006年 06月 03日 15時 22分 55秒

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 が発生しているでしょうから。

AKA さん 2006年 06月 03日 06時 18分 16秒

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で動きさえすれば深く考えない、ということだったのでしょう。

ちゃっぴ さん 2006年 06月 03日 01時 50分 11秒

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) で動いていますので・・・

新米MCP さん 2006年 06月 02日 23時 04分 07秒
URL:http://test

>うに さん 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
セキュリティなどについても詳しく書かれているので、こちらがお薦めです。

rur さん 2006年 06月 02日 14時 37分 49秒

>ただし、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

ちゃっぴ さん 2006年 06月 02日 13時 09分 57秒

To rur さん 2006年 06月 02日 11時 33分 50秒

InstancesOf と ExecQuery の速度ですが、
data 量が多い場合、当然ですが、ExecQuery の方が速いでしょう。
ただし、data 量が少ない場合、InstancesOf の方が速い結果が出ました。
# 以前実験したときの記憶では

あと、ExecQuery の場合、第三引数 iFlags で scroll mode を変更できるので、それによっても若干変わってきたと思います。

あと、おなじものを何回も利用する場合には、SWbemRefresher を使ってやるとか、同時に複数のものを取得する場合、ExecQueryAsync で非同期呼び出ししてやるとかも有効でしょう。

rur さん 2006年 06月 02日 12時 26分 05秒

ちょっと見にくいですが
先ほどリンクを張らせてもらった所からいけるページに
データ取得の速度っぽいのがあったので載せておきます。
(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_の事がわかるといいのですが…。


rur さん 2006年 06月 02日 11時 33分 50秒


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_が使えなくなると載ってますが
これはどういったものが使えなくなるのか教えて頂けませんでしょうか?

よろしくお願いします

うに さん 2006年 06月 02日 00時 21分 23秒

はじめまして。
行き詰ってしまったので質問させてください。

<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みたいな)で表示することは可能でしょうか?

よろしくお願いします。

Return