背景
部署Jenkins持續集成,需要用命令把操作串起來,做到自動化部署。我們的服務器是windows2008,所以就想到了寫個bat腳本,到時候直接運行就好了。
第一次寫,啥都不知道,還是上網搜尋資料吧。這里做個記錄~~~~~
批處理bat文件最常用的幾個命令:
echo表示顯示此命令后的字符
echo on 表示在此語句后所有運行的命令都顯示命令行本身
echo off 表示在此語句后所有運行的命令都不顯示命令行本身
@與echo off相像,但它是加在每個命令行的最前面,表示運行時不顯示這一行的命令行(只能影響當前行)。
call 調用另一個批處理文件(如果不用call而直接調用別的批處理文件,那么執行完那個批處理文件后將無法返回當前文件並執行當前文件的后續命令)。
pause 運行此句會暫停批處理的執行並在屏幕上顯示Press any key to continue...的提示,等待用戶按任意鍵后繼續
rem 表示此命令后的字符為注釋,不執行。
copy a:*.* d:\back 復制命令
>、>>輸出重定向命令:將一條命令或某個程序輸出結果的重定向到特定文件中, > 與 >>的區別在於,>會清除調原有文件中的內容后寫入指定文件,而>>只會追加內容到指定文件中,而不會改動其中的內容
例子
首先我們看一個例子,進入springboot項目目錄,運行maven命令打包:
@echo off D: cd D:\Toona\Toona-springboot\toona-demo rem 生成后端jar包,移動到統一目錄 set JAVA_HOME=D:\java\ibm_jdk1.8.0 call mvn clean package spring-boot:repackage -Dmaven.test.skip=true copy D:\Toona\Toona-springboot\toona-demo\target\toona-demo.jar D:\Toona-file\Toona-package rem 生成后端war包,移動到統一目錄 set JAVA_HOME=D:\java\ibm_jdk1.8.0 call mvn clean package spring-boot:repackage -Dmaven.test.skip=true -f pom-war.xml copy D:\Toona\Toona-springboot\toona-demo\target\toona-demo.war D:\Toona-file\Toona-package rem 生成zip包,移動到統一目錄 call npm install call npm run dist cd dist jar cvfM toona-demo-web.zip ./ copy ......
1.對於@echo off 如果不加上的話,在運行bat的時候就會把運行的命令打印出來,效果就和自己在cmd中敲命令一樣
2.設置環境變量JAVA_HOME可以用set 變量名=value
3.rem是注釋,不會運行
4.在BAT文件里面執行Maven的mvn命令后,mvn之后的命令不會被執行,這是由於mvn本身也是BAT文件,並且其結束時執行了exit命令。要讓mvn命令不使當前腳本自動退出,只需要在mvn之前加上call命令,類似的npm等,都是這樣,即使添加了pause也會自己跳了
5.關於windows命令對文件進行壓縮,可以見文章https://www.cnblogs.com/charles8866/articles/10472645.html
bat中ftp上傳
下面,我們需要對生成的jar包,和war包等上傳到linux服務器上,這個時候就需要用到windows中的ftp:
@echo off set ftpfilename=autoftp.txt echo open 192.168.133.34 >"%ftpfilename%" echo username >>"%ftpfilename%" echo password >>"%ftpfilename%" echo Prompt >>"%ftpfilename%" echo bin >>"%ftpfilename%" echo lcd h:\js >>"%ftpfilename%" echo mput flower.zip flower2.zip flower3.zip>>"%ftpfilename%" echo bye >>"%ftpfilename%" ftp -s:"%ftpfilename%" del "%ftpfilename%"
1.在windows系統中因為FTP是一個程序,如果在bat腳本中直接調用FTP的命令,在執行時總會彈出命令行窗口,循環在>FTP光標這,所以要換種方式,利用-S:filename,更多的命令請輸入-h查看
2、put,mput,get,mget
FTP登錄成功后,需要下載遠程單個文件時,使用get命令,如果下載多個文件時,用mget,它支持通配符,在使用mget時,需要對每一個文件都進行選擇Y/N,如果想不交互的下載全部的文件,可以輸入一次prompt命令關閉交互方式。
Mput和mget命令要注意兩個問題:
- 不能對目標文件指定命字,在命令行上所有的文件都視做源文件
- mput,mget兩個命令不能對目錄進行上傳與下載,只能對文件
- Prompt:每次執行一個這個命令,就在on ,off之間循環,ftp腳本開始時,prompt默認為on,所以一般在上傳、下載文件時,執行一次prompt,把交互式的on關掉,變為off。
當然Mput和Mget可以使用多次的put和get代替,這個時候就不需要關閉交互方式
3、文件的傳輸方式:
- Binary ,二進制傳輸
- Ascii ,ascII傳輸
在FTP文件傳輸過程中,ASCII傳輸HTML和文本編寫的文件,而二進制碼傳輸可以傳送文本和非文本(執行文件,壓縮文件,圖片等),具有通用性,二進制碼傳輸速度比ASCII傳輸要快,所以在建立bat腳本時,一般輸入bin命令,啟用二進制傳輸。如果用ASCII模式傳輸非文本文件,可能會顯示一堆亂碼,如果是上傳一些CGI腳本,有可能將無法運行這類腳本,而在瀏覽器上看到server 500 error的錯誤。
Ascii和binary模式的區別是回車換行的處理。binary模式不對數據進行任何處理,asci模式將回車換行轉換為本機的回車字符,比如Unix下是\n,Windows下是\r\n,Mac下是\r。unix系統下行結束符是一個字節,即十六進制的0A,而ms的系統是兩個字節,即十六進制的0D0A。
所以當你用ascii方式從unix的ftp server下載文件時(不管是二進制或者文本文件,redhat的 vsftp默認是binary,ascii默認關閉),每檢測到一個字節是0A,就會自動插入一個0D,所以如果你的文件是二進制文件比如可執行文件、壓縮包什么的,就肯定不能用了。如果你的文件就是unix下的文本文件,你用 ascii模式是正確的,要是誤用了binary模式,你在windows上看這個文件是沒有換行的,里面是一個個的黑方塊。
在用FTP客戶端傳輸文件時,因為這些軟件都做得比較智能化,它可以根據后綴,自動啟用傳輸模式,所以不用擔心出問題。
4、lcd:
ftp中用lcd切換本地路徑,用cd切換遠程服務器的路徑。常用到的命令如下:
cd目錄名(進入服務器目錄) lcd目錄名(進入本機目錄)
cd \(退到服務器根目錄) lcd \(退到本機根目錄)
cd ..(退回到上一級目錄) lcd ..(退回到上一級目錄)
5、dir
注意:你成功登陸后就可以用dir查看命令查看FTP服務器中的文件及目錄,用ls命令只可以查看文件。
6、mkdir qint
注意:在FTP服務器上根目錄下建立qint目錄
7、cd qint
注意:進入目錄qint,用“cd 你的目錄名”可以進入當前目錄的下一級目錄,這跟DOS一樣。
8、lcd d:\qint
注意:定位本地默認文件夾,在前面已事先在D:盤創建
9、delete *.*
注意:刪除服務器對應目錄qint中的所有文件。
10、cd ..
注意:返回至上一級目錄,即根目錄。返回上一級目錄用“cd ..”要注意,中間有空格。返回根目錄用“cd \”。
11、mrdir qint
注意:刪除目錄qint。刪除目錄,在此目錄下不能有文件及目錄,不然將無法刪除。
12、bye
注意:退出FTP服務器。
上傳下載時特別要注意服務器及本地電腦的當前目錄,文件是從哪里到哪里的問題。查看FTP服務器的當前目錄命令為pwd,可以用cd命令定位服務器的目錄。可以用lcd命令定位本地電腦的目錄。
以上實例應用到了采用FTP命令行方式上傳下載的最常用命令,你還可以用命令“?”查看更多的命令
需要注意的是:在使用關於ftp的bat文件的時候,不能把文件的名字命名為ftp,不然就回陷入死循環:
bat中用Telnet連接linux
文件都上傳好了,下面就是要到服務器端運行sh腳本了,這個時候可以使用Telnet,也可以windows裝軟件,使用ssh。這里我只介紹Telnet。
不啰嗦,直接上代碼:
.vbs代碼,.vbs和.bat必須放在同一目錄下
set sh=WScript.CreateObject("WScript.Shell") WScript.Sleep 300 sh.SendKeys "open 122.67.109.176{ENTER}" WScript.Sleep 300 sh.SendKeys "username{ENTER}" WScript.Sleep 400 sh.SendKeys "password{ENTER}" WScript.Sleep 400 sh.SendKeys "cd /data/install/pacakge{ENTER}" WScript.Sleep 400 sh.SendKeys "sh install.sh{ENTER}" WScript.Sleep 400 sh.SendKeys "exit{ENTER}" WScript.Sleep 300 sh.SendKeys "{ENTER}" WScript.Sleep 300 sh.SendKeys "quit{ENTER}"
.bat代碼
rem 啟動telnet start telnet.exe rem batch telnet cscript //nologo tel.vbs del tel.vbs
通過把操作重定向到文件中,然后運行Telnet。解釋就不解釋了,大家按照這個方法時可以得到自己想要的結果的。
終於,完成了任務,也學到了很多,如果有什么不足的大家可以留言呦,互相學習