2015-12-01 85 views
1

我想創建一個方法來檢查某個程序是否正在運行 - 如果是,請啓動另一個程序。如何在Windows中啓動另一個進程時啓動進程?

這是我在英美菸草

@ECHO OFF 
:LOOP 
tasklist /nh /fi "imagename eq steam.exe" | find /i "steam.exe" >nul && START "" "C:\Program Files\TeamSpeak 3 Client\ts3client_win64.exe" || goto :LOOP 

進展,我創建在Windows啓動時,基本上開始BAT(這是唯一的,以確保該批處理文件不可見的控制檯窗口中運行)一個VBS:

Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\if Steam running then TS.bat" & Chr(34), 0 
Set WshShell = Nothing 

我的問題是,這樣做,我得到了令人難以置信的高CPU使用率(與I5-4670k 20至60%)。

我做錯了什麼?或者我可以改進代碼嗎?我正在考慮放慢窗口檢查過程的時間(即等待2秒鐘然後檢查),但我對編碼真的很陌生,對於如何這樣做我沒有任何想法。

我知道我的英語並不完美,對不起。

編輯:如果有幫助,我的電腦在Windows 10

+0

作爲另一種選擇,我相信微軟應用程序兼容性工具包能爲你做到這一點。 –

回答

3

運行我得到一個令人難以置信的高CPU使用率

你需要給你的電腦檢查之間休息。所述timeout命令中斷批處理執行用於可配置數目的秒:

@echo off 
setlocal 

set "FIND_STEAM=tasklist /nh /fi "imagename eq steam.exe" ^| find /i "steam.exe" ^> NUL" 
set "START_TS=start "C:\Program Files\TeamSpeak 3 Client\ts3client_win64.exe"" 

:LOOP 

timeout 5 > NUL 
%FIND_STEAM% && %START_TS% || goto LOOP 

EDIT

這裏是鐘聲和 - 口哨使用反應以在Windows一個過程的開始和終止的複雜的方式VBScript中。

它可以與WMI,一個強大的框架,可以在Windows中做各種事情。在這裏,我們使用它來監聽進程創建和進程終止事件。 (監聽事件是很多比輪詢更高效的所有進程每秒左右):

Option Explicit 

Dim WMIService, ProcessNew, ProcessEnd 
Dim computer, query, teamspeakPID 

' create a WMI service object and ProcessNew/ProcessEnd event sinks 
computer = "." 
Set WMIService = GetObject("winmgmts:\\" & computer & "\root\CIMV2") 
Set ProcessNew = WScript.CreateObject("WbemScripting.SWbemSink", "ProcessNew_") 
Set ProcessEnd = WScript.CreateObject("WbemScripting.SWbemSink", "ProcessEnd_") 

' we will be waiting for Win32_Process creation events and notify event sink "ProcessNew" 
WMIService.ExecNotificationQueryAsync ProcessNew, _ 
    "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'" 

' we will also be waiting for Win32_Process deletion events and notify event sink "ProcessEnd" 
WMIService.ExecNotificationQueryAsync ProcessEnd, _ 
    "SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'" 

' main loop: nothing to do, we just sit and wait 
While True 
    Wscript.Sleep(500) 
Wend 

' function that handles "process created" events 
Sub ProcessNew_OnObjectReady(latestEvent, asyncContext) 
    Dim process 
    If LCase(latestEvent.TargetInstance.Name) = "steam.exe" Then 
     ' start TeamSpeak 
     Set process = GetObject("winmgmts:Win32_Process") 
     process.Create "C:\Program Files\TeamSpeak 3 Client\ts3client_win64.exe", null, null, teamspeakPID 
    End If 
End Sub 

' function that handles "process ended" events 
Sub ProcessEnd_OnObjectReady(latestEvent, asyncContext) 
    Dim processList, process 
    If LCase(latestEvent.TargetInstance.Name) = "steam.exe" Then 
     ' kill TeamSpeak (but only the one we started earlier) 
     Set processList = WMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'ts3client_win64.exe' AND ProcessId = " & teamspeakPID) 
     For Each process in processList 
      process.Terminate() 
     Next 
    End If 
End Sub 

作爲練習,你可以嘗試擴展這一點,以便它只有當它尚未運行啓動TS。

延伸閱讀:

+1

正如我之前說過的,我的編碼知識非常低(我基本剛剛開始),而且我試圖不只是複製其他人的粘貼代碼,而是學習一些東西。 這就是說,這是我發現在後臺運行bat文件(而不是打開CMD)的唯一方式是否有更好的方法呢? – XenSide

+0

它工作完美無瑕,我只需在開始和目錄之間添加雙「」,我甚至將超時時間縮短到1.5,性能非常完美,愛你的伴侶。 你唯一能做的更好的事情就是向像我這樣的不喜歡的人解釋變化。 謝謝。 – XenSide

+0

我不確定那個超時支持spit-seconds。我也在研究用另一種技術來擴展這個答案,可能會讓我花一點時間,堅持下去。 – Tomalak

相關問題