(管理人により削除) さん ((管理人により削除)) 2006年 11月 21日 14時 58分 09秒
URL:(管理人により削除)

(管理人により削除)

とうふ さん 2006年 11月 20日 19時 42分 49秒

>>palazzo さん

ご回答ありがとうございました。
おかげさまで、うまくいきました。

恥ずかしながら、今回WMIというものを初めて知りました。
ご提示いただいたサンプルコードをもとに、
これからじっくり勉強してみたいと思います。

palazzo さん 2006年 11月 20日 16時 01分 17秒
URL:http://maglog.jp/pueblo-del-script/

To:NORIKO さん 2006年 11月 17日 09時 34分 47秒

別に現状でも普通に実行なら出来ると思うのですが・・・。test2.vbsに誤りはないですか?
プロセスのバックグランドの実行は、Runメソッドの第2引数に0を指定するだけで可です。

WshShell.Run "Cscript c:\test2.vbs", 0



To:とうふ さん 2006年 11月 19日 18時 47分 12秒

WMIの機能を使用すれば可です。ソースはこんな感じです。


Option Explicit

Const DEF_COMPUTER    = "."            'As String        ''    自端末を示す定数

Const APP_NAME        = "Excel.EXE"    'As String

Const wbemFlagReturnImmediately    = &H10        'As Long
Const wbemFlagForwardOnly        = &H20        'As Long

Dim wmiObj            'As WbemScripting.SWbemObjectSet
Dim enmObj            'As WbemScripting.SWbemObject

Dim WQL        'As String

''    WQLの定義
WQL = ""
WQL = WQL & " SELECT *"
WQL = WQL & " FROM WIN32_Process"
WQL = WQL & " WHERE Name = '" & APP_NAME & "'"

''    WQLの実行
Set wmiObj = CreateObject("WbemScripting.SWbemLocator") _
                        .ConnectServer(DEF_COMPUTER, "root\cimv2") _
                        .ExecQuery(WQL, , wbemFlagReturnImmediately Or wbemFlagForwardOnly)

''    オブジェクトの列挙
For Each enmObj In wmiObj

    WScript.Echo "Excelを終了して下さい。"

Next

''    オブジェクトの破棄
Set wmiObj = Nothing
Set enmObj = Nothing


過去ログを「Win32_Process Name」で検索するとたくさんヒットするので、そちらも参考にしてみて下さい。

とうふ さん 2006年 11月 19日 18時 47分 12秒

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

あるアプリケーションが起動しているかどうかを判断するにはどうすればいいのでしょうか。
具体的には、Excelが立ち上がっていれば、「終了してください」とメッセージを出したいのです。

どなたかご教授いただければと思います。よろしくお願いします。

NORIKO さん 2006年 11月 19日 08時 30分 59秒

WSH Lab.管理人様へ
11月17日に質問させていただいたNORIKOです。
掲示板にすぐ反映されなかったため、間違えて3回投稿
してしまいました。
大変申し訳ございませんが、17日の9:41と10:17の投稿の
削除をお願いします。

申し訳ございませんでした。

ルビー さん 2006年 11月 17日 14時 59分 58秒

>palazzoさん
palazzoさんのを参考にユーザーからの入力機構を設け、無事に作成が終わりました。
おっしゃられたように、オブジェクトブラウザで探してみましたが、意外な発見で面白かったです。
VBAについては全く勉強していなかったんで、抜けていました。

後は、Excel内のマクロ内のリンク修正が出来れば……と考えて思考中です。
……考えたら、セキュリティ的に外部スクリプトからExcelマクロの修正って出来るのかなっと、そこから調べたいと思います。
不特定多数が利用想定なので、セキュリティ設定が関わってたらお手上げですし……。

何はともあれ、palazzoさん、ありがとうございます!

NORIKO さん 2006年 11月 17日 10時 17分 43秒

WSHからWSHを起動する方法を教えて下さい。

●test1.vbs の中身
 Set WshShell = WScript.CreateObject("WScript.Shell")
 WshShell.Run "Cscript test2.vbs"

●実行方法
 DOS> CScript test1.vbs
 と実行して、test1.vbs の中からtest2.vbsを実行しようとしていますが、
 うまく行きません(何も処理されない)。
 どのようにすれば、WSHの中から(今回 test1.vbs)、別のWSHスクリプト
 (今回test2.vbs)を実行できるでしょうか。

※ 最終的には、WSHの中である条件に当てはまったときに別の処理(test2.vbs)
  を実行させようとしたのですが、うまく行きませんでした。
※ WSHから呼ばれるWSH(test2.vbs)はバックグランドで実行させたいです
  (画面を出したくない)。

以上、よろしくお願いいたします。

WSHからWSHを起動する方法を教えて下さい。

NORIKO さん (Junrou.Tsuda@jp.yokogawa.com) 2006年 11月 17日 09時 41分 35秒

WSHからWSHを起動する方法を教えて下さい。

●test1.vbs の中身
 Set WshShell = WScript.CreateObject("WScript.Shell")
 WshShell.Run "Cscript test2.vbs"

