- 締切済み
vbsでループさせる
vbsでループさせる http://nagabuchi.jugem.jp/?eid=237 で作ったバッチで常駐ソフト(自分はSkydriveとかのクラウドサービス)の起動を遅らせる事ができるようになり、めでたしめでたしなんですが、 セキュリティソフト(KasperskyInternetSecurity2013)より先に常駐ソフトが立がるのは問題だろうと思い、 上記URLで作成する.vbsを改良しようと思いました。 http://q.hatena.ne.jp/1203153427 を参考に以下に示すような感じに変更してみたものの、CreateObjectの行がうまくいきません。 KasperskyInternetSecurity2013 (実行ファイルはC:\Program Files (x86)\Kaspersky Lab\Kaspersky Internet Security 2013にあるavp.exe) が起動した後にstartup.batを起動するにはどうすればいいでしょうか? wait9s.batの中身 ping -n 9 127.0.0.1 > nul 問題の.vbsファイル Sub StartAfterKaspersky() Const program_name = "avp.exe" Dim x For x = 1 To 10 If processCheck(program_name) = Ture Then CreateObject("WScript.Shell")ws.run "cmd /c startup.bat",vbhide Else CreateObject("WScript.Shell")ws.run "cmd /c wait9s.bat",vbhide End If Next MsgBox "27秒も待ったのに、Kasperskyが起動しません。強制起動します。" CreateObject("WScript.Shell").Run program_name End Sub '//------------------------------------------------ ' プロセスが動いているかチェックする関数 '//------------------------------------------------ Function processCheck( pName ) '//------------------------------------------------ processCheck = False Dim objPWMI On Error Resume Next Set objPWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\localhost\root\cimv2") Err.Clear On Error GoTo 0 If Err.Number <> 0 Then Exit Function '接続できなかったら、終了 Dim colProc Set colProc = objPWMI.ExecQuery("Select * from Win32_Process WHERE Name='" & pName & "'") If colProc.Count > 0 Then processCheck = True End Function
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- queuerev2
- ベストアンサー率78% (96/122)
CreateObject("WScript.Shell")ws.run "cmd /c startup.bat",vbhide CreateObject("WScript.Shell")ws.run "cmd /c wait9s.bat",vbhide の2行ですが、wsというのは転記間違いでしょうか? もしエラーのでるファイルにそのまま書いてあるなら、おそらくそれがエラーの原因でしょう。 対策ですが、以下のようにwsを削除します。 CreateObject("WScript.Shell").run "cmd /c startup.bat",vbhide さらに付け加えるなら、CreateObject("WScript.Shell")を3つ書いても動くとは思いますが、CreateObjectで精製したオブジェクトを変数に入れて使いまわす方法の方がよく使われると思います。 つまり、最初の方で Dim ws Set ws=CreateObject("WScript.Shell") と書いておいて、CreateObject("WScript.Shell")のかわりにwsにします。 たとえば、 ws.run "cmd /c startup.bat",vbhide のようにします。
- nicotinism
- ベストアンサー率70% (1019/1452)
"cmd /c startup.bat" "cmd /c wait9s.bat" CreateObject("WScript.Shell").Run program_name C:\Program Files (x86)\Kaspersky Lab\Kaspersky Internet Security 2013にあるavp.exe startup.bat、wait9s.bat、avp.exe を実行させるためには Pathが通っている場所にあるか カレントディレクトリがその場所にあるか フルパスで指定する。 のいずれかが必要です。 どれが一番一般的かはわかりませんが、フルパスで指定する場合は "cmd /c c:\users\Nicotinism\startup.bat" などとします。 カスペルスキーの場合は Const program_name = "C:\Program Files (x86)\Kaspersky Lab\Kaspersky Internet Security 2013\avp.exe" としておいて、またPathにスペースが含まれているので Shellで起動させるためにはダブルクォーテーションでくくる必要があります。 CreateObject("WScript.Shell").Run """" & program_name & """" http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh12/cformwsh12_01.html 余談ですが時間稼ぎに Ping ・・・・を使われていますが Wscript.Sleep でも大丈夫かと http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh11/cformwsh11_02.html For x = 1 To 10 If processCheck(program_name) = Ture Then CreateObject("WScript.Shell")ws.run "cmd /c startup.bat",vbhide Else CreateObject("WScript.Shell")ws.run "cmd /c wait9s.bat",vbhide End If Next だとTrueの場合に10回繰り返してしまいますので 一回でもTrueだったらWscript.quitで抜け出す必要があります。 2番目のリンク参照 それに何回もCreateObjectを繰り返すのは非効率なのでFor Next ループなら Dim Ws Set Ws = createobject("wscript.Shell") For x = 1 To 10 If processCheck("avp.exe") = Ture Then '決め打ちしちゃってます ゴメン ws.run "cmd /c startup.bat",vbhide wscript.quit Else ws.run "cmd /c wait9s.bat",vbhide End If Next さらに欲を言えば、startup.bat を使わないでVBSだけで完結したほうが後々楽かも? http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh07/cformwsh07_01.html 以上まとまりのない回答になってしまいましたが、 ご自身で頑張るタイプの方のようですので 組み立てていってみてください。
補足
Wscript.Sleepは知りませんでした・・・。 しかしリンク先を見ていると、Wscript.Sleep実行中にCPUに何らかのイベントが割り込んできた時、割り込まれた時間分、遅延していくように思えます。 これを実行するのがWindows起動直後を想定しているのでふてきとうかなぁと思った次第で・・・。 CreateObject("WScript.Shell").Run """" & program_name & """" の部分ですが、なぜ& &でくくるのでしょうか? それと " は3つでいいのではないでしょうか?