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

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

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

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

Q&A

解決済

3回答

23230閲覧

VBScript すでに動いている.vbsへの関与

i_zac8132

総合スコア16

VBScript

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

1グッド

1クリップ

投稿2016/07/12 06:15

こんにちは、
VBScriptにて簡単な自動化プログラムを作成中しております

お聞きしたいことは「すでに動いている.vbsを外から止めることは出来るか」ということになります。
現在作成中の自動化プログラムを途中で止める際に、同じく.vbsを用いて止める方法を探しています。

具体的には

  1. 同じ.vbsを起動すると、同一のものがすでに動いている際はそれを停止するか聞いてくる
  2. すでに動いているものをファイル名などで検知して、それを別の.vbs止める

のどちらかを実現したいです。

詳しい方がいらっしゃいましたらご教授願えないでしょうか。
もちろん全て教えていただかなくても、検索ワードや機能をお教えくださるだけでも十分です。

回答お待ちしております。
よろしくお願いいたします。

mondaminZ👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

あとから起動したプログラムが「自分と同じ名前のプログラムが起動していたら終了する」という方法をとるのが一般的な気がします。

この場合、下記サイトが参考になります。
⇒アプ研


あとから起動したプログラムが「既に動いているプログラムを終了させる」には、プロセスを見つけてKILLするような形になると思います。
この場合、下記サイトが参考になります。
⇒WMI Fun
⇒yozdaさんのブログ
⇒maruton's memorandum

しかし、自分自信も同名のプログラムとして検出してしまうので、自プロセスを特定していないと自分自身もKILLしてしまうことになります。
この自プロセスの特定という部分が難しいということもあるので、どちらでもよいのであれば前者をお勧めします。

サンプル

以下は上記サイトのコードを組み合わせた、KILLするサンプルです。

Option Explicit Dim wmiLocator Dim wmiService Dim objEnumerator Dim strQuery Dim objProcess strQuery = "Select * FROM Win32_Process WHERE (Caption = 'wscript.exe' OR Caption = 'cscript.exe') AND " & _ " CommandLine LIKE '%" & WScript.ScriptName & "%'" Set wmiLocator = CreateObject("WbemScripting.SWbemLocator") Set wmiService = wmiLocator.ConnectServer Set objEnumerator = wmiService.ExecQuery(strQuery) Dim iCnt iCnt = 0 If objEnumerator.Count > 1 Then msgbox "同じスクリプトが実行されています。" For Each objProcess In objEnumerator iCnt = iCnt + 1 If iCnt = objEnumerator.Count then '最後に見つけたプロセスはKILLしない Else 'プロセスを終了する。 objProcess.Terminate MsgBox "PIDが" & CStr(objProcess.ProcessId) & "のプロセスを終了しました。" & iCnt & "/" & objEnumerator.Count End If Next Else msgbox "他には起動していません。" End If msgbox "処理終了"

自プロセスの特定はしておらず、同名のプログラムの中で最後に見つけたものだけKILLしないようになっています。
このため、条件次第でうまく消されないものが出てきたりすると思います。

投稿2016/07/12 07:24

編集2016/07/13 01:36
jawa

総合スコア3013

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

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

jawa

2016/07/12 07:27

ttyp03さんの回答に気付かずオススメしてくださっている2サイト、同じものをオススメしてしまいました・・・オハズカシイ(^-^;
i_zac8132

2016/07/12 11:45

ご丁寧な回答ありがとうございます! 親切にプログラムまで組んでいただき本当にお世話になります。 まさしく思い描いていたジャストの機能を再現してくださっているように思いますので、 少し自分でかみ砕くのにお時間いただかせていただきます。 ありがとうございました
guest

0

多重起動の判定を調べたところ、下記のサイトが比較的シンプルなコードのように思えました。
ロック用のファイルも作りませんし。
https://www.upken.jp/kb/vbscript-dedup-process.html

問題はここからどうやって他方のVBSを終わらせるかですが、下記のサイトが参考になりそうです。
http://www.wmifun.net/sample/win32_process_c.html

サイトの紹介ばかりですみません。

投稿2016/07/12 06:36

ttyp03

総合スコア16998

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

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

i_zac8132

2016/07/12 06:39

とてつもなくご早い回答ありがとうございます。 「多重起動の判定」というワードで僕も検索してみることにします。 少し色々と試させていただきます。 取り急ぎのお礼ということで。
guest

0

jawa様の書いてくださったコードがズバリ自分の求めていた機能そのもであったことと、
ご丁寧に完成形までを記してくださったことを考慮いたしまして、ベストアンサーとさせていただきました。

WHSそのものの理解が及んでいなかったために足りなかった知識を、
お二方の教えてくださったサイトおよびコード内にありますワーロを調べることで理解が深まり、
想定していた機能の実現へとつながりました。

ご丁寧にありがとうございました。
また何かありましたらよろしくお願いいたします。

なお今更ですが、質問内に誤字脱字が多くあったことをお詫び申し上げます。

投稿2016/07/13 05:57

i_zac8132

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問