備忘錄_20160105(定位)
修改
回首頁
程式 2025-04-01 17:06:46 1743498406 100
windows 的 cmd 指令參考
windows 的 cmd 指令參考
(結論:很難用,而且處處有侷限,很容易踩坑!)
@echo off
rem 切換編碼
rem 65001 代表 utf-8
rem 下面的 > nul 會把輸出消失掉
chcp 65001 > nul
rem 展示註解
goto lblNotes20250401093800
單行註解可用 rem
單行註解可用 ::
多行註解可用 goto
真的是非常的神奇!
但多行註解的標籤,每次都要想唯一的名字,比較麻煩。
:lblNotes20250401093800
rem 文字變數處理
set str1="哈囉,
echo %str1%
set str2=批次檔指令。"--'單引號雙引號都算是文字,沒有其他意涵'
echo %str2%
set str3=%str1%%str2%
echo %str3%
rem 兩個百分比符號 等同於 一個百分比符號
set strPercent=%%
echo %strPercent%
rem 字串擷取
rem
rem 指令為 %variable:~start,length%
rem start 是從零起算的,若用負數,則是倒數
set str4=一二三四五六七八九十甲乙丙丁戊己庚辛六七八九
echo %str4:~0,2%
:: 這會輸出 一二
echo %str4:~3,4%
:: 這會輸出 四五六七
echo %str4:~8%
:: 這會輸出 九十甲乙丙丁戊己庚辛六七八九
echo %str4:~-3%
:: 這會輸出 七八九
echo %str4:~-3,2%
:: 這會輸出 七八
rem 字串取代
rem
rem 指令為 %variable:old=new%
echo %str4:六七八=678%
:: 一二三四五678九十甲乙丙丁戊己庚辛678九
rem 數值變數處理
rem 雖然 /a 可以做數學運算,但只會是整數的運算,而且是無條件捨去喔!
set /a f1 = 38.7
set /a f2 = 7.97
set /a f3 = f1 + f2
set /a f4 = f1 - f2
set /a f5 = f1 * f2
set /a f6 = f1 / f2
set /a f7 = f1 %% f2
rem 整數可以正常計算,頂多計算後,小數點的部分被無條件捨去而已
set /a fShock1 = 41 * 7
:: 287
set /a fShock2 = 41 / 7
:: 5
rem 若一開始就有小數點,則解讀失敗,只剩下最前面的數字而已
set /a fShock3 = 41.3 * 7.5
:: 41
set /a fShock4 = 41.4 / 7.8
:: 41
echo f1 = %f1%
echo f2 = %f2%
echo %f1% + %f2% = %f3%
echo %f1% - %f2% = %f4%
echo %f1% * %f2% = %f5%
echo %f1% / %f2% = %f6%
echo %f1% mod %f2% = %f7%
echo 41 * 7 = %fShock1%
echo 41 / 7 = %fShock2%
echo 41.3 * 7.5 = %fShock3%
echo 41.4 / 7.8 = %fShock4%
rem 延遲變數展開
setlocal enabledelayedexpansion
set str5="你好,CMD!"
set /a iStart=1
set /a iLength=7
set str6=!str5:~%iStart%,%iLength%!
rem 第一回合先處理 %......%
rem 第二回合再處理 !......!
echo %str6%
:: 你好,CMD!
rem 條件判斷
rem 注意,if 沒有 and, or 可用!
rem 數值判斷
rem ------
rem equ 等於
rem neq 不等於
rem gtr 大於
rem lss 小於
rem geq 大於等於
rem leq 小於等於
set /a iNum1=38
rem 注意,右括號放哪邊可以很隨興,但左括號不能放到下一行喔!
if %iNum1% equ 38 ( echo %iNum1% equals to 38. )
:: 38 equals to 38.
rem 若一開始沒有左括號,則右括號就變成是文字了。
if %iNum1% equ 38 echo %iNum1% equals to 38. )
:: 38 equals to 38. )
rem 文字判斷
rem ------
rem == 等於
rem neq 不等於
rem gtr 大於
rem lss 小於
rem geq 大於等於
rem leq 小於等於
set strMessage1=不是 幸運七 也不是 幸運八
set strMessage2=幸運七
set strMessage3="幸運八 this is a test. It's good. 大家好"
set str7="幸運八 this is a test. It's good. 大家好"
rem 下面這幾行的預處理是為了避免字串中有雙引號而出現錯誤!
rem 這是把一個雙引號,變成兩個雙引號。
set strCmpMsg1=%strMessage1:"=""%
set strCmpMsg2=%strMessage2:"=""%
set strCmpMsg3=%strMessage3:"=""%
set strCmp7=%str7:"=""%
rem 用雙引號包夾,是為了避免字串中有空格存在。
if "%strCmp7%"=="%strCmpMsg1%" (
echo 'block1'
echo .str7 是 %strMessage1%
) else (
if "%strCmp7%"=="%strCmpMsg2%" (
echo 'block2'
echo ..str7 是 %strMessage2%
) else (
if "%strCmp7%"=="%strCmpMsg3%" (
echo 'block3'
echo ...str7 是 %strMessage3%
)
)
)
set str8=好的
set str8=%str8%%str8%
if %str8% neq 壞了 ( echo %str8% )
set str9_1=ABc0x
set str9_2=ABc0x
if %str9_1% == %str9_2% ( echo '-==-' )
if %str9_1% gtr %str9_2% ( echo '-gtr-' )
if %str9_1% lss %str9_2% ( echo '-lss-' )
if %str9_1% geq %str9_2% ( echo '-geq-' )
if %str9_1% leq %str9_2% ( echo '-leq-' )
rem 判斷檔案存在與否
set strFilename="822362.jpg"
if exist %strFilename% ( echo %strFilename% 檔案存在 ) else ( echo %strFilename% 檔案不存在 )
rem 忽略大小寫的文字判斷
set x1=Apple
set x2=applE
if /i %x1%==%x2% ( echo the same! ) else ( echo different! )
rem 迴圈處理
rem 天哪,迴圈的變數名稱,只能一個字(中英文都可以,但只能一個字)!!!!!!
for %%z in (1 2 3 4 5) do echo z = %%z
for %%蛋 in (1 2 3 4 5) do echo 蛋 = %%蛋
rem for /L %%變數 in (開始, 增量, 結束) do (命令)
for /l %%增 in (1, 2, 20) do ( echo 增 = %%增 )
for /l %%減 in (20, -3, 3) do ( echo 減 = %%減 )
rem 讀取檔案中,每個非空白行的第一個詞(不含左右空白)。
for /f %%i in (try.bat) do ( echo %%i )
rem 讀取檔案中,每行的文字。
for /f "tokens=* delims=" %%i in (try.bat) do ( echo.%%i )
rem 會用 echo 後面緊跟著小數點,再跟著變數名稱,這是因為可以防止空白作怪。
rem 當 echo 後面變數是空的的時候,就會出現 ECHO is on. 或 ECHO is off. 的情形。
rem 讀取指令的輸出
for /f %%i in ('dir D:\20241122_影音剪輯 /s/a/b') do ( echo %%i )
rem 讀取當前路徑下,所有子目錄名稱
for /d %%i in (*) do ( echo %%i )
rem 讀取所有目錄名稱(包含隱藏的資料夾)
for /f %%i in ('dir /ad/b') do ( echo %%i )
rem 讀取c槽windows底下,第一層子目錄名稱
for /d %%i in (c:\windows\*) do ( echo %%i )
rem 讀取所有子資料夾與檔案
for /r "D:\20241122_影音剪輯" %%i in (*) do ( echo %%i )
rem 進行類似 split 的拆分,當資料超過26個的時候,那就要自求多福了。
set strFruits=蘋果,香蕉,橘子,藍莓
for /f "tokens=1-4 delims=," %%a in ("%strFruits%") do (
echo 水果1 = %%a
echo 水果2 = %%b
echo 水果3 = %%c
echo 水果4 = %%d
)
rem 下面 split 的拆分,可以閃過變數名稱不夠用的問題。
rem 可用空白或逗號做分隔。
set "str10=蘋果,香蕉,橘子,藍莓"
for %%z in (%str10%) do ( echo 水果 = %%z )
rem 要關閉 延遲變數展開,這樣驚嘆號才不會被變成是指令
rem 注意,半形空白和逗號都被當成分隔符號囉!
setlocal disabledelayedexpansion
for %%i in ("This is a test!" 大家好 Hello, world!) do ( echo _%%i )
:: _"This is a test!"
:: _大家好
:: _Hello
:: _world!
rem 日期時間處理 (年月日時分秒,星期幾......)
echo 日期:%date%
echo 時間:%time%
rem 四個token的先後順序,要實際在作業系統中跑一遍才會知道,而且也有可能變更,要特別注意!
for /f "tokens=1-4 delims=/ " %%a in ("%date%") do (
set str星期=%%a
set str年=%%b
set str月=%%c
set str日=%%d
)
for /f "tokens=1-3 delims=:" %%a in ("%time%") do (
set str時=%%a
set str分=%%b
set str秒=%%c
rem 在這個區塊中,只能有 %%a, %%b, %%c
rem 當你要操控 str秒,那是會失敗的!
)
rem 要操控 str秒 只能在區塊之外!!!
set str秒=%str秒:~0,2%
echo %str年%-%str月%-%str日% %str時%:%str分%:%str秒% %str星期%