Bat腳本實現監控進程功能


腳本不間斷監控notepad.exe進程是否執行,若停止,則自動重啟該進程,程序如下:

 1 @echo off
 2  
 3 set _task = notepad.exe
 4 set _svr  = c:\windows\notepad.exe
 5 set _des  = start.bat
 6  
 7 :checkService
 8 for /f "tokens=5" %%n in ('qprocess.exe ^| find "%_task%" ') do (
 9     if %%n==%_task% (goto checkMessage) else goto restartService
10 )
11   
12 :restartService
13 echo %time% 
14 echo ********程序開始啟動********
15 echo 程序重新啟動於 %time% ,請檢查系統日志 >> restart_service.txt
16 echo start %_svr% > %_des%
17 echo exit >> %_des%
18 start %_des%
19 REM set /p=.<nul 不換行在屏幕輸出....
20 set /p=.<nul
21 for /L %%i in (1 1 10) do set /p a=.<nul & ping.exe /n 2 127.0.0.1>nul
22 echo .
23 del %_des% /Q
24 echo ********程序啟動完成********
25 goto checkService
26  
27  
28 :checkMessage
29 echo %time% 程序運行正常,5秒后繼續檢查.. 
30 ping localhost -n 5 
31 goto checkService

程序中涉及知識點:

1. for 用法

@echo off
for /f %%i in (test.txt) do echo %%i
pause

  for 循環依次處理每個元素,直到所有的元素都被處理為止。只不過在for /f語句中,這里的元素是指文件中的每一行,也就是說,for /f 語句是以行為單位處理文本文件的

@echo off
for /f "delims=," %%i in (test.txt) do echo %%i
pause

  "delims=,",它的含義是:以逗號作為被處理的字符串的分隔符號。在批處理中,指定分隔符號的方法是:添加一個形如 "delims=符號列表" 的開關,這樣,被處理的每行字符串都會被符號列表中羅列出來的符號切分開來。需要注意的是:如果沒有指定"delims=符號列表"這個開關,那么,for /f 語句默認以空格鍵或跳格鍵作為分隔符號。

@echo off
for /f "delims=.," %%i in (test.txt) do echo %%i
pause

  逐行讀取test.txt中的內容,以點號和逗號切分每一行的內容(不存在點號和逗號的行,則不再切分,為了描述的方便,我們把被點號或逗號切分的一個一個的字符串片段,稱之為節),然后,for /f 會提取第一節的內容作為最終結果,顯示在屏幕上。需要注意的是,在這里,所有行的字符串被切分成了兩個以上的節,但是,代碼只會提取第一節字符串的內容,因為 for /f 語句默認只提取第一節的符串。

@echo off
for /f "delims=, tokens=3" %%i in (test.txt) do echo %%i
pause

  tokens= 后面一般跟的是數字,如 tokens=2,也可以跟多個,但是每個數字之間用逗號分隔,如 tokens=3,5,8,它們的含義分別是:提取第2節字符串、提取第3、第5和第8節字符串。注意,這里所說的“節”,是由 delims= 這一開關划分的,它的內容並不是一成不變的。如果 tokens= 后面指定了多個數字,如果形式變量為%%i,那么,第一個數字指代的內容用第一個形式變量%%i來接收,第二個數字指代的內容用第二個形式變量%%j來接收,第三個數字指代的內容用第三個形式變量%%k來接收……第N個數字指代的內容用第N個形式變量來接收,其中,形式變量遵循字母的排序,第N個形式變量具體是什么符號,由第一個形式變量來決定:如果第一個形式變量是%%i,那么,第二個形式變量就是%%j;如果第一個形式變量用的是%%x,那么,第二個 形式變量就是%%y。

@echo off
for /f "skip=2" %%i in (test.txt) do echo %%i
pause

  很多時候,有用的信息並不是貫穿文本內容的始終,而是位於第N行之后的行內,為了提高文本處理的效率,或者不受多余信息的干擾,for /f 允許你跳過這些無用的行,直接從第N+1行開始處理,這個時候,就需要使用參數 skip=n,其中,n是一個正整數,表示要跳過的行數。上面代碼將跳過頭兩行內容,從第3行起顯示test.txt中的信息

@echo off
for /f "eol=;" %%i in (test.txt) do echo %%i
pause

  eol= 的准確含義是:忽略以指定字符打頭的行