●実行方法
 DOS> CScript test1.vbs
 と実行して、test1.vbs の中からtest2.vbsを実行しようとしていますが、
 うまく行きません(何も処理されない)。
 どのようにすれば、WSHの中から(今回 test1.vbs)、別のWSHスクリプト
 (今回test2.vbs)を実行できるでしょうか。

※ 最終的には、WSHの中である条件に当てはまったときに別の処理(test2.vbs)
  を実行させようとしたのですが、うまく行きませんでした。
※ WSHから呼ばれるWSH(test2.vbs)はバックグランドで実行させたいです
  (画面を出したくない)。

以上、よろしくお願いいたします。

NORIKO さん 2006年 11月 17日 09時 34分 47秒

WSHスクリプト内から、別のWSHスクリプトを実行する方法を教えて下さい。
今、
●test1.vbs の中身
 Set WshShell = WScript.CreateObject("WScript.Shell")
 WshShell.Run "Cscript c:\test2.vbs"

のように記述して、
DOS> CScript c:\test1.vbs
と実行しているのですが、test2.vbs が実行されません。
どのようにすれば、WSHから別のWSHを実行できるでしょうか。
※ 最終的には、WSH内で、ある条件に該当したとき、別の処理(test2.vbs)
 を実行したいです。
※ WSHから呼ばれるWSH(今回test2.vbs)はバックグランドで実行させ
 たいです(画面を起動しない)。

以上、よろしくお願いいたします。

SeVeN さん (seven_seven_7777@yahoo.com) 2006年 11月 17日 07時 52分 00秒

HTAで戻るのボタンを作るにはどうしたらいいのですか?トーシロですいません!

むらちゃめ さん 2006年 11月 15日 23時 38分 13秒

管理人むたぐち様

アドバイスありがとうございます。
こんな便利な物があるなんて、知りませんでした。
DOSとWSHとHTMLが同時に使用できるとは。。。
勉強が大変ですが、がんばってみます。
それでは、失礼します。

palazzo さん 2006年 11月 15日 23時 17分 40秒
URL:http://maglog.jp/pueblo-del-script/

To: ルビー さん 2006年 11月 15日 18時 44分 19秒

確かにWSHでOfficeを大々的に扱っているのは Microsoft Script Center 以外にはあまりありません。だから OfficeVBA のサイトを読み替えてコーディングするしかないです。ただOffice系のオブジェクトの頭は結構省略形で記述されている(頭にExcel.Application.xxxと几帳面にフルに記述する人はそうそういません)ので、Officeのオブジェクトブラウザを見てオブジェクトの構造をきちんと理解していないと意外とハマる恐れはありますね。しかし、それがきちんと出来る人ならば、OfficeVBAのサイトでも、そこは宝の山です。もちろんこれは他のオブジェクト、例えばWMIにしてもしかり。

ルビー さん 2006年 11月 15日 18時 45分 51秒

すいません、二重投稿に……。
管理人さん、お手数ですが片方だけ削除お願い致します。

ルビー さん 2006年 11月 15日 18時 44分 49秒

palazzoさん、ありがとうございます。
明日にでも、自分のスクリプトと組み合わせて試行したいと思います。
私も精進していきたいと思います。

……余談ですが、Excel操作系のWSH関連のHPって少ないんですかね……。
それとも私の探し方が悪いだけなのか……orz

ルビー さん 2006年 11月 15日 18時 44分 19秒

palazzoさん、ありがとうございます。
明日にでも、自分のスクリプトと組み合わせて試行したいと思います。
私も精進していきたいと思います。

……余談ですが、Excel操作系のWSH関連のHPって少ないんですかね……。
それとも私の探し方が悪いだけなのか……orz

管理人むたぐち さん 2006年 11月 15日 13時 51分 45秒

To: saya さん

> あるHPにアクセスし、HP内のあるボタンをクリックして閉じる。といった一連の
> 動作をさせる場合はバッチやマクロを使うものなのでしょうか?それともWSHを
> 使うものなのでしょうか?

バッチ=コマンドプロンプトのバッチファイル
マクロ=VBA(Officeに付属のマクロ言語)
ということならば、バッチでは厳しいがマクロではできる、
でもマクロを使わずともWSHで十分可能です、という回答になります。
具体的なコードはログにたくさんあると思います。
InternetExplorer.Applicationで検索してみてください。


To: hanyu さん

> 1.XML文書のファイル内の文字列を置換したい。

まずはFileSystemObjectのTextStreamとしてファイルを読み込み、
読み込んだ文字列に対してVBScriptのReplace関数を使えばいいと思います。
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh04/cformwsh04_02.html
と、自分の記事を紹介してみたり。
結果はTextStreamとしてファイルに書き出せます。
TextStreamについてはLesson15かヘルプをご覧ください。

この案件ならば、XMLのオブジェクトを使うまでもないでしょう。


To: むらちゃめ さん

> そこで、WSHでGUI環境作ろうかと思うのですが
> batやコマンドの引数にWSHの変数を引き渡す事は可能でしょうか?

