(管理人により削除)
>>palazzo さん
ご回答ありがとうございました。
おかげさまで、うまくいきました。
恥ずかしながら、今回WMIというものを初めて知りました。
ご提示いただいたサンプルコードをもとに、
これからじっくり勉強してみたいと思います。
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」で検索するとたくさんヒットするので、そちらも参考にしてみて下さい。
初めまして。質問させていただきます。
あるアプリケーションが起動しているかどうかを判断するにはどうすればいいのでしょうか。
具体的には、Excelが立ち上がっていれば、「終了してください」とメッセージを出したいのです。
どなたかご教授いただければと思います。よろしくお願いします。
WSH Lab.管理人様へ
11月17日に質問させていただいたNORIKOです。
掲示板にすぐ反映されなかったため、間違えて3回投稿
してしまいました。
大変申し訳ございませんが、17日の9:41と10:17の投稿の
削除をお願いします。
申し訳ございませんでした。
>palazzoさん
palazzoさんのを参考にユーザーからの入力機構を設け、無事に作成が終わりました。
おっしゃられたように、オブジェクトブラウザで探してみましたが、意外な発見で面白かったです。
VBAについては全く勉強していなかったんで、抜けていました。
後は、Excel内のマクロ内のリンク修正が出来れば……と考えて思考中です。
……考えたら、セキュリティ的に外部スクリプトからExcelマクロの修正って出来るのかなっと、そこから調べたいと思います。
不特定多数が利用想定なので、セキュリティ設定が関わってたらお手上げですし……。
何はともあれ、palazzoさん、ありがとうございます!
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を起動する方法を教えて下さい。
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スクリプトを実行する方法を教えて下さい。
今、
●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)はバックグランドで実行させ
たいです(画面を起動しない)。
以上、よろしくお願いいたします。
HTAで戻るのボタンを作るにはどうしたらいいのですか?トーシロですいません!
管理人むたぐち様
アドバイスありがとうございます。
こんな便利な物があるなんて、知りませんでした。
DOSとWSHとHTMLが同時に使用できるとは。。。
勉強が大変ですが、がんばってみます。
それでは、失礼します。
To: ルビー さん 2006年 11月 15日 18時 44分 19秒
確かにWSHでOfficeを大々的に扱っているのは Microsoft Script Center 以外にはあまりありません。だから OfficeVBA のサイトを読み替えてコーディングするしかないです。ただOffice系のオブジェクトの頭は結構省略形で記述されている(頭にExcel.Application.xxxと几帳面にフルに記述する人はそうそういません)ので、Officeのオブジェクトブラウザを見てオブジェクトの構造をきちんと理解していないと意外とハマる恐れはありますね。しかし、それがきちんと出来る人ならば、OfficeVBAのサイトでも、そこは宝の山です。もちろんこれは他のオブジェクト、例えばWMIにしてもしかり。
すいません、二重投稿に……。
管理人さん、お手数ですが片方だけ削除お願い致します。
palazzoさん、ありがとうございます。
明日にでも、自分のスクリプトと組み合わせて試行したいと思います。
私も精進していきたいと思います。
……余談ですが、Excel操作系のWSH関連のHPって少ないんですかね……。
それとも私の探し方が悪いだけなのか……orz
palazzoさん、ありがとうございます。
明日にでも、自分のスクリプトと組み合わせて試行したいと思います。
私も精進していきたいと思います。
……余談ですが、Excel操作系のWSH関連のHPって少ないんですかね……。
それとも私の探し方が悪いだけなのか……orz
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などを検討してみるほうがいいかもしれません。
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
初めまして。
こちらには何度かお世話になっております。
色々ネットを探したり、コードを書いてみたりしたのですが、行き詰まってしまい……。
皆様の知恵を頂ければと思い、投稿致しました。
教えて頂けると幸いです。
不特定多数のExcelファイル(シート数もバラバラです)があります。
これらの中で使われているハイパーリンク先のみを調査、場合によっては変更したいのです。
(例えば"\\HELLO\HP\index.htm"を"\\WORLD\HP\index.htm"等)
VBS/WSHで出来れば……と考えているのですが、ハイパーリンク先の取得方法がわかりません。
HTMLに一度直してしまえばタグ指定でいけるとは思うのですが、出来る限りExcelのままでと考えています。
また、ドラッグ&ドロップで出来れば幸いですが、まあフォルダ配下(サブフォルダ含め)のExcelを全部調べてもいいかなとそこは妥協しております。
詰まるところ、ファイルサーバのコンピュータ名を変えた時に、そこに格納されているファイルへExcelファイル(or マクロ)内でリンクを張っている場合はまずいので対策……って事なのです。
相対であれば問題ないのですけど……orz
長々と申し訳ございません。
ヒントでも頂けると幸いです。
どうも、はじめまして。
DOSでツールっぽいのを作成したのですが、
会社の若い奴がCUI環境が嫌だというんです。
そこで、WSHでGUI環境作ろうかと思うのですが
batやコマンドの引数にWSHの変数を引き渡す事は可能でしょうか?
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とか、キャッシュをあさりに行く、
とか不細工な方法は思いつくのですが、もうすこしマトモな方法
がないか、ご相談させていただく次第です。
どうか、皆様、よろしくお願い致します。
すいません。
WSHについて素人なんですが非常に困っておりまして
みなさまどうか助けて頂けないでしょうか?
処理の内容として、
1.XML文書のファイル内の文字列を置換したい。
例)置換前 test.xmlファイル内
テキスト=12345
例)置換後 test.xmlファイル内
テキスト=67890
上記は例になります。
イコールの右側の文字列置換をしたいです。
バッチ処理ではできたのですが、WSHの知識
がなく困り果てております。
どうか教えていただけないでしょうか?
宜しくお願い致します。
管理人様
初めまして、大変参考になるページ感謝いたします。
いかんせん誠に初心者な為もし頓珍漢な質問をしておりましたら御聞き流し下さい。
あるHPにアクセスし、HP内のあるボタンをクリックして閉じる。といった一連の
動作をさせる場合はバッチやマクロを使うものなのでしょうか?それともWSHを
使うものなのでしょうか? お知恵を拝借出来れば幸いです。
管理人むたぐち様
文字列から半角英数字を抜き出す方法について質問したNORIKOです。
回答いただいた方法でうまく行くことを確認しました。
とても悩んでいたので、とても助かりました。
ありがとうございました。
はじめまして、maru と申します。
こちらの"Base64エンコード/デコード"を利用して開発中ですが下記2項目で質問があります。
(1) Encode 時に72文字で改行してしまいますが、この値を変更する方法(パラメータ)は無いでしょうか?
(2) str(0) = "12345678901234567890123456789012345678901234567890123" の時のみ68文字で改行してしまいます。(なぜ?)
唐突な質問で恐縮ですが、ヒントが得られれば幸いです。
To: NORIKO さん
正規表現を使えばいいと思います。
正規表現についてはヘルプを参照してください。
特定のパターンに一致する(しない)文字列を抽出したり
置換したりするのに便利です。
Set RegEx = New RegExp
RegEx.Global = True
RegEx.Pattern = "[^a-zA-Z0-9\-]"
STR = "1asdr @-)?????\\\"
MsgBox RegEx.Replace(STR, "")
-を除去するのかどうかがよくわからなかったのですが、
除去する場合はPatternから\-を抜いてください。
はじめまして。NORIKOと申します。
文字列から半角英数字(A〜Zと1〜9)だけを抜き出すよい方法が
ございましたら、教えて下さい。
例、
STR = "1asdr @-)?????\\\"
といった変数が有った場合に、半角英数字と-以外を除去して
"1asdr"
としたいです。
今は一文字ずつ読み込んでチェックしているのですが、文字列が
たくさんあるため、処理に時間がかかってしまっています。
以上、よろしくお願いいたします。
管理人むたぐちさん
ありがとうございます。
うまくできました。
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
てな感じでしょうか。
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")
>hgc さん 2006年 10月 21日 15時 31分 59秒
VBS使わなくてもできそうですね。
rasdialコマンドで接続断したらどうでしょうか。
※Window2000以降ならあったはず。
rasdial 接続名 /disconnect
むたぐちさん:
最近リアルにお会いするときは、きまって濃い集まりになってますね...
なんで Instr と正反対の動きをするモノがほしいかというと、 Active Directory からオブジェクトを拾ってきた結果セット(既にレコードセットになっている)を料理するときに、「特定文字列を含まない」(例えばユーザ名やコンピュータ名、 OU 名などで、予め使っている文字列があるとして、ソイツを含まない)モノ、というのが指定できれば、らくかなぁと。
今やってるコトとしては、
(1) RootDSE 指定(実行環境変えるたびに個別に編集したくないから。)、グローバルカタログ或いは AD そのものに接続
(2) AD に対して、 ADO にて SQL クエリを発行し、オブジェクト一覧をレコードセットとして取得
(3) 特定文字列を「含む」フィルタを掛ける
(4) フィルタ後のオブジェクト個別にプロパティのデータを引き出す
といった感じなのですよ。
> 引数に指定文字が含まれない場合は0を返します
使うとして、
◎ レコードセット内のレコード個別に instr で問い合わせ
◎ case で分ける(0 ならなんか別のリストに入れておく)
というあたりがポイントになるんでしょうかね。
コーディングはかなり、ヘタレなので頓珍漢なコトをヌカしている気もしますが...。
追記: スクリプト本の件、なかなか送れなくてごめん。
To: YamaKen さん
貴ブログ拝見しております。VBScriptのネタがちらほらあって参考になります。ありがとうございます。
さて本題ですが、Instr関数は引数に指定文字が含まれない場合は0を返します。それで判断できるのではないかと思います。
vbscript にて、 Instr の逆というか、特定の文字列を「含まない」ようにするのは、どうすればいいんでしょう。
(管理人により削除)
(管理人により削除)
てすと
> ぼすとん さん 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のオプションを削除していましたね。失礼致しました。
超初心者の質問です。
Windows2000ProでUpdateを繰り返したところ
いつしかマイコンピュータを開く速度が極端に遅くなってしまいました。
ダブルクリックして、2,3秒してから開くという感じです。
MediaPlayer9のセキュリティパッチを削除したらかなり戻りました。
で、定量的に計測をしたくて、マイコンピュータの開く閉じるを100回行って
時間計測をしたいのですが、、、、WSHで開いたフォルダの閉じ方が判りません。。。
ご教授いただけないでしょうか???
----------
Set Win = WScript.CreateObject("Shell.Application")
Win.Open 17 'マイコンピュータを開く
× Win.Close
----------
>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月 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を表示できないフォルダ
※フォルダのプロパティでセキュリティタブ自体が表示されない
むむむむむ・・・。どうしましょう。
アクセス権限のないフォルダなら、リストされなくてもいいんですけどね。
(管理人により削除)
あなたがこのテストを気に入ることを約束します。
ちょっと考えて答えてね。
終わったらあなたは笑みがこぼれすっごい幸せになることを保証しちゃうよ。
ちょっとした楽しみ。だけどきちんと問いに従って。
ズルはしてはダメ。クイズを始める前にお願い事をつくって下さい。
注意:読みながらクイズをやること。
問いは4問。
もし終わる前に答えを見たら、このテストの意味はなくなってしまいます。だから答えを見ようと先走らないで。
ゆっくり画面を下にずらし一問ずつやって、ペンと紙を用意して書き残していって下さい。
最後にその答案が必要となります。
偽りのないクイズで、本当の自分を知るでしょう。
>>1.あなたの好きな順に下記の動物を並べて下さい。
>>牛、虎、羊、馬、猿>>
2.次の単語に1つずつイメージを表現して下さい。
>>>>>>犬、猫、ねずみ、海>>>>
3.次の色でイメージする異性人物(相手もあなたを知っている人)を書いて下さい。
>>>>>>さっと書いて考え直さないこと。>>>>>>
黄色、オレンジ、赤、白、緑
4.最後にあなたの好きな数字と週のうちで好きな曜日を答えて下さい。
>>>>>終わりましたか?>>>>
>いいですか、あなたの答えがあなたが本当に何を感じてるか・・・これが最後のチャンスですよ・・・。
>さて、解答です。
>>>ですがその前にもう一度自分のお願い事を確認して下さい。
>>>>>>
1.あなたの優先順位について
牛は、キャリア、職業を意味します。
虎、プライド。
羊、愛。
馬、家庭。
猿、金。
2.犬 あなたの人格について
猫 パートナー、
ねずみ 敵、
海 人生。
3.黄、あなたを決して忘れない人。
オレンジ、あなたが密かに好きな人。
赤、あなたが本当に好きな人。
白、あなたの事が好きな人。
緑、あなたが今後の人生でいつも思い出す人。
4.あなたは、あなたが答えた数字分これを知らせなければなりま
ん。
するとあなたのお願い事はあなたの言った曜日にかなうでしょう
初心者です。ダイヤルアップで接続中に回線を切断したいのですが、vbsでできますか?モデムの設定では数分内には切断できますがすぐに切断したいのです。よろしくお願いします。
VBScript 逆引き大全 500の極意 WindowsXP/2000対応 コンピュータ書籍専門ネット書店 cbook24
http://www.cbook24.com/bm_detail.asp?sku=479801379X
という本が出ていたので買いました〜。
またレビューしたいと思いますが、OfficeやADOに多くのページが割かれているのでいいですね。
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 ("終了")
Office.FileSearchの件。
ウチはWindows2000Proなのですが
>同じネットワークにあるファイルサーバのエクセルファイルも
>UNC表記でリストされる。
これ、マイネットワークの実体が
C:\Documents and Settings\(ユーザ名)\NetHoodだからかもしれません。
※そういわれれば、C:\以下ですね。
あと、フォルダのショートカットを作ってると、重複がでるような気が。
しかし、条件がよくわかりません。
・フィルタリングするのも面倒
・重複する条件もはっきりしない
・Officeって有料ですから、無料のツールでできないかしら?
Office.FileSearchを使おうと思ったきっかけは
C:\System Volume Information等が入っていてもスキップしてくれることだったのですが、これでは別解を考えた方がよさげですね。
※FileSystemObjectで全フォルダなめる処理は、
アクセス不可フォルダがあるとそこで処理がとまってしまい
そこで処理スキップができないのであまりうれしくないのです。
>>初心者 さん 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