for /f %%i in (文件名) do (……)
for /f %%i in ('命令語句') do (……)
for /f %%i in ("字符串") do (……)
for /f "usebackq" %%i in ("文件名") do (……)
for /f "usebackq" %%i in (`命令語句`) do (……)
for /f "usebackq" %%i in ('字符串') do (……)

  1. 當你希望讀取文本文件中的內容的話,第一個括號中不用任何符號包裹,應該使用的是第1條語句;例如:你想顯示test.txt中的內容,那么,就使用 for /f %%i in (test.txt) do echo %%i;
  2. 當你讀取的是命令語句執行結果中的內容的話,第一個括號中的命令語句必須使用單引號包裹,應該使用的是第2條語句;例如:你想顯示當前目錄下文件名中含有test字符串的文本文件的時候,應該使用 for /f %%i in ('dir /a-d /b *test*.txt') do echo %%i 這樣的語句;
  3. 當你要處理的是一個字符串的時候,第一個括號中的內容必須用雙引號括起來, 應該是用的是第3條語句;例如:當你想把bbs.bathome.net這串字符中的點號換為短橫線並顯示出來的話,可以使用 for /f "delims=. tokens=1-3" %%i in ("bbs.bathome.net") do echo %%i-%%j-%%k 這樣的語句

2. set 

set的主要作用是賦值
  2.1 set /p a=請輸入你的姓名
    先顯示"請輸入你的姓名",再接受用戶輸入的內容,以回車表示結束,賦值給變量a
  2.2 set /p a=promptstring<1.txt
    先顯示promptstring,再把"<"管道號右邊的1.txt文件中從第一個字符開始直到碰到回車符的內容賦值給變量a (通常表現為第一行)。
  2.3 set /p a=promptstring<nul
    先顯示promptstring,再把"<"管道號右邊nul中內容賦值給變量a ,不用用戶按回車就結束語句。因nul是空設備,故沒有內容可賦值,變量a仍屬未定義。
因為在接受用戶輸入前可先顯示promptstring,故此set還可當作顯示命令用(僅作為顯示命令使用時,可省略變量a)
  2.4 set /p =promptstring
    顯示promptstring,再接受用戶輸入的內容,以回車表示結束。如用戶直接按回車則僅顯示promptstring。(賦值給空變量,賦值意義已喪失,僅作顯示之用,需用戶按回車鍵結束語句,無多大實際用途)
  2.5 set /p =promptstring<1.txt
    先顯示promptstring,再把"<"管道號右邊的1.txt文件中從第一個字符開始直到碰到回車符的內容賦值給空變量(無實際用途)
  2.6 set /p =promptstring<nul
    先顯示promptstring,再把"<"管道號右邊nul中內容賦值給空變量,不用用戶按回車就結束語句,實際中常用這個句式作為顯示語句。因顯示promptstring后光標不換行,故實際中這個句式用到很多。如2樓所述,還有光標退格等。

3. if

  在CMD使用IF /?打開IF的系統幫助(自己看我就不全部列出來了),我們會發現IF有3種基本的用法!
    IF [NOT] ERRORLEVEL number command
    IF [NOT] string1==string2 command
    IF [NOT] EXIST filename command
  NOT            把NOT理解為C/C++中的取反操作符,然后就可以理解為C/C++中的條件表達式執行
  ERRORLEVEL number   如果最后運行的程序返回一個等於或大於指定數字的退出編碼,指定條件為true。
  string1==string2      如果指定的文字字符串匹配,指定條件為 true,批處理中只有==沒有!=,可以用NOT 條件表達式替代。
  EXIST filename         如果指定的文件名存在,指定條件為 true。
  command                 如果符合條件,指定要執行的命令。如果指定的條件為 FALSE,命令后可跟一個執行 ELSE關鍵字后的命令的 ELSE 命令。
ELSE 子句必須出現在同一行上的IF 之后

 

 1 @echo off
 2 Setlocal enabledelayedexpansion
 3 ::CODER BY dsw POWERD BY iBAT
 4 set file="C:\abc.bat"
 5 if exist %file% (        ::注意這里else后的空格
 6       echo file is exists
 7 )else (                  ::注意這里else要和if的子句在同一行,並且else后要有空格
 8       echo file is not exists
 9 )
10 pause

 

第一種用法:IF [NOT] ERRORLEVEL number command
  這個用法的基本做用是判斷上一條命令執行結果的代碼,以決定下一個步驟.一般上一條命令的執行結果代碼只有兩結果,"成功"用0表示  "失敗"用1表示.

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