WSHの変数をFileSystemObjectのTextStreamを使いファイルに書き出し、
batやコマンドから読み込むなどの方法が考えられます。
数値であれば、終了コードをWScript.Quit(num)のようにしてやると、
%ErrorLevel%にnumが入ります。

WSHでGUI環境を作るのはなかなか難しいですよ。
HTAなどを検討してみるほうがいいかもしれません。

palazzo さん 2006年 11月 15日 10時 23分 07秒
URL:http://maglog.jp/pueblo-del-script/

To:ルビー さん 2006年 11月 14日 16時 05分 44秒

サンプルとしてはこんな感じでしょうか。
以下の例では、microsoft系のURLを発見したら、YahooのURLに置換するという処理を行っています。
ファイルを引数として取得するようにし、条件判定を変更すれば使えるかと思いますので、
試してみて下さい。
少々大作となりましたので、気が向いたら自サイトにでもソースを上げておきます。

Option Explicit

Const XLS_FILE    = "C:\test.xls"                'As String


Const REP_URL    = "http://www.yahoo.co.jp"    'As String

Dim xlsApp        'As Excel.Application
Dim xlsSheet    'As Excel.Worksheet
Dim xlsLink        'As Excel.Hyperlink

Dim isDirty        'As Boolean                更新フラグ

    ''    初期化
    isDirty = False

    ''    インスタンスの生成
    Set xlsApp = CreateObject("Excel.Application")
    
    '' パフォーマンス処理
    xlsApp.ScreenUpdating = False
    xlsApp.DisplayAlerts = False
    
    ''    ワークブックのオープン
    xlsApp.WorkBooks.Open XLS_FILE
    
    ''    ワークシートの列挙
    For Each xlsSheet In xlsApp.ActiveWorkbook.Worksheets
        
        'WScript.Echo xlsSheet.Name
        
        ''    シート上のリンクの列挙
        For Each xlsLink In xlsSheet.Cells.Hyperlinks
            With xlsLink
                WScript.Echo vbTab & xlsSheet.Name & vbTab & .Name & vbTab & .Range.Row & vbTab & .Range.Column
                ''    HyperLinkオブジェクトのNameプロパティはURLを示す
                If InStr(1, .Name, "microsoft", vbTextCompare) >= 1 Then
                    ''    表示名とリンクが一致しない場合があるので、セルテキストも置き換える
                    xlsSheet.Cells.HyperLinks.Add xlsSheet.Cells(.Range.Row, .Range.Column), REP_URL, , , REP_URL
                    isDirty = True
                End If
            End With
        Next
    
    Next
    
    ''    ワークブックの保存
    ''    Excel.ApplicationはConnectObject出来ないので、クラシカルな方法で保存判定を行う
    If isDirty = True Then
        xlsApp.ActiveWorkBook.Save
    End If
    
    ''    ワークブックのクローズ
    xlsApp.WorkBooks.Close
    
'' パフォーマンス処理の解除
xlsApp.DisplayAlerts = True
xlsApp.ScreenUpdating = True

''    Excelの終了
xlsApp.Quit

''    インスタンスの破棄
Set xlsApp = Nothing

ルビー さん 2006年 11月 14日 16時 05分 44秒

初めまして。
こちらには何度かお世話になっております。
色々ネットを探したり、コードを書いてみたりしたのですが、行き詰まってしまい……。
皆様の知恵を頂ければと思い、投稿致しました。
教えて頂けると幸いです。

不特定多数のExcelファイル(シート数もバラバラです)があります。
これらの中で使われているハイパーリンク先のみを調査、場合によっては変更したいのです。
(例えば"\\HELLO\HP\index.htm"を"\\WORLD\HP\index.htm"等)
VBS/WSHで出来れば……と考えているのですが、ハイパーリンク先の取得方法がわかりません。

HTMLに一度直してしまえばタグ指定でいけるとは思うのですが、出来る限りExcelのままでと考えています。
また、ドラッグ&ドロップで出来れば幸いですが、まあフォルダ配下(サブフォルダ含め)のExcelを全部調べてもいいかなとそこは妥協しております。

詰まるところ、ファイルサーバのコンピュータ名を変えた時に、そこに格納されているファイルへExcelファイル(or マクロ)内でリンクを張っている場合はまずいので対策……って事なのです。
相対であれば問題ないのですけど……orz

長々と申し訳ございません。
ヒントでも頂けると幸いです。

むらちゃめ さん 2006年 11月 14日 02時 46分 18秒

どうも、はじめまして。

DOSでツールっぽいのを作成したのですが、
会社の若い奴がCUI環境が嫌だというんです。
そこで、WSHでGUI環境作ろうかと思うのですが
batやコマンドの引数にWSHの変数を引き渡す事は可能でしょうか?

すずき さん 2006年 11月 13日 23時 19分 38秒

WSHの初級者です。httpsで示されるリンク先のファイル
(XMLファイル)をダウンロードするしかけを作ろうとして
行き詰っています。
識者の皆様のお知恵をお借りいたしたく、投稿致します。


