工作需求,寫個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,4 ,5 方便判斷;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),函數相關的參數,定義,調用;以及進程的查找,關閉等;