[windows] 如何通過批處理腳本檢查進程是否正在運行


Answers

以下是我的工作方式:

tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log

FOR /F %%A IN (search.log) DO IF %%~zA EQU 0 GOTO end

start notepad.exe

:end

del search.log

如果它尚未運行,上面將打開Notepad

編輯:請注意,這不會找到任務列表中隱藏的應用程序。 這將包括以不同用戶身份運行的所有計劃任務,因為這些會自動隱藏。

Question

我如何檢查應用程序是否從批處理(well cmd)文件運行?

如果程序已經運行,我不需要啟動另一個實例。 (我無法將應用程序更改為僅限單一實例。)

此外,該應用程序可以作為任何用戶運行。




在Windows下,可以使用Windows Management Instrumentation(WMI)確保沒有啟動具有指定命令行的應用程序,例如:

wmic process where (name="nmake.exe") get commandline | findstr /i /c:"/f load.mak" /c:"/f build.mak" > NUL && (echo THE BUILD HAS BEEN STARTED ALREADY! > %ALREADY_STARTED% & exit /b 1)




我不知道如何在CMD中構建,但如果你有grep你可以嘗試以下方法:

tasklist /FI "IMAGENAME eq myApp.exe" | grep myApp.exe
if ERRORLEVEL 1 echo "myApp is not running"



您應該檢查父進程名稱,請參閱有關基於.NET的解決方案** 的代碼項目文章。

一種非編程方式來檢查:

  1. 啟動Cmd.exe
  2. 啟動應用程序(例如, c:\windows\notepad.exe
  3. 檢查Process Explorer Notepad.exe進程的屬性
  4. 檢查父進程(這顯示cmd.exe)

通過獲取父進程名稱可以檢查相同的結果。




我在這裡假設窗戶。 所以,你需要使用WMI來獲取這些信息。 查看腳本專家的archives ,了解如何從腳本使用WMI的大量示例。




npocmaka建議使用QPROCESS而不是TASKLIST,但是,它的答案如此之大和復雜,以至於我覺得有必要發布一個非常簡化的版本,我猜可以解決大多數非高級用戶的問題:

QPROCESS "myprocess.exe">NUL
IF %ERRORLEVEL% EQU 0 ECHO "Process running"

上面的代碼在Windows 7中進行了測試,具有管理員權限的用戶。




基於vtrz的回答和Samuel Renkert關於另一主題的回答 ,我想出了下面的腳本,如果它尚未運行,它將只運行%EXEC_CMD%

@echo off
set EXEC_CMD="rsync.exe"
wmic process where (name=%EXEC_CMD%) get commandline | findstr /i %EXEC_CMD%> NUL
if errorlevel 1 (
    %EXEC_CMD% ...
) else (
    @echo not starting %EXEC_CMD%: already running.
)

如前所述,這需要管理權限。




Matt Lacey提供答案適用於Windows XP。 但是,在Windows Server 2003中這一行

 tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log

回報

INFO:沒有任何符合指定條件的任務正在運行。

然後在進程運行時讀取它。

我沒有一堆批處理腳本經驗,因此我的工作是在search.log文件中搜索進程名稱,並將結果抽取到另一個文件並蒐索所有輸出。

tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log

FINDSTR notepad.exe search.log > found.log

FOR /F %%A IN (found.log) DO IF %%~zA EQU 0 GOTO end

start notepad.exe

:end

del search.log
del found.log

我希望這可以幫助別人。




Related