1.httpsで示されるリンク先のトップページAにアクセスする
 のに、USB pinに書き込まれた認証情報との照合が必要。
 裏で動作している何らかのアプリが起動することで、パス
 ワード入力画面が割り込みで表示される。そこで適切に
 認証されると、トップページAが表示される。

2.Aには、リンク先がB1、B2、・・・とたくさんあり、それぞれ
 のリンク先はXMLファイルとなっていて、これらを順々に
 ダウンロードしたい。


通常のダウンロードだと、FAQにもある「Msxml2.XMLHTTPおよび
Adodb.Streamを使った方法」で十分なのでしょう。
しかし、1.の認証機構のために、多数のXMLファイルへのリンク
B1,B2,・・・に直接アクセスしようとすると、そのたびに認証が
必要となってしまう。
(一方、Aを表示させて、そこからB1,B2・・・をマニュアルで
右クリック保存とするなら、パスワード認証を求められない)。
したがって、認証ウィンドウをアクティブにし、Sendkeyでパス
ワードを入力することの繰り返しになってしまう。このやり方は
できれば避けたい。

他方、B1、B2・・・を順々に右クリックして保存するにしても、
これをSendkeyを使ってTABでリンク先を巡回しながら、SHift-F10
等で保存する方法もとりたくない。

ということで、素人の力では万策尽きてしまいました。

XMLを一旦表示させてview-sourceとか、キャッシュをあさりに行く、
とか不細工な方法は思いつくのですが、もうすこしマトモな方法
がないか、ご相談させていただく次第です。

どうか、皆様、よろしくお願い致します。




hanyu さん (stussyworldtribe@kfd.biglobe.ne.jp) 2006年 11月 13日 22時 40分 46秒

すいません。
WSHについて素人なんですが非常に困っておりまして
みなさまどうか助けて頂けないでしょうか?
処理の内容として、
1.XML文書のファイル内の文字列を置換したい。
例)置換前 test.xmlファイル内
テキスト=12345

例)置換後 test.xmlファイル内
テキスト=67890

上記は例になります。
イコールの右側の文字列置換をしたいです。

バッチ処理ではできたのですが、WSHの知識
がなく困り果てております。
どうか教えていただけないでしょうか?
宜しくお願い致します。

saya さん 2006年 11月 12日 01時 00分 36秒

管理人様

初めまして、大変参考になるページ感謝いたします。
いかんせん誠に初心者な為もし頓珍漢な質問をしておりましたら御聞き流し下さい。

あるHPにアクセスし、HP内のあるボタンをクリックして閉じる。といった一連の
動作をさせる場合はバッチやマクロを使うものなのでしょうか?それともWSHを
使うものなのでしょうか? お知恵を拝借出来れば幸いです。

NORIKO さん 2006年 11月 10日 18時 53分 18秒

管理人むたぐち様
文字列から半角英数字を抜き出す方法について質問したNORIKOです。

回答いただいた方法でうまく行くことを確認しました。
とても悩んでいたので、とても助かりました。

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

maru さん (marui7@hotmail.com) 2006年 11月 09日 10時 37分 33秒

はじめまして、maru と申します。

こちらの"Base64エンコード/デコード"を利用して開発中ですが下記2項目で質問があります。

(1) Encode 時に72文字で改行してしまいますが、この値を変更する方法(パラメータ)は無いでしょうか?
(2) str(0) = "12345678901234567890123456789012345678901234567890123" の時のみ68文字で改行してしまいます。(なぜ?)

唐突な質問で恐縮ですが、ヒントが得られれば幸いです。

管理人むたぐち さん 2006年 11月 09日 02時 18分 26秒

To: NORIKO さん

正規表現を使えばいいと思います。
正規表現についてはヘルプを参照してください。
特定のパターンに一致する(しない)文字列を抽出したり
置換したりするのに便利です。

Set RegEx = New RegExp
RegEx.Global = True
RegEx.Pattern = "[^a-zA-Z0-9\-]"
STR = "1asdr @-)?????\\\"
MsgBox RegEx.Replace(STR, "")

-を除去するのかどうかがよくわからなかったのですが、
除去する場合はPatternから\-を抜いてください。

NORIKO さん 2006年 11月 08日 13時 53分 37秒

はじめまして。NORIKOと申します。

文字列から半角英数字(A〜Zと1〜9)だけを抜き出すよい方法が
ございましたら、教えて下さい。
例、
STR = "1asdr @-)?????\\\"
といった変数が有った場合に、半角英数字と-以外を除去して
"1asdr"
としたいです。
今は一文字ずつ読み込んでチェックしているのですが、文字列が
たくさんあるため、処理に時間がかかってしまっています。

以上、よろしくお願いいたします。

こぶら さん 2006年 11月 04日 13時 31分 59秒

管理人むたぐちさん

ありがとうございます。
うまくできました。


管理人むたぐち さん 2006年 11月 04日 00時 33分 14秒

To: YamaKen さん

> 最近リアルにお会いするときは、きまって濃い集まりになってますね...

最近、私が実は濃いキャラだというのが世間に知れ渡っているようで、
薄いキャラを掲示板で演じているのがばれつつあります。

