windows CMD命令的一些使用方法及注意事項

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文件內看一下:

  • 定義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 這類開頭的判斷命令則不存在多條命令連續執行換行停止問題.

對於像echodirzipmvnjava等等這類命令,建議命令前加一個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 可用字節

尤其是命令放在cmdbat文件內時一定要使用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除外)🎈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章