2017年8月17日 星期四

Windows Command Line (cmd script)





這邊算是比較重點式的筆記

如果想要比較詳細的初學者教學 我推薦以下這篇
https://lnpcd.blogspot.tw/2012/09/00.html

基本指令

/? 查詢各命令說明
dir 顯示目錄資料夾
cls 清除訊息
pause 暫停畫面
exit 離開
cd 進入目標路徑
md 創建目錄資料夾
rd 移除目錄資料夾
(目錄中無任何檔案)
del 移除檔案
tasklist 工作管理員
taskkill 移除程序
type 讀取檔案內容
echo 印出/輸出訊息
echo on 顯示輸入命令
echo off 不顯示輸入命令
timeout 等待
timeout /t 10 等候10秒 需要按任意鍵繼續
timeout /t 10 /nobreak 等候10秒 不需要按任意鍵繼續
rem 註解
:: 註解
: 標籤
. 包含此資料夾
.. 回到上一層資料夾
* 配對任何字元
> 輸入模式(覆蓋)
>> 輸入模式(附加)
@ 此行命令不顯示
&& 同行內執行多道命令
find 尋找目標字元
start 開啟程式

流程控制/迴圈執行 (使用腳本)

set

@echo off

:: 設定a為變數
set a=5
echo %a%

:: 設定a為文字
set a=abc
echo %a%

:: 錯誤示範 a不為運算式後的結果
set a=1+2+3
echo %a%

:: 設定a和b為運算式後的結果
set /a a=(1+2+3)
echo %a%
set /a b=(5%%2)
echo %b%

:: 設定a為等待被輸入的參數
set /p a=
echo %a%

:: 暫停畫面
pause

Output:
1. 5
2. abc
3. 1+2+3
4. a=6 b=1 (5除2的餘數)
5. 輸入什麼就顯示什麼

if

@echo off

:: 判斷字串
set a=X
if %a%==X echo Y1

:: 判斷數值

set a=7
if %a%==7 echo Y2

:: 錯誤示範 判斷運算結果

if 6==1+2+3 (echo Y3) else (echo N3)

:: (包含附檔名)
if exist "set.bat" echo Y4

:: 否定判斷
if not 7==5 echo Y5

:: 大於小於等於
if 7 gtr 5 echo Y6

:: 不符合判斷的處理 (else) 一
if 7==5 (echo Y7) else (echo N7)

:: 不符合判斷的處理 (else) 二
if 7==5 (echo Y8
) else (echo N8)

:: 不符合判斷的處理 (else) 三
if 7==5 (
echo Y9
) else (
echo N9
)

:: 雙重判斷
if 5==5 (
if 7==5 (echo Y10) else (echo N10)
) else (
echo X
)

:: 暫停畫面
pause

Output:
1. Y1
2. Y2
3. N3
4. Y4
5. Y5
6. Y6
7. N7
8. N8
9. N9
10. N10

for

@echo off

:: 輸出集合中的元素 一
for %%i in (a b c) do echo %%i

echo **********
:: 輸出集合中的元素 二
for %%i in (a b c) do (
echo %%i
)

echo **********
:: 輸出數列 /l + (開始,步數,結束)
for /l %%i in (1,1,10) do (echo %%i)

echo **********
:: 雙迴圈
for /l %%i in (1,1,3) do (
for %%j in (a b c) do (
echo %%i-%%j
)
)

:: 暫停畫面
pause

Output:
1. a b c
2. a b c
3. 1~10
4. 1-a 1-b ..... 3-b 3-c 

other

:: 標記
:test

:: 傳遞參數 %0為腳本本身 (%1 %2 這裡為空)
echo %0 %1 %2

:: @ 此行不顯示
@ echo 1

:: 不顯示所有命令
echo off
echo 2

:: 不顯示此行命令也不顯示所有命令
@echo off
echo 3
@echo on
echo 4

:: 回到指定標記 (1回到開頭 0結束)
@echo off
echo (1) continue
echo (0) exit
set /p n=
if %n%==1 (
goto test
)

:: 暫停畫面
pause

advanced

@echo off

:: 注意迴圈內如何設定變數 (因為會立即性展開函式 所以使用!n! 延遲設定變數)

setlocal EnableDelayedExpansion
for /l %%i in (1,1,5) do (
for /l %%j in (1,1,5) do (
set /a n=%%i*%%j
echo !n!
)
echo ----------
)

:: 以字元a做分割 由於沒有指定tokens 所以只顯示到a之前

for /f "delims=a" %%i in (Test.txt) do echo %%i

echo **********
:: 檔案內第1行排除 且預設以空白做分割 所以只顯示到空白之前
for /f "skip=1" %%i in (Test.txt) do echo %%i

echo **********
:: 以空白做分隔 顯示第1,2,3個元素
for /f "tokens=1,2,3" %%i in (Test.txt) do echo %%i %%j %%k

echo **********
:: 以空白做分隔 顯示第1,2,3個元素(使用減號) 另外注意合併條件的寫法
for /f "tokens=1-3 skip=1" %%i in (Test.txt) do echo %%i%%j%%k

:: 暫停畫面

pause

Test.txt的內容為
This is a test
How are you
I am fine

Output:
2. This is / How / I (遇到a就斷掉)
3. How / I (跳過一行)
4. This is a / How are you / I am fine
5. Howareyou / Iamfine

return value (Python)

@echo off

:: 呼叫其他程式計算且顯示回傳結果
echo 輸入開始值:
set /p a=
echo 輸入結束值:
set /p b=
python show.py %a% %b%

:: python 運用exit()把結果傳回
set ans=%errorlevel%
echo 答案為 %ans%

:: 暫停畫面
pause

show.py

import os
import sys

sumX=0
#取得第1,2個參數
a=eval(sys.argv[1])
b=eval(sys.argv[2])+1
for i in range (a,b):
    sumX+=i

exit(sumX)

Output:
輸入1和10 答案55 (計算a到b的總和)