ActiveDirectoryにADO経由でアクセスする話はよく分かっていないのですが、
SQLクエリが投げられるならそこでフィルタをかけられないのでしょうか?
(ADにWMI経由でアクセスするという話かな?だとしたらWQLですよね…
と、ちょっと曖昧ですみませんというか要勉強(汗)

> ◎ レコードセット内のレコード個別に instr で問い合わせ
> ◎ case で分ける(0 ならなんか別のリストに入れておく)

具体的なコードがよくわかりませんが、Forで回してレコード個別にInStrをかけ、
If(かSelect Case)で0かそうじゃないかで分けるという感じでしょうか。

本はいつでもOKですよ〜。



To: こぶら さん

> InputBoxに文字を入力させて、入力文字数が
> ブランクならキャンセルする?ってメッセージを表示
> 8文字以上なら8文字をこえてるよ的なメッセージを表示
> 8文字以下ならExcelを起動

InputBox関数だけではなく、すべての関数には引数と戻り値が厳密に定義されているので、
やみくもに引数を指定してもうまくいかないです。

InputBox関数の戻り値は入力した文字列なので、その文字列で判断するという手を取りましょう。

strImageName = InputBox("イメージ名を入力してね。(8文字まで)")
If strImageName="" Then
     intMsg = MsgBox("キャンセルする?",vbYesNo)
     If intMsg=vbYes Then WScript.Quit
ElseIf Len(strImageName) > 8 Then
     MsgBox "8文字超えてるよ"
Else
     'エクセル実行
End If

てな感じでしょうか。

こぶら さん 2006年 11月 03日 22時 54分 52秒

InputBoxに文字を入力させて、入力文字数が
ブランクならキャンセルする?ってメッセージを表示
8文字以上なら8文字をこえてるよ的なメッセージを表示
8文字以下ならExcelを起動
というスクリプトを作成したいです。

8文字以上でも8文字以下でもExcelが起動しちゃいます。
どんな風にしたらいいのでしょうか。。
下記は途中まで考えたけど分からなくなりましたが乗っけてみます。
 imgname=InputBox("イメージ名を入力してね。(8文字まで)","8")
      If imgname="" Then
       yn = Msgbox("キャンセルするよ。",0)
            If yn=1 Then
              Msgbox "おわり"
         WScript.Quit
            End If
  End If
WshShell.Run("Microsoft Excel")

a3 さん 2006年 10月 31日 13時 03分 19秒

>hgc さん 2006年 10月 21日 15時 31分 59秒

VBS使わなくてもできそうですね。

rasdialコマンドで接続断したらどうでしょうか。
※Window2000以降ならあったはず。

rasdial 接続名 /disconnect

YamaKen さん 2006年 10月 31日 09時 31分 21秒
URL:http://blogs.sqlpassj.org/yamaken/

むたぐちさん:
最近リアルにお会いするときは、きまって濃い集まりになってますね...

なんで Instr と正反対の動きをするモノがほしいかというと、 Active Directory からオブジェクトを拾ってきた結果セット(既にレコードセットになっている)を料理するときに、「特定文字列を含まない」(例えばユーザ名やコンピュータ名、 OU 名などで、予め使っている文字列があるとして、ソイツを含まない)モノ、というのが指定できれば、らくかなぁと。

今やってるコトとしては、

(1) RootDSE 指定(実行環境変えるたびに個別に編集したくないから。)、グローバルカタログ或いは AD そのものに接続

(2) AD に対して、 ADO にて SQL クエリを発行し、オブジェクト一覧をレコードセットとして取得

(3) 特定文字列を「含む」フィルタを掛ける

(4) フィルタ後のオブジェクト個別にプロパティのデータを引き出す

といった感じなのですよ。

> 引数に指定文字が含まれない場合は0を返します

使うとして、

◎ レコードセット内のレコード個別に instr で問い合わせ
◎ case で分ける(0 ならなんか別のリストに入れておく)

というあたりがポイントになるんでしょうかね。

コーディングはかなり、ヘタレなので頓珍漢なコトをヌカしている気もしますが...。

追記: スクリプト本の件、なかなか送れなくてごめん。

管理人むたぐち さん 2006年 10月 31日 07時 22分 02秒

To: YamaKen さん

貴ブログ拝見しております。VBScriptのネタがちらほらあって参考になります。ありがとうございます。

さて本題ですが、Instr関数は引数に指定文字が含まれない場合は0を返します。それで判断できるのではないかと思います。

YamaKen さん 2006年 10月 30日 12時 50分 49秒
URL:http://blogs.sqlpassj.org/yamaken/

vbscript にて、 Instr の逆というか、特定の文字列を「含まない」ようにするのは、どうすればいいんでしょう。

(管理人により削除) さん ((管理人により削除)) 2006年 10月 30日 03時 59分 39秒
URL:(管理人により削除)

(管理人により削除)

(管理人により削除) さん ((管理人により削除)) 2006年 10月 29日 06時 56分 31秒
URL:(管理人により削除)

(管理人により削除)

ちゃっぴ さん 2006年 10月 26日 23時 18分 38秒

てすと

palazzo さん 2006年 10月 26日 17時 09分 29秒
URL:http://homepage2.nifty.com/blu-nero/

> ぼすとん さん 2006年 10月 25日 16時 40分 54秒
こんな感じでどうでしょうか。
他のシェルウィンドウまで閉じて巻き添えを食わすのはあまりにもナンセンスなので、閉じるウィンドウをマイコンピュータに限定しました。

Option Explicit

Dim enmSh  'As SHDocVw.WebBrowser

For Each enmSh In CreateObject("Shell.Application").Windows
  Select Case TypeName(enmSh.Document)
  Case "IShellFolderViewDual"    ''  Explorer
    If enmSh.Document.Folder.Title = "マイ コンピュータ" Then
      enmSh.Quit
    End If
  Case "HTMLDocument"        ''  IE
  Case Else
  End Select
Next


>a3 さん 2006年 10月 25日 16時 20分 05秒
Scriptomaticでプロトタイプを作った割には、ExecQueryのオプションを削除していましたね。失礼致しました。

ぼすとん さん 2006年 10月 25日 16時 40分 54秒

超初心者の質問です。
Windows2000ProでUpdateを繰り返したところ
いつしかマイコンピュータを開く速度が極端に遅くなってしまいました。
ダブルクリックして、2,3秒してから開くという感じです。
MediaPlayer9のセキュリティパッチを削除したらかなり戻りました。
で、定量的に計測をしたくて、マイコンピュータの開く閉じるを100回行って
時間計測をしたいのですが、、、、WSHで開いたフォルダの閉じ方が判りません。。。
ご教授いただけないでしょうか???
----------
Set Win = WScript.CreateObject("Shell.Application")
Win.Open 17 'マイコンピュータを開く
× Win.Close
----------

a3 さん 2006年 10月 25日 16時 20分 05秒

>a3 2006年 10月 23日 20時 06分 41秒

フォルダ自体にはアクセス可能なんだけどACLを表示できないフォルダが
先のやり方では、リストされない件

どうやったら表示されるか、いろいろやってみました。
結果、できたのは以下の2つ。
(1)palazzoさんお勧めのWMIによる方法
---------------------------------------------------------------
Option Explicit

Dim WQL
Dim oSWbemServices
Dim colSWbemObjectSet
Dim oSWbemObject
Dim strComputer
Dim strNamespace

Const wbemFlagReturnImmediately = &H10
Const wbemFlagForwardOnly    = &H20

strComputer = "."
strNamespace = "\root\cimv2"

WQL = ""
WQL = WQL & " SELECT"
WQL = WQL & " *"
WQL = WQL & " FROM Win32_Directory"
WQL = WQL & " WHERE Drive = 'c:'"

Set oSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)

