簡體   English   中英

批量檢查進程是否存在

[英]Batch to check if process exists

我想要一個批處理來檢查進程 firefox.exe 是否存在(在它被 start 命令啟動之后)。 如果進程存在,它將轉到標簽 :fullscreen,否則批處理將轉到標簽 :timeout。 然后,它將再次檢查進程 firefox.exe 是否存在,如果不存在,它將再次轉到標簽 :fullscreen 直到該進程存在。

這是我的批次:

@echo off
start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe"
:timeout
timeout /t 5
:fullscreen
nircmd sendkeypress F11
exit

我怎樣才能做這個檢查?

我建議為此任務使用批處理文件:

@echo off
start "" /max firefox.exe
if errorlevel 1 goto :EOF
set LoopCount=0

:WaitLoop
%SystemRoot%\System32\timeout.exe /T 5
%SystemRoot%\System32\tasklist.exe /FI "IMAGENAME eq firefox.exe" 2>nul | %SystemRoot%\System32\find.exe /I "firefox.exe" >nul
if not errorlevel 1 nircmd.exe sendkeypress F11 & goto :EOF
set /A LoopCount+=1
if not %LoopCount% == 6 goto WaitLoop

讓我解釋一下這里使用的幾個命令行。


1. 啟動火狐

命令STARTcmd.exe的內部命令,將第一個雙引號字符串解釋為控制台窗口的可選標題。 因此命令行

start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe"

結果只是打開一個帶有窗口標題的新控制台窗口:
C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe

出於這個原因, ""被指定為第一個START參數來定義一個空標題。 Firefox是一個 GUI 應用程序。 所以沒有打開控制台窗口,這意味着一個空的窗口標題就足夠了。

參數/max並不是真正必要的,但目標是在啟動后讓Firefox進入全屏模式。 那么為什么不啟動它已經最大化呢?

默認情況下,32 位版本的Firefox安裝在 32 位 Windows 上的%ProgramFiles%目錄和 64 位 Windows 上的%ProgramFiles(x86)% 但是在安裝過程中可以將Firefox安裝到任何其他文件夾中。 但是Firefox安裝程序編碼良好,並在 Windows 注冊表中的注冊表項下注冊firefox.exe

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

這是 Microsoft 推薦的,如 MSDN 文章Application Registration 中所述

命令START還在 Windows 注冊表中的此項下搜索指定為不帶路徑的參數的可執行文件,如“START”何處搜索可執行文件?

這就是在START命令行上僅使用firefox.exe的原因,因為這會啟動獨立於安裝位置的已安裝Firefox

如果firefox.exe無法啟動並退出,則START會顯示一個適當的消息框,返回碼大於 0(我在一台計算機上的測試中為 9059)。

運行if /?的幫助輸出if /? 在命令提示符窗口中解釋了如何在不使用立即或延遲的環境變量擴展的情況下評估先前命令或應用程序的退出代碼,因此可以在從 MS-DOS(真的!)到當前最新的 Windows 10 的批處理文件中的任何地方工作。

命令行if errorlevel 1 goto :EOF表示IF start無法啟動firefox.exe ,退出代碼大於或等於 1 THEN exit execution of this batch file。 有關退出批處理文件執行的詳細信息,請參閱GOTO :EOF 返回到何處?


2. 檢查正在運行的 Firefox

命令TASKLIST是一個外部命令,即Windows系統目錄下的控制台應用程序,輸出正在運行的進程列表。 該列表可以由TASKLIST本身針對特定進程進行過濾,如在批處理文件中使用/FI "IMAGENAME eq firefox.exe"

但是TASKLIST是專為打印進程列表而設計的。 它不是為檢查特定進程是否正在運行並通過退出代碼將結果返回給調用進程而設計的。 TASKLIST總是以 0 退出。

但是在使用過濾器時會輸出一條錯誤消息來處理STDERR ,並且在與此過濾器匹配的進程列表中找不到任何進程。 出於這個原因, 2>nul用於通過將其重定向到設備 NUL 來抑制此錯誤消息。 閱讀有關使用命令重定向運算符的 Microsoft 文章,了解有關重定向的更多信息。

在檢查運行Firefox 時獲得簡單的 false/true 分別為 0/1 結果的一種簡單方法是使用外部命令FIND過濾TASKLIST 的輸出,如果確實找到了要查找的字符串,則以 0 退出,如果搜索到的字符串找不到,則以 1 退出在這種情況下從STDIN讀取的文本中可以找到。 FIND的輸出無關緊要,因此通過使用>nul重定向到設備NUL來抑制。

除了使用TASKLISTFIND 之外,還可以使用QPROCESS

%SystemRoot%\System32\qprocess.exe firefox.exe >nul 2>&1

如果在正在運行的進程列表中找不到firefox.exe QPROCESS 將退出,退出代碼為1 否則,運行firefox.exe退出代碼為0


3. 評估 Firefox 進程檢查結果

if not errorlevel 1 nircmd.exe sendkeypress F11 & goto :EOF

IF命令檢查FIND 的退出代碼是否不大於或等於 1 ,這意味着退出代碼是否小於 1 命令FIND從不以負值退出。 因此,如果此條件為真,則是時候執行nircmd.exe將按鍵F11發送到前台的應用程序,希望是Firefox (此代碼不保證)並退出批處理文件處理。

否則批處理文件應再次等待 5 秒,然后再次進行檢查。 如果用戶在 5 秒等待超時之前立即關閉啟動的Firefox,這很容易導致無休止的運行批處理文件。 出於這個原因,它計算等待循環已經執行的頻率。 運行 6 次循環后,即 30 秒,真的是時候不再等待Firefox並退出批處理文件了。


4. 獲取有關使用命令的更多信息

要了解使用的命令及其工作原理,請打開命令提示符窗口,在那里執行以下命令,並仔細閱讀為每個命令顯示的所有幫助頁面。

  • echo /?
  • find /?
  • if /?
  • qprocess /?
  • set /?
  • start /?
  • tasklist /?
  • timeout /?

除了上面已經引用的所有其他網頁之外,還應該閱讀使用 Windows 批處理文件的帶有多個命令的單行解釋運算符&

您可以像這樣顯示打開的程序列表:

tasklist

要檢查 Firefox 是否存在:

編輯:編輯代碼以顯示一個完整的工作示例

@echo off
start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe"
goto :checkloop

:checkloop
tasklist|find "firefox.exe" > NUL
if %ERRORLEVEL% == 0 ( 
    call :fullscreen 
    exit
) else ( 
     call :timeout
     goto :checkloop
)


:fullscreen
nircmd sendkeypress F11
goto :EOF

:timeout
timeout /t 5
goto :EOF

您還可以使用查詢過程:

@Echo Off
If Not Exist "%ProgramFiles(x86)%\Mozilla Firefox\firefox.exe" Exit/B
Start "" "%ProgramFiles(x86)%\Mozilla Firefox\firefox.exe"
:Loop
Timeout 5 /NoBreak>Nul
QProcess firefox.exe>Nul 2>&1||GoTo :Loop
NirCmd SendKeyPress F11

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM