バッチにより特定のVBSのPIDを取得したい
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 7,577
前提・実現したいこと
バッチを使用して、実行中の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では可能でしょうか。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
KILLすることまで考えると、VBScriptを使うのが簡単です。
for each p in GetObject("winmgmts:{impersonationLevel=impersonate}"). _
ExecQuery("select * from Win32_Process where CommandLine Like '%wscript.exe%foo.vbs%'")
WScript.Echo p.CommandLine, p.ProcessId
p.Terminate
next
バッチでやるのだと、WMIC process where (commandline like "%WScript.exe%foo.vbs%") get processid
でいいかと思ったのですが、WMIC自体も引っかかってしまいますので面倒。
@echo off
WMIC process where (commandline like "%%WScript.exe%%foo.vbs%%") get commandline,processid | findstr /v WMIC | findstr vbs > work.txt
for /f "tokens=3" %%A in (work.txt) do (
echo %%A
taskkill /pid %%A
)
foo.vbs
のパス名に空白がある場合は、tokes=3
を調整要。
ちょっと乱暴ですが、KILLするのが目的なら、これもあり。taskkill
でエラーが出るけど無視。
for /f %%A in ('wmic process where ^(commandline like "%%wscript.exe%%foo.vbs%%"^) get processid') do taskkill /pid %%A 2>NUL
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
「Windows Management Instrumentation(WMI)」を使用すると、プロセスのコマンドラインを取得できるため、
「コマンドラインの中にB.vbs
が含まれているかどうか」程度の判定であれば可能です。
WMIの操作はバッチからも、VBScript(COM)からも、どちらからでも行えます。
バッチから操作する場合はWMIC.exe
を使用します。
私はちゃんと使ったことが無いので割愛しますが、以下の記事が参考になると思います。
COMから操作する場合はMicrosoft WMI Scripting V1.2 Library
を使用します。
以下はVBScriptの場合のサンプルです。
Option Explicit
'https://teratail.com/questions/145888
Call Sample_KillProcess_teratail_Q145888
Sub Sample_KillProcess_teratail_Q145888()
'Win32_Process から
'Nameが'wscript.exe'かつCommandLineに'b.vbs'が含まれるものを探し
'ProcessId と CommandLine を取得する
'[WQLクエリステートメントの紹介 - WMI Reference](http://www.wmifun.net/reference/wql_query_statement.html)
Dim wql
wql = "SELECT ProcessId, CommandLine "
wql = wql & "FROM Win32_Process "
wql = wql & "WHERE Name = 'wscript.exe' AND CommandLine LIKE '%b.vbs%'"
'WbemScripting = Microsoft WMI Scripting V1.2 Library
Dim locator 'As WbemScripting.SWbemLocator
Set locator = CreateObject("WbemScripting.SWbemLocator")
'ローカル端末に接続し検索
Dim proc 'As WbemScripting.SWbemObject
For Each proc In locator.ConnectServer().ExecQuery(WQL)
'[[WMI Class] Win32_Process クラス - WMI Library](http://www.wmifun.net/library/win32_process.html)
Dim cmdLnTxt
cmdLnTxt = proc.Properties_.Item("CommandLine").Value
Dim pId
pId = proc.Properties_.Item("ProcessId").Value
Dim msg
msg = "ProcessId = " & pId & vbLf & _
"CommandLine = " & cmdLnTxt & vbLf & _
"kill ok ?"
If MsgBox(msg, vbQuestion Or vbOKCancel) = vbOK Then
'[[WMI for VB6] WMI のメソッドを使ってみよう - WMI Step](http://www.wmifun.net/step/vb6_04.html)
Call proc.Terminate
End If
Next 'proc
End Sub
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/09/11 07:38
確かにVBScriptの方が楽そうですが、バッチを使用した方法も用意して頂き助かりました。
WMICを使った事が無かったのですが、これを覚えればバッチでできる事の幅が広がりそうです。
勉強になりました。