Set colSWbemObjectSet = oSWbemServices.ExecQuery( _
     WQL, _
     , _
     wbemFlagReturnImmediately + wbemFlagForwardOnly _
)

For Each oSWbemObject in colSWbemObjectSet
  WScript.Echo oSWbemObject.Name
Next
---------------------------------------------------------------
WMIで検索の時、ExecQueryの第3引数に
wbemFlagReturnImmediately + wbemFlagForwardOnlyを指定すると
処理が早くなるようです。
(SWbemObject.Clone_メソッドを使わない場合に限る。)

OSがWindows2003とか、XPだと
WQLの中にLIKEが使用できるので絞込みが楽そうですね。

※ウチはWindows2000なので・・・ちょっと面倒。


(2)Microsoft LogParserを使う方法
もともと、Office.FileSearchの代替方法を考えていたので
こんな方法も試してみました。
--------------------------------------------------
Option Explicit

Dim oLogQuery, oFS, oCSV, oRecordSet, oRecord
Dim strQuery, strPath

Set oLogQuery = CreateObject("MsUtil.LogQuery")
Set oFS = CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
'Set oCSV = CreateObject("MSUtil.LogQuery.CSVOutputFormat")

'解析エラーは無視(読み取り権限のないフォルダ・ファイルは無視して処理)
oLogQuery.maxParseErrors = -1

With oFS           '入力設定
 .recurse       = -1  '再帰レベルに制限なし
 .preserveLastAccTime = True 'アクセスしたファイルの最終アクセス時刻を保存
 .useLocalTime    = True 'タイムスタンプフィールドは現地時刻
End With

'With oCSV          '出力設定
' .headers  = "OFF"      'ヘッダー出力なし
' .oDQuotes = "ON"      '項目は常にダブルクォートで括る
' .tabs   = False      'カンマ区切りの後ろにTabを出力しない
' .oTsFormat = "yyyy-MM-dd hh:mm:ss" 'タイムスタンプの出力フォーマット
' .oCodepage = 0        'システムコードページ
' .fileMode = 1        '出力ファイルが存在する時は上書き※標準出力に出すのであまり意味のかな?
'End With

'検索クエリを設定(インタラクティブ)
strQuery = _
 "SELECT Path FROM C:\*.* " & _
 " ORDER BY Path"

'インタラクティブ実行
Set oRecordSet = oLogQuery.Execute(strQuery, oFS)

