備忘錄_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星期%