windows CMD命令的一些使用方法及注意事项
转载请著名出处:https://www.cnblogs.com/funnyzpc/p/17572397.html
一.执行路径或参数带中文、空格、特殊字符、数字问题
首先说不论是执行路径还是脚本参数均不能包含或使用这四类字符[中文、空格、特殊字符、数字]
执行路径还是变量是一定不可以以数字开头的,变量也不建议使用纯数字,例如:
在cmd窗口定义并执行:- E:\self\mee_full\blogs\bin\tmp>set 234=hello
- E:\self\mee_full\blogs\bin\tmp>call echo %234%
- hello
复制代码 看起来是没什么问题,但是我们将命令写在cmd文件内看一下:
- set 234=hello
- call echo %234%
复制代码- E:\self\mee_full\blogs\bin\tmp>exec.cmd
- E:\self\mee_full\blogs\bin\tmp>set 234=hello
- E:\self\mee_full\blogs\bin\tmp>call echo 34
- 34
复制代码 可看到输出的是34,这明显是错误的,这种情况一定要具体实践才会明白,一定要留意~
如果路径中出现空格或者中文一定建议您用双引号(英文输入法下的)包起来 : /目录1/目录2/命令
-
- E:\self\mee_full\blogs\bin\哈了\tmp>E:\self\mee_full\blogs\bin\tmp\zip -r ../qq.zip ./files
- 'E:\self\mee_full\blogs\bin\哈了' 不是内部或外部命令,也不是可运行的程序
- 或批处理文件。
- E:\self\mee_full\blogs\bin\tmp>
复制代码 使用双引号包起来就没问题了:- E:\self\mee_full\blogs\bin\哈了\tmp>
- E:\self\mee_full\blogs\bin\哈了\tmp>"E:\self\mee_full\blogs\bin\tmp\zip" -r ../qq.zip ./files
- updating: files/DateUtil.java (172 bytes security) (deflated 70%)
- updating: files/DelayTask.java (172 bytes security) (deflated 48%)
- updating: files/excel/ (260 bytes security) (stored 0%)
- updating: files/excel/CellBaseType.java (172 bytes security) (deflated 64%)
- updating: files/excel/CellFmt.java (172 bytes security) (deflated 67%)
- updating: files/excel/ExcelDataReflectUtil.java (172 bytes security) (deflated 73%)
- updating: files/excel/ExcelReadUtil.java (172 bytes security) (deflated 85%)
- updating: files/excel/ExcelWriteUtil.java (172 bytes security) (deflated 81%)
- updating: files/excel/PoiCellProcess.java (172 bytes security) (deflated 84%)
- updating: files/excel/PoiCellStyleProcess.java (172 bytes security) (deflated 74%)
复制代码 二.脚本文件命令连续执行换行问题
连续执行问题之前也一直困扰着我,后来不断实践倒有了些心得~
像 if exist 这类开头的判断命令则不存在多条命令连续执行换行停止问题.
对于像echo、dir、zip、mvn、java等等这类命令,建议命令前加一个call即可~
example:- E:\self\mee_full\blogs\bin\tmp>
- E:\self\mee_full\blogs\bin\tmp>call echo hello
- hello
- E:\self\mee_full\blogs\bin\tmp>call dir
- 驱动器 E 中的卷是 DATA
- 卷的序列号是 DA15-004D
- E:\self\mee_full\blogs\bin\tmp 的目录
- 2023/07/20 14:47 <DIR> .
- 2023/07/20 14:47 <DIR> ..
- 2018/12/01 23:15 69,120 bzip2.dll
- 2023/07/20 14:48 34 exec.cmd
- 2023/07/20 11:07 <DIR> files
- 2018/12/01 23:15 237,056 zip.exe
- 3 个文件 306,210 字节
- 3 个目录 925,669,171,200 可用字节
复制代码 尤其是命令放在cmd或bat文件内时一定要使用call
三.变量定义及引用问题
变量被引用的前提是一定要被定义,不论是来自于命令行还是来自于set命令定义的,都需要有!
首先说如何定义吧~
1.在执行脚本文件命令行定义
比如这样- E:\self\mee_full\blogs\bin\tmp>exec.cmd aa bb cc
- E:\self\mee_full\blogs\bin\tmp>exec.bat aa bb cc
复制代码 在exec脚本文件内接收这三个参数(aa,bb,cc)需使用参数索引获得:- set VALUE1=%1% // aa
- set VALUE2=%2% // bb
- set VALUE3=%3% // cc
复制代码 上面是定义了接收变量的,实际也可以不使用接收变量~
2.在cmd执行命令行(裸命令)或脚本文件内
声明: set aa=hello
使用: echo %aa% or call echo %aa%
example:- E:\self\mee_full\blogs\bin\tmp>set aa=hello
- E:\self\mee_full\blogs\bin\tmp>echo %aa%
- hello
复制代码 注意:定义的变量名强烈建议使用大写,使用时更易分辨!
四.批量压缩文件问题
windows并未内置zip相关命令工具,不论是cmd还是powershell都没有,所以这就需要我们自行安装zip相关工具。
windows下可以实现zip相关功能的工具大概有这俩,这是我用到过的:
1.使用7z
这个工具十分好用,既可以GUI操作,也可以使用命令行操作,使用命令行则为:- %---- 若 7z.exe 安装在这个地方 ---%
- C:\Program Files\7-Zip\7z.exe
- %---- 则具体执行命令 ---%
- "C:\Program Files\7-Zip\7z" a 压缩后的文件.zip 文件夹或文件
复制代码 7z请自行搜素下载,这里不提供哈~
2.使用bzip2
这是个命令行用的bzip2工具。
具体使用如下:- %----若 7z.exe 安装在这个地方 ---%
- D:\zips\zip.exe
- %---- 执行的命令 ---%
- D:\zips\zip -r 压缩后的文件.zip 文件夹或文件
复制代码 bzip2工具在autoDeploy内有提供,也可以去bzip官网下载
五.命令换行问题
这个问题其实很简单,命令行尾用 ^ 就好
example:六.忽略执行及多条命令执行问题
多条命令一般用这三类操作符分割 & && ||
先执行命令1再执行命令2,命令1不论执行成功与否都会执行命令2,这样就起到了忽略错误命令行
先执行命令1再执行命令2,命令1执行成功才会执行命令2,命令有前后依赖会用到此操作符
example:- xcopy hello.txt D:\ /s /e /y && (echo ok ) || (echo error)
复制代码 因为有的命令会返回操作状态(成功/失败),&&也可接收这一状态并判断
管道操作符,命令1是命令2的操作对象,例如:- E:\self\mee_full\blogs\tmp\files>echo hello youth | findstr "y"
- hello youth
复制代码 就是命令1出错、运行不成功才执行命令2
*单条批量执行脚本样例
- @echo off
- %chcp 65001%
- %-----必要参数(需要填的!)-----%
- %项目目录%
- set PROJECT_DIR=D:\workspace\mee-web
- %工具7z安装目录%
- set ZIP_EXEC_PATH="C:\Program Files\7-Zip\7z"
- %压缩文件包名称%
- set FILE_NAME=mee-web.zip
- %服务器IP%
- set SSH_IP=192.168.76.60
- %服务器端口%
- set SSH_PORT=22
- %服务器登录用户%
- set SSH_USER=root
- %服务器登录密码%
- set SSH_PASSWORD=root@1233
- %服务器工作目录%
- set SSH_DIR=/home/nginx/tmp
- %其他变量(不用动),输出当前路径%
- set BAT_PATH=%cd%
- %-----打包&构建-----%
- call cd %PROJECT_DIR% ^
- & rd/s/q dist ^
- & del /a/f/q %FILE_NAME% ^
- & npm run build:uat --scripts-prepend-node-path=auto ^
- && %ZIP_EXEC_PATH% a %FILE_NAME% ./dist/** ^
- && echo upload file to server... ^
- && cd %BAT_PATH% ^
- && %BAT_PATH%\bin\pscp -P %SSH_PORT% -pw %SSH_PASSWORD% %PROJECT_DIR%\%FILE_NAME% %SSH_USER%@%SSH_IP%:%SSH_DIR% ^
- && echo invoke server command... ^
- && %BAT_PATH%\bin\plink -pw %SSH_PASSWORD% -P %SSH_PORT% %SSH_USER%@%SSH_IP% "cd %SSH_DIR% && unzip -o %FILE_NAME% && rm -rf %FILE_NAME%" ^
- && echo success! ^
- && pause
复制代码 *单行执行脚本样例
- @echo off
- %chcp 65001%
- %-----必要参数(需要填的!)-----%
- %项目目录%
- set PROJECT_DIR=D:\workspace\mee-web
- %工具7z安装目录%
- set ZIP_EXEC_PATH="C:\Program Files\7-Zip\7z"
- %压缩文件包名称%
- set FILE_NAME=mee-web.zip
- %服务器IP%
- set SSH_IP=192.168.10.1
- %服务器端口%
- set SSH_PORT=22
- %服务器登录用户%
- set SSH_USER=root
- %服务器登录密码%
- set SSH_PASSWORD=root@1233
- %服务器工作目录%
- set SSH_DIR=/home/nginx/tmp
- %其他变量(不用动),输出当前路径%
- set BAT_PATH=%cd%
- %-----打包-----%
- call cd %PROJECT_DIR%
- if exist dist rd/s/q dist
- if exist %FILE_NAME% del /a/f/q %FILE_NAME%
- call npm run build:uat --scripts-prepend-node-path=auto
- call %ZIP_EXEC_PATH% a %FILE_NAME% ./dist/**
- call dir
- %-----构建-----%
- call echo upload file to server...
- call cd %BAT_PATH%
- call %BAT_PATH%\bin\pscp -P %SSH_PORT% -pw %SSH_PASSWORD% %PROJECT_DIR%\%FILE_NAME% %SSH_USER%@%SSH_IP%:%SSH_DIR%
- call echo invoke server command...
- call %BAT_PATH%\bin\plink -pw %SSH_PASSWORD% -P %SSH_PORT% %SSH_USER%@%SSH_IP% "cd %SSH_DIR% && unzip -o %FILE_NAME% && rm -rf %FILE_NAME%"
- %auther by shadow%
- call echo success!
- pause
复制代码 以上所有样例及用到的命令行工具均在此https://github.com/funnyzpc/autoDeploy有提供(7z除外)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |