轉載請著名出處: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檔案內看一下:
exec.cmd
檔案內容set 234=hello
call echo %234%
exec.cmd
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:
call 命令第一部分 ^
命令第二部分
多條命令一般用這三類操作符分割 &
&&
||
&
操作符
命令1 & 命令2
先執行命令1
再執行命令2
,命令1
不論執行成功與否都會執行命令2
,這樣就起到了忽略錯誤命令列
&&
操作符
命令1 && 命令2
先執行命令1
再執行命令2
,命令1
執行成功才會執行命令2
,命令有前後依賴會用到此操作符
example:
xcopy hello.txt D:\ /s /e /y && (echo ok ) || (echo error)
因為有的命令會返回操作狀態(成功/失敗),&&
也可接收這一狀態並判斷
|
操作符
命令1 | 命令2
管道操作符,命令1
是命令2
的操作物件,例如:
E:\self\mee_full\blogs\tmp\files>echo hello youth | findstr "y"
hello youth
||
操作符
命令1 || 命令2
就是命令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
除外)