腳本不間斷監控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 - 大於或等於