copy C:\abc.bat E:\
if %ERRORLEVEl% == 0 (
    echo operation succ %ERRORLEVEl%
)else (
    echo operation fail %ERRORLEVEl%
)
pause


 @echo off
 Setlocal enabledelayedexpansion
 ::CODER BY dsw POWERD BY iBAT
 set /p var=隨便輸入一個命令
 %var%
 echo errorlevel is %ERRORLEVEL%
 if NOT %ERRORLEVEL% == 0 (
   echo !var!執行失敗
 ) else (
      echo !var!執行成功
 )
 pause

  %ERRORLEVEL% 這是個系統變量,返回上條命令的執行結果代碼! "成功"用0表示,"失敗"用1表示.一般上一條命令的執行結果代碼只有兩結果,當然有的操作還有其他參數,這只是一般的情況。實際上,errorlevel返回值可以在0~255之間,比如,xcopy默認的errorlevel值就有5個,分別表示5種執行狀態:

如下所示:
  0 文件復制沒有錯誤。
  1 if errorlevel 2 echo。
  2 用戶按 CTRL+C 終止了 xcopy。
  4 出現了初始化錯誤。沒有足夠的內存或磁盤空間,或命令行上輸入了無效的驅動器名稱或語法。
  5 出現了磁盤寫入錯誤。
要判斷上面xcopy命令的5種退出情況,應寫如下判斷成才能正確執行:
  if errorlevel 5 echo出現了磁盤寫入錯誤
  if errorlevel 4 echo出現了初始化錯誤
  if errorlevel 2 echo用戶按 CTRL+C 終止了 xcopy
  if errorlevel 1 echo if errorlevel 2 echo
  if errorlevel 0 echo文件復制沒有錯誤。

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

set /p var=隨便輸入一個命令
%var%

::等價於if %ERRORLEVEL% == 0 (echo !var!執行成功了) ELSE (echo !var!執行失敗了!)
if %ERRORLEVEL% == 0 (
    echo !var!執行成功
) else (
    echo !var!執行失敗
)

pause

這個是根據你輸入的命令,自動判斷是成功還是失敗了!

第二種用法:IF [NOT] string1==string2 command
這個呢就是用來比較變量或者字符的值是不是相等的.

@echo off
 Setlocal enabledelayedexpansion
 ::CODER BY dsw POWERD BY iBAT

 set /p var1="請輸入一個字符串:"
 set /p var2="請輸入一個字符串:"

 if %var1% == %var2% ( echo var1 eque var2) else (echo var1 not eque var2)
 if NOT %var1% == %var2% ( echo var1 not eque var2) else (echo var1 eque var2)

 pause

  上面這個例子可以判斷你輸入的值是不是相等,但是你如果輸入相同的字符,但是如果其中一個后面打了一個空格,這個例子還是會認為相等,如何讓有空格的輸入不相等呢?我們在比較字符上加個雙引號就可以了.

第三種用法:IF [NOT] EXIST filename command
這個就是判斷某個文件或者文件夾是否存在的語法

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

set file="C:\abc.bat"
if exist %file% (            ::注意這里else后的空格 echo file is exists
)else (                      ::注意這里else要和if在同一行,並且else后要有空格 echo file is not exists
)

判斷的文件路徑加引號是為了防止路徑有空格,如果路徑有空格加個雙引號就不會出現判斷出錯了!

第四種用法:IF增強的用法
  IF [/I] string1 compare-op string2 command #參數/I表示不區分大小寫
  IF CMDEXTVERSION number command
  IF DEFINED variable command          #判斷變量是否存在,很有用
  CMDEXTVERSION 條件的作用跟 ERRORLEVEL 的一樣,除了它是在跟與命令擴展名有關聯的內部版本號比較。第一個版本是 1。每次對命令擴展名有相當大的增強時,版本號會增加一個。命令擴展名被停用時,CMDEXTVERSION 條件不是真的。
如果已定義環境變量,DEFINED 條件的作用跟 EXISTS 的一樣,下面兩條命令效果一樣。
  IF DEFINED variable command
  IF NOT "variable"=="" command
  用“set variable=”命令使變量variable變成未定義,即空值,一句話,變量值為空,則為未定義;變量值不為空,則為已定義。
用語句IF DEFINED variable command判斷變量是否存在時,請注意variable為不使用引導符號%的變量名,不能用寫為%variable%,否則出錯。

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT


  set a=10
  if DEFINED a (echo l hava define) else (echo l don't define)
  set a=
  if DEFINED a (echo l hava define) else (echo l don't define)
pause

輸出:
  l hava define
  l don't define

最后面還有一些用來判斷數字的符號:
    EQU - 等於
    NEQ - 不等於
    LSS - 小於
    LEQ - 小於或等於
    GTR - 大於
    GEQ - 大於或等於

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM