質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

2回答

5737閲覧

バッチにより特定のVBSのPIDを取得したい

himrock

総合スコア13

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2018/09/10 13:05

前提・実現したいこと

バッチを使用して、実行中のVBSのPIDを取得したい。Windows10使用。

例えば、A.vbsとB.vbsが実行中の時にバッチを実行して、B.vbsのPIDを取得したい。
最終的にそのPIDを使用してそのプロセスをkillする事が目的です。

発生している問題・エラーメッセージ

tasklist /FI "IMAGENAME eq wscript.exe"を使用しましたが、

イメージ名 PID セッション名 セッション# メモリ使用量 ========================= ======== ================ =========== ============ wscript.exe 16080 Console 1 14,332 K wscript.exe 16016 Console 1 14,328 K

得られる情報は以上のみで、どちらのwscript.exeがB.vbsを実行しているか判断できません。

バッチを使用してB.vbsを実行するwscript.exeのPIDを調べる方法は無いでしょうか。
バッチが無理な場合、VBScriptでは可能でしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

KILLすることまで考えると、VBScriptを使うのが簡単です。

VBScript

1for each p in GetObject("winmgmts:{impersonationLevel=impersonate}"). _ 2 ExecQuery("select * from Win32_Process where CommandLine Like '%wscript.exe%foo.vbs%'") 3 WScript.Echo p.CommandLine, p.ProcessId 4 p.Terminate 5next

バッチでやるのだと、WMIC process where (commandline like "%WScript.exe%foo.vbs%") get processidでいいかと思ったのですが、WMIC自体も引っかかってしまいますので面倒。

CMD

1@echo off 2WMIC process where (commandline like "%%WScript.exe%%foo.vbs%%") get commandline,processid | findstr /v WMIC | findstr vbs > work.txt 3for /f "tokens=3" %%A in (work.txt) do ( 4 echo %%A 5 taskkill /pid %%A 6)

foo.vbsのパス名に空白がある場合は、tokes=3を調整要。

ちょっと乱暴ですが、KILLするのが目的なら、これもあり。taskkillでエラーが出るけど無視。

CMD

1for /f %%A in ('wmic process where ^(commandline like "%%wscript.exe%%foo.vbs%%"^) get processid') do taskkill /pid %%A 2>NUL

投稿2018/09/10 15:57

編集2018/09/10 16:23
otn

総合スコア84553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

himrock

2018/09/10 22:38

回答ありがとうございます。 確かにVBScriptの方が楽そうですが、バッチを使用した方法も用意して頂き助かりました。 WMICを使った事が無かったのですが、これを覚えればバッチでできる事の幅が広がりそうです。 勉強になりました。
guest

0

Windows Management Instrumentation(WMI)」を使用すると、プロセスのコマンドラインを取得できるため、
「コマンドラインの中にB.vbsが含まれているかどうか」程度の判定であれば可能です。

WMIの操作はバッチからも、VBScript(COM)からも、どちらからでも行えます。

バッチから操作する場合はWMIC.exeを使用します。
私はちゃんと使ったことが無いので割愛しますが、以下の記事が参考になると思います。

Windows がなんか重いときにコマンドで調べる(WMIC PROCESS) - Qiita


COMから操作する場合はMicrosoft WMI Scripting V1.2 Libraryを使用します。
以下はVBScriptの場合のサンプルです。

VBScript

1Option Explicit 2 3'https://teratail.com/questions/145888 4Call Sample_KillProcess_teratail_Q145888 5 6Sub Sample_KillProcess_teratail_Q145888() 7 8 'Win32_Process から 9 'Nameが'wscript.exe'かつCommandLineに'b.vbs'が含まれるものを探し 10 'ProcessId と CommandLine を取得する 11 '[WQLクエリステートメントの紹介 - WMI Reference](http://www.wmifun.net/reference/wql_query_statement.html) 12 Dim wql 13 wql = "SELECT ProcessId, CommandLine " 14 wql = wql & "FROM Win32_Process " 15 wql = wql & "WHERE Name = 'wscript.exe' AND CommandLine LIKE '%b.vbs%'" 16 17 18 'WbemScripting = Microsoft WMI Scripting V1.2 Library 19 Dim locator 'As WbemScripting.SWbemLocator 20 Set locator = CreateObject("WbemScripting.SWbemLocator") 21 22 'ローカル端末に接続し検索 23 Dim proc 'As WbemScripting.SWbemObject 24 For Each proc In locator.ConnectServer().ExecQuery(WQL) 25 '[[WMI Class] Win32_Process クラス - WMI Library](http://www.wmifun.net/library/win32_process.html) 26 Dim cmdLnTxt 27 cmdLnTxt = proc.Properties_.Item("CommandLine").Value 28 Dim pId 29 pId = proc.Properties_.Item("ProcessId").Value 30 31 Dim msg 32 msg = "ProcessId = " & pId & vbLf & _ 33 "CommandLine = " & cmdLnTxt & vbLf & _ 34 "kill ok ?" 35 36 If MsgBox(msg, vbQuestion Or vbOKCancel) = vbOK Then 37 '[[WMI for VB6] WMI のメソッドを使ってみよう - WMI Step](http://www.wmifun.net/step/vb6_04.html) 38 Call proc.Terminate 39 End If 40 41 Next 'proc 42 43End Sub

投稿2018/09/10 15:22

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問