Do Until oRecordSet.atEnd
 Set oRecord = oRecordSet.getRecord()
 strPath = oRecord.getValue(0)
 WScript.Echo """" & strPath & """"
 
 oRecordSet.moveNext
Loop

oRecordSet.close

'検索クエリを設定(バッチ)
'strQuery = _
' "SELECT Path INTO STDOUT FROM C:\*.* " & _
' " ORDER BY Path"

'バッチ実行
'Call oLogQuery.ExecuteBatch(strQuery, oFS, oCSV)

Set oRecord  = Nothing
Set oRecordSet = Nothing
Set oCSV    = Nothing
Set oFS    = Nothing
Set oLogQuery = Nothing
--------------------------------------------------
せっかくなので、いろいろ試行錯誤した形跡も転記。

処理速度だけみてみると
LogParserのバッチモードが速く感じました。

過去ログにも出てましたけど、LogParserいいですねー。
http://www.microsoft.com/japan/technet/scriptcenter/tools/logparser/default.mspx

まあ、本当に特殊な(変態的な?)例でしたがご参考まで。

(管理人により削除) さん ((管理人により削除)) 2006年 10月 25日 05時 56分 59秒
URL:(管理人により削除)

(管理人により削除)

(管理人により削除) さん ((管理人により削除)) 2006年 10月 25日 00時 10分 37秒
URL:(管理人により削除)

(管理人により削除)

(管理人により削除) さん ((管理人により削除)) 2006年 10月 24日 05時 13分 42秒
URL:(管理人により削除)

(管理人により削除)

a3 さん 2006年 10月 23日 20時 06分 41秒

> 初心者 さん 2006年 10月 19日 16時 23分 52秒

ご意見を参考に試行錯誤してみました。
--------------------------------------------------------
Public Sub ListFolder(obj)
 Dim folder
 On Error Resume Next
 For Each folder In obj.SubFolders
  WScript.Echo folder.Path 'フォルダオブジェクトにアクセスしてみて
  If Err.Number <> 0 Then  'エラーだったら
   Err.Clear        'エラークリアして次のフォルダへ
  Else
   Call ListFolder(folder) 'エラーじゃなければサブフォルダを処理
  End If
 Next
End Sub


'ファイルシステムオブジェクトを作って・・・
Set fso = CreateObject("Scripting.FileSystemObject")
'C:\のフォルダオブジェクトを取得して・・・
Set oDir = fso.GetFolder("C:")

'サブフォルダを全部リストする。
Call ListFolder(oDir)
--------------------------------------------------------
エラー処理のやり方を間違えなければ、いけますね!

…と思ったら、特殊ケース発見。
本当に特殊な(変態的な?)例なんですが、
こんなフォルダがリストされません。

・フォルダ自体にはアクセス可能なんだけどACLを表示できないフォルダ
 ※フォルダのプロパティでセキュリティタブ自体が表示されない

むむむむむ・・・。どうしましょう。
アクセス権限のないフォルダなら、リストされなくてもいいんですけどね。

(管理人により削除) さん ((管理人により削除)) 2006年 10月 23日 03時 31分 32秒
URL:(管理人により削除)

(管理人により削除)

さん 2006年 10月 22日 21時 37分 22秒

あなたがこのテストを気に入ることを約束します。
ちょっと考えて答えてね。
終わったらあなたは笑みがこぼれすっごい幸せになることを保証しちゃうよ。
ちょっとした楽しみ。だけどきちんと問いに従って。
ズルはしてはダメ。クイズを始める前にお願い事をつくって下さい。


注意:読みながらクイズをやること。
問いは4問。
もし終わる前に答えを見たら、このテストの意味はなくなってしまいます。だから答えを見ようと先走らないで。


ゆっくり画面を下にずらし一問ずつやって、ペンと紙を用意して書き残していって下さい。
最後にその答案が必要となります。
偽りのないクイズで、本当の自分を知るでしょう。
>>1.あなたの好きな順に下記の動物を並べて下さい。
>>牛、虎、羊、馬、猿>>


2.次の単語に1つずつイメージを表現して下さい。
>>>>>>犬、猫、ねずみ、海>>>>


3.次の色でイメージする異性人物(相手もあなたを知っている人)を書いて下さい。
>>>>>>さっと書いて考え直さないこと。>>>>>>
黄色、オレンジ、赤、白、緑



4.最後にあなたの好きな数字と週のうちで好きな曜日を答えて下さい。


>>>>>終わりましたか?>>>>

>いいですか、あなたの答えがあなたが本当に何を感じてるか・・・これが最後のチャンスですよ・・・。


>さて、解答です。
>>>ですがその前にもう一度自分のお願い事を確認して下さい。
>>>>>>


1.あなたの優先順位について
牛は、キャリア、職業を意味します。
虎、プライド。
羊、愛。
馬、家庭。
猿、金。


2.犬 あなたの人格について
猫 パートナー、
ねずみ 敵、
海 人生。


3.黄、あなたを決して忘れない人。
オレンジ、あなたが密かに好きな人。
赤、あなたが本当に好きな人。
白、あなたの事が好きな人。
緑、あなたが今後の人生でいつも思い出す人。


