---
title: 'Batch 指令教學'
disqus: hackmd
---
# Batch指令教學 - 1
## 目錄
[TOC]
## Errorlevel介紹
```
Errorlevel是用來判斷上條指令執行的狀況
執行結果的回傳碼0通常是代表執行成功,非0則代表其他意義
```
常用在IF條件式中,指令為:
**IF [NOT] ERRORLEVEL number command_1 ELSE command_2**
它的含意是,如果Errorlevel >= number時,執行command_1,否則執行command_2
也可在CMD上輸入 **echo %errorlevel%**
如此可以取得目前Errorlevel的值
## IF條件式
:::info
目的是在在批次檔中執行條件處理
:::
IF [NOT] 比較表達式 (
Coommand_1
) else (
Command_2
)
**!!需注意的是 ELSE 子句必須出現在 IF 之後的同一行!!**
有三種Pattern:
**1. IF [NOT] ERRORLEVEL number command
2. IF [NOT] string_1==string_2 command
3. IF [NOT] EXIST filename command**
**!!注意!!**
以下命令無法作用,因為 del 命令必須以換行字元來結尾:
> **IF EXIST filename. del filename. ELSE echo filename. missing**
下面命令也無法作用,因為 ELSE 命令必須在與 IF 命令同一行的結尾:
> **IF EXIST filename. del filename.
> ELSE echo filename. missing**
下面命令只有在寫成一行時才能作用:
> **IF EXIST filename. (del filename.) ELSE echo filename. missing**
For迴圈
---
:::info
用來重複的執行某些指令
:::
介紹For之前必須先了解有三點須注意:
1. For 迴圈初始化變數,**在撰寫為批次檔時,請使用 %%variable,而在命令列執行時要改用 %variable。**
2. For 迴圈**初始化變數有大小寫的區分**,所以 %%i 不同於 %%I。
3. **For 迴圈內的變數會有取值異常的情形**。
在批次檔下,指令模板如下:
**FOR %%variable IN (set) DO 命令 [command-parameters]**
其中command-parameters為所指定的**命令指定變數或參數**。
基於第1點注意事項,在命令列下模板如下:
**FOR %variable IN (set) DO 命令 [command-parameters]**
可以啟用擴充命令,簡單的有 /D、/R、/L 三種 ( 進階用法有/F,未在此篇說明 ) :
1. FOR /D %variable IN (set) DO command [command-parameters]
>如果 set 中包含萬用字元,則指定與目錄名稱相符,而不是與檔案名稱相符。
2. FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
>在樹狀目錄中切換 [drive:] 路徑,並於樹狀目錄的每一個目錄下執行 FOR 陳述式。
>如果未在 /R 之後指定目錄規格,則採用目前的目錄。如果 set 只是單一句
點 (.) 字元,則它只會列舉樹狀目錄。
3. FOR /L %variable IN (start,step,end) DO command [command-parameters]
>set 是從開頭到結尾一次跳一步的連續數字。所以(1,1,5) 會產生連續值 (1 2 3 4 5)
>而 (5,-1,1)會產生連續值 (5 4 3 2 1)
例如:
1. 顯示出Current Directory的所有檔案,並且顯示過程會暫停1秒
```=
for /d %%i in (*) do (
echo %%i
timeout 1
)
```
2. 顯示1、2、3、4、5
```=
for /L %%x in (1, 1, 10) do (
echo %%x
)
```
3. 將 D:\ 目錄與所有子目錄下的 *.bak 刪除
```=
for /R D:\ %%G in (*.bak) do del "%%G"
```
4. 累加1~100
```=
set sum=0
for /L %%i IN (100, -1, 1) DO set /a sum+=%%i
echo %sum%
```
Choice介紹
---
:::info
這個工具可以讓使用者從一些選擇中選取一個項目,並傳回所選項目的索引。
:::
指令如下:
**CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]**
參數清單:
```
/C choices 指定要建立的選擇清單。
預設清單是 "YN"。
/N 將選擇清單隱藏在提示中。
已經顯示提示之前的訊息,選擇仍在啟用中。
/CS 啟用會區分英文大小寫的選擇以供選取。
預設的情況是公用程式不會區分英文大小寫。
/T timeout 做出預設選擇之前要暫停的秒數。
可接受的值介於 0 到9999。
如果指定 0 的話,將不會暫停並將選取預設選擇。
/D choice 在 XXXX 秒之後指定預設選擇。
字元必須在以 /C 選項所指定的選擇組之中,而且必須以 /T 指定 XXXX。
/M text 指定出現在提示之前的訊息。未指定的話,
公用程式將只顯示提示字元。
/? 顯示這個說明訊息。
```
如果我運行命令:CHOICE /C YNC /M "確認請按 Y,否請按 N,或者取消請按 C。"
屏幕上會顯示:
確認請按 Y,否請按 N,或者取消請按 C。 [Y,N,C]?
以下程式碼可以執行看看,方便讀者了解(如果出現亂碼,請修改編碼):
```=
@echo off
choice /C ABC /M "請輸入A/B/C:"
if errorlevel 3 goto end
if errorlevel 2 goto B
if errorlevel 1 goto A
:A
echo A
goto end
:B
echo B
goto end
:end
echo good bye
pause
```
Curl指令
---
:::info
可用來下載或上傳檔案
:::
**Usage: curl [options...] <url>**
```
-d, --data <data> HTTP POST data
-f, --fail Fail silently (no output at all) on HTTP errors
-h, --help <category> Get help for commands
-i, --include Include protocol response headers in the output
-o, --output <file> Write to file instead of stdout
-O, --remote-name Write output to a file named as the remote file
-s, --silent Silent mode
-T, --upload-file <file> Transfer local FILE to destination
-u, --user <user:password> Server user and password
-A, --user-agent <name> Send User-Agent <name> to server
-v, --verbose Make the operation more talkative
-V, --version Show version number and quit
auth Different types of authentication methods
connection Low level networking operations
curl The command line tool itself
dns General DNS options
file FILE protocol options
ftp FTP protocol options
http HTTP and HTTPS protocol options
imap IMAP protocol options
misc Options that don't fit into any other category
output Filesystem output
pop3 POP3 protocol options
post HTTP Post specific options
proxy All options related to proxies
scp SCP protocol options
sftp SFTP protocol options
smtp SMTP protocol options
ssh SSH protocol options
telnet TELNET protocol options
tftp TFTP protocol options
tls All TLS/SSL related options
upload All options for uploads
verbose Options related to any kind of command line output of curl
```
舉幾個簡單常用的用法:
1. 取得網頁內容並且輸出到螢幕
curl http://www.example.com
2. 取得網頁內容並且輸出到檔案
curl -o page.html http://www.example.com
3. 取得網頁內容,並且輸出到指定的Proxy
curl -x proxy.abc.com:8080 http://www.example.com
4. 取得包含Header的網頁內容
curl -i http://www.example.com
5. 取得網路上的檔案
curl "https://download.sysinternals.com/files/Procdump.zip" --output "C:/Procdump.zip"
## Tar.exe工具
:::info
可讓使用者將檔案解壓縮
:::
Usage:
```
List: tar.exe -tf <archive-filename>
Extract: tar.exe -xf <archive-filename>
Create: tar.exe -cf <archive-filename> [filenames...]
Help: tar.exe --help
```
例如:
**tar.exe -xf "C:/Procdump.zip"**
可用來解壓縮檔案,並且將Procdump.zip內解壓出來的檔案放到C:/下