bat腳本學習


工作需求,寫個bat腳本來啟動自己的守護進程;bat方面完全空白啊~稍微學習了下,記錄下來,后面復習!

直接上代碼:

示例一:for字符串切割,切割文本中的字符串:

test.txt 文本內容如下:

 1 ::關閉 echo 打印命令開關,設置為ON則開啟
 2 @echo off
 3 
 4 for /f "tokens=1,2,3 delims= " %%a in (test.txt) do (
 5     echo %%a %%b %%c
 6 )
 7 :: pause 命令執行在這里暫停,默認提示 按任意鍵繼續,用來調試使用;可以用 pause>nul 來自定義顯示字符
 8 pause
 9 
10 :: 或者自定義pause 提示字符顯示
11 echo "我是自定義的提示。。。。。"
12 pause>nul

解釋: for命令比較復雜,這里只學習下了字符串切割;

  •   for語句 字符切割用 delims,后面跟依據什么切割,默認是一行一切割,按 空格 和 tab,所以本例子也可以不寫 delims= ;
  •   展示切割后的哪一個字符 由 tokens 來定義,例子中 拿每行 切割后,第 1,2,3 個字段,也就是每一個都拿出來,最后通過 echo 打印出來;
  •   %%a 可以任意定義; %%a,%%b,%%c 可以任意定義,這里把 tokens中切割字符串依次默認保存在 %%a,%%b,%%c 變量中;后面變量不夠的  話可以繼續自定義,tokens默認會把切割的串依次放進變量;
  •   如果需要細分 每一個變量,可以在do() 中 再寫一個for 循環嵌套分割(for循環是可嵌套的),這里不再啰嗦。也可以根據需求,使用多個分隔符來分割字  符串(詳細見后面)

bat文件執行后結果:

  tokens=1,2,3 時 結果:

  tokens= 2,3 時 結果展示:

  

 

示例二:for字符串切割,切割 【命令語句 執行結果】的字符串(監視並重啟tomcat服務):

  我試了下直接切割命令結果沒有成功,我的基本思路是,把執行結果先放在臨時文件中,切割后刪除:

 1 @echo off
 2 ::查看占用端口的進程信息 : netstat -aon | findstr "端口號"  
 3 ::根據PID查看進程名    :    tasklist | findstr "PID"  
 4 ::殺死進程(這時候就需要使用 /f 參數。)    :    taskkill /pid 5824 /f  
 5 
 6 :: 調用 reStartTomcat_ 函數 ,調用后 按任意鍵 退出;
 7 call :reStartTomcat_
 8 pause & exit
 9 
10 :: 定義一個 reStartTomcat_ 名字的函數, 並以 goto :eof 結尾的函數;
11 :reStartTomcat_
12 
13     :: 查找 8080端口的服務,並將找到的結果保存進 tmp.txt臨時文件中;
14     netstat -ano | findstr 8080 >tmp.txt
15     
16     :: 我們需要的是 他的 PID號,及第5個切割后的串;我們拿出第1,45 方便判斷;tmp數據 見下圖
17     for /f "tokens=1,4,5" %%a in (tmp.txt) do (
18     
19         :: bat中字符串默認可以用空格拼接
20         echo %%a %%b %%c
21         
22         :: 判斷 如果 %%b="LISTENING" 的話,處於監聽狀態的話,執行()里面語句
23         if "%%b"=="LISTENING" (
24             echo %%c+"服務正在監聽,關掉重啟。。。。"
25             :: 強制關閉 該進程
26             taskkill /pid %%c /f
27         )        
28     )
29     :: 刪除生成的臨時文件
30     del tmp.txt
31     
32     :: 找到tomcat的bin目錄路徑
33     set current_dir="E:/soft/apache-tomcat-7.0.68/bin"
34     
35     ::進入到 tomcat的bin路徑下;注意不能用 cd;出來上一個工作目錄,命令用 popd;
36     pushd %current_dir%
37     
38     rem 輸出當前目錄 , rem 和 :: 含義一樣,都是注釋一行
39     echo "tomcat目錄為:"%current_dir%
40     
41     :: 啟動 tomcat
42     call startup.bat
43     pause
44 goto :eof

 call :reStartTomcat_ :  程序啟動入口,可以用if分支語句來控制

  netstat -ano | findstr 8080 >tmp.txt  : 下圖是 tmp.txt 保存的信息:  

 結果展示:

 

 示例三:for字符串切割,切割 【命令語句 執行結果】的字符串(監視並重啟tomcat服務):

 1 @echo off
 2 :: 定義一個標簽,用來跳轉
 3 :Main
 4 
 5 :: 從控制台輸入 start/stop ,並保存進 str變量,來控制 下面的分支流程
 6 set /p "str=輸入操作類型:[start]/[stop]:"
 7 
 8 :: 如果 str等於 start ,則調用 start函數
 9 if "start"=="%str%" (
10     :: 調用start_ 函數 並傳入 三個參數
11     call :start_ "q" "2" "e"
12     pause && exit
13 )
14 
15 :: 如果 str等於 start ,則調用 start函數
16 if "stop"=="%str%" (
17     :: 調用start_ 函數 並傳入 三個參數
18     call :stop_ "q" "2" "e"
19     :: 暫停當前執行,按任意鍵退出
20     pause && exit
21 )
22 echo "請傳入准確的操作類型:[start]/[stop]:"
23 goto Main
24 
25 :start_
26     echo "服務啟動函數!"
27     :: %0代表 函數名本身, %1,%2,%3 代表的是 第1,2,3 個參數,一次類推
28     echo %0 "輸入的參數 " %1 %2 %3
29     echo "寫入文本中。。。。">tmp.txt
30     goto :eof
31     
32 :stop_
33     echo "服務關閉函數!"
34     echo %0 "輸入的參數 " %1 %2 %3
35     goto :eof

 示例四:for字符串切割,定義多個分隔符來切割:

  此處參考資料:http://blog.sina.com.cn/s/blog_4b795cc10100ez8d.html

 1 ::關閉 echo 打印命令開關,設置為ON則開啟
 2 @echo off
 3 :: tmp.txt文件見下面截圖; 將文本中的內容用delims的3個符號分割,分割后的結果可以用 tokens將分割后的位置的數據取出來,放入 %%a,%%b,%%c,%%d中
 4 for /f "tokens=1,2,3,4 delims=、-." %%a in (tmp.txt) do (
 5     echo %%a %%b %%c %%d
 6 )
 7 :: pause 命令執行在這里暫停,默認提示 按任意鍵繼續,用來調試使用;可以用 pause>nul 來自定義顯示字符
 8 pause
 9 
10 :: 或者自定義pause 提示字符顯示
11 echo "我是自定義的提示。。。。。"
12 pause>nul

tmp.txt的文本內容,和tokens=1,2,3,4的結果展示: 如第一行,一次被分割成四段:1 饒天亮 玫瑰愛人 mp3 ;ps:感覺很強大

當 tokens=1,3和 tokens=2,4時結果展示:由於 %c,%d 沒有數據,所以當做字符串直接打印出來了

 

本文涉及到的bat的知識點有: 變量,分支,字符串分割(for),函數相關的參數,定義,調用;以及進程的查找,關閉等;

 


免責聲明!

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



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