4.あなたは、あなたが答えた数字分これを知らせなければなりま

ん。
するとあなたのお願い事はあなたの言った曜日にかなうでしょう

hgc さん 2006年 10月 21日 15時 31分 59秒

初心者です。ダイヤルアップで接続中に回線を切断したいのですが、vbsでできますか?モデムの設定では数分内には切断できますがすぐに切断したいのです。よろしくお願いします。

管理人むたぐち さん 2006年 10月 19日 23時 57分 35秒

VBScript 逆引き大全 500の極意 WindowsXP/2000対応 コンピュータ書籍専門ネット書店 cbook24
http://www.cbook24.com/bm_detail.asp?sku=479801379X

という本が出ていたので買いました〜。
またレビューしたいと思いますが、OfficeやADOに多くのページが割かれているのでいいですね。

初心者 さん 2006年 10月 19日 16時 23分 52秒

palazzo さん、ありがとうございます。

a3 さん、
>※FileSystemObjectで全フォルダなめる処理は、
> アクセス不可フォルダがあるとそこで処理がとまってしまい
> そこで処理スキップができないのであまりうれしくないのです。

初心者は無理やり進めちゃいますが。。。
ダメですよね...
  Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
  Set objDir = Fs.GetFolder("E:")
  Set objFile = objDir.Files

  On Error Resume Next
  For Each fl1 In objFile
    If Err.Number > 0 Then
      msgbox ("アクセスNG")
    Else
      On Error GoTo 0
      msgbox ("アクセスOK")  'ここで何とか処理
      On Error Resume Next
    End IF
  Next
  msgbox ("終了")


a3 さん 2006年 10月 19日 12時 23分 55秒

Office.FileSearchの件。

ウチはWindows2000Proなのですが

>同じネットワークにあるファイルサーバのエクセルファイルも
>UNC表記でリストされる。
これ、マイネットワークの実体が
C:\Documents and Settings\(ユーザ名)\NetHoodだからかもしれません。
※そういわれれば、C:\以下ですね。
あと、フォルダのショートカットを作ってると、重複がでるような気が。
しかし、条件がよくわかりません。

・フィルタリングするのも面倒
・重複する条件もはっきりしない
・Officeって有料ですから、無料のツールでできないかしら?

Office.FileSearchを使おうと思ったきっかけは
C:\System Volume Information等が入っていてもスキップしてくれることだったのですが、これでは別解を考えた方がよさげですね。

※FileSystemObjectで全フォルダなめる処理は、
 アクセス不可フォルダがあるとそこで処理がとまってしまい
 そこで処理スキップができないのであまりうれしくないのです。

palazzo さん 2006年 10月 18日 15時 43分 01秒
URL:http://homepage2.nifty.com/blu-nero/

>>初心者 さん 2006年 10月 17日 11時 33分 07秒
>
>FSOでは無理ですが、OfficeのFileSearchクラスを使用するといいのでは?もちろん何らかのOffice製品
>がインストールされていなければなりませんが・・・。こちらを使用すると、FSOでアクセスで引っ掛かった
>フォルダ内も問題なく検索できました。

追記です。OfficeのFileSearchクラスはバグがあるので、結果をフィルタリングする必要があります。例えば、Shell.dllという明らかに完全一致のパターンで検索しても、なぜかShell32.dllというファイルまで拾ってきてしまいます。こういう場合は自作ロジックで再度フィルタリングする必要があります。
a3 さんの件ですが、UNC表記によるネットワークパス,もしくはエクスプローラによって割り当てられたネットワークドライブに対しては確かにファイルが複数抽出されることが確認できました。現状では列挙されたファイルを配列に取って、要素が増える度に重複チェックを行い、重複アイテムは除外するしかないのではないでしょうか。もう1件の問題である、

>同じネットワークにあるファイルサーバのエクセルファイルも
> UNC表記でリストされる。

は仕様というかバグになるんでしょうかねえ・・・。
という訳で、スクリプトレベルで確実にファイル検索を行うなら、WMIから行うのがベターでしょうか。
少々重いのとフィルタリングしてもフロッピードライブまでなめるため、「ブッ」という音がいちいちやかましいのが難点ですが・・・。
処理はこんな感じです。

Option Explicit

On Error Resume Next:

Const DEF_MACHINE = "."    'As String

Dim colFiles  'As WbemScripting.SWbemObjectSet
Dim objFile   'As WbemScripting.SWbemObject

Dim WQL     'As String

''  「¥」は2つ並べて下さい。
WQL = ""
WQL = WQL & " SELECT"
WQL = WQL & " *"
WQL = WQL & " FROM CIM_DATAFILE"
WQL = WQL & " WHERE DRIVE = 'c:'"
WQL = WQL & " AND PATH = '\\winnt\\'"
WQL = WQL & " AND EXTENSION = 'dll'"

Set colFiles = CreateObject("WbemScripting.SWbemLocator").ConnectServer(DEF_MACHINE, "root\cimv2").ExecQuery(WQL)
  
For Each objFile in colFiles
  WScript.Echo objFile.Name
Next


Return