プロが教えるわが家の防犯対策術!

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

A 回答 (2件)

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
のようにします。
    • good
    • 0

"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/cformwsh1 …

余談ですが時間稼ぎに Ping ・・・・を使われていますが
Wscript.Sleep でも大丈夫かと
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh1 …

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/cformwsh0 …

以上まとまりのない回答になってしまいましたが、
ご自身で頑張るタイプの方のようですので
組み立てていってみてください。

この回答への補足

Wscript.Sleepは知りませんでした・・・。
しかしリンク先を見ていると、Wscript.Sleep実行中にCPUに何らかのイベントが割り込んできた時、割り込まれた時間分、遅延していくように思えます。
これを実行するのがWindows起動直後を想定しているのでふてきとうかなぁと思った次第で・・・。

CreateObject("WScript.Shell").Run """" & program_name & """"

の部分ですが、なぜ& &でくくるのでしょうか?
それと " は3つでいいのではないでしょうか?

補足日時:2013/06/09 18:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!