背景
部署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。解释就不解释了,大家按照这个方法时可以得到自己想要的结果的。
终于,完成了任务,也学到了很多,如果有什么不足的大家可以留言呦,互相学习