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件)
- 最新から表示
- 回答順に表示
No.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
のようにします。
No.1
- 回答日時:
"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つでいいのではないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) モードレスでユーザーフォームが開け(表示)ません。 4 2022/09/09 11:05
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイル 特定ウインドウ...
-
ExcelVBAにてアプリをタスクマ...
-
batファイルで立ち上げたaplを...
-
UWSCについて
-
WordpadとWrite
-
c#でコマンドプロンプトを実行...
-
EXCELをバッチコマンドで...
-
stable diffusionのインストー...
-
batからvbs起動
-
秀丸でソフトをコマンドライン...
-
プログラムを実行すると、なぜ...
-
createprocessで起動させる別.e...
-
64bitのwindowsサーバーで32bit...
-
VBSでコマンドプロンプトのカレ...
-
ショートカットの作成とコピー
-
exe間での引き値の受け取り方法
-
DOS窓の非表示について
-
VB.NETでDOSコマンドの複数実行
-
バッチへ値を返す
-
DOSプロンプトからエクセルを実...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイル 特定ウインドウ...
-
stable diffusionのインストー...
-
ExcelVBAにてアプリをタスクマ...
-
EXCELをバッチコマンドで...
-
ショートカットの作成とコピー
-
VB.NETでDOSコマンドの複数実行
-
gccがコマンドプロンプト上で使...
-
バッチファイル実行時に起動す...
-
VBAからキャッシュを削除する方...
-
c#でコマンドプロンプトを実行...
-
batファイルで立ち上げたaplを...
-
64bitのwindowsサーバーで32bit...
-
Shiftキーを押しながら起動
-
VB.NETでコマンドプロンプトの操作
-
Visual basic6.0からショートカ...
-
exe間での引き値の受け取り方法
-
プログラムを実行すると、なぜ...
-
相対パスのショートカットフォ...
-
PL/SQLで作成したストア...
-
バッチへ値を返す
おすすめ情報