本文叫“ 初嘗Windows 下批處理編程”是為了延續上一篇“初嘗 Perl”,其實對於博主而言批處理以及批處理編程早就接觸過了。
本文包括以下內容
1、什么是批處理
2、常用批處理命令
3、簡介批處理編程結構
4、一個批處理游戲代碼欣賞
5、總結
什么叫批處理
批處理(Batch)通常被認為是一種簡化的腳本語言,它應用於DOS和Windows系統中,它是由DOS或者Windows系統內嵌的解釋器(通常是COMMAND.COM或者CMD.EXE)解釋運行。類似於Unix中的Shell腳本。批處理文件具有.bat或者.cmd的擴展名。在Windows下運用批出處理的主要目的是完成自動化操作(如無人值守安裝程序、批量處理txt數據等或許這些操作需要調用外部程序)
Shell 在計算機科學中,是指“提供用戶使用界面”的軟件,通常指的是命令行界面的解析器。一般來說,這個詞是指操作系統中,提供訪問內核所提供之服務的程序。Shell也用於泛指所有為用戶提供操作界面的程序,也就是程序和用戶交互的層面。因此與之相對的是程序內核(英語:Core),內核不提供和用戶的交互功能。
通常將Shell分為兩類:命令行與圖形界面。命令行殼層提供一個命令行界面(CLI);而圖形殼層提供一個圖形用戶界面(GUI)
常用批處理命令
一、DOS下的常用批處理命令
屏幕顯示控制:
① echo 回顯控制(在命令提示符或DOS下,每執行一條命令都會顯示在屏幕上,這就叫回顯)
echo on :: 打開回顯 echo off :: 關閉回顯 @echo off :: 關閉回顯,且連這句都不顯示,常用 echo hello world :: echo 還有打印的功能
② cls 清屏命令
③ @ 符號
如某條命令前加@關閉該命令的回顯
@cls @echo hello World
文件控制:
① edit 文本文件的創建和編輯
② del 文件的刪除
格式: del [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
③ copy/move 文件的復制和移動
常用格式: copy/move 原文件路徑/原文件名 新路徑
move a.txt c:\xx ::將 當前目錄下的a.txt 移動c:\xx目錄下
指令其余格式可以查看命令幫助
④ ren 文件重命名
格式: REN [drive:][path]filename1 filename2.
例:
:: 將當前目錄下的所有文件改為jpg文件 :: * 是通配符,代表任意數量的字符 ren * *.jpg
⑤ attrib 設置或更改文件屬性
例:
attrib +s +a +h +r Z:\bak\tools :: 對照上面解釋不言自明
文件夾控制:
① cd(chdir) 顯示或改變當前目錄名稱
格式:cd [drive:]path
常用格式列舉:
cd
cd.. 返回上級目錄
cd\ 返回根目錄
cd fullPath
效果:
② md(mkdir) 創建文件夾
格式 md [drive:]path
可以嵌套創建文件夾,如 md a\b\c\d
③ rd(rmdir) 刪除一個文件夾
格式:rd [/s] [/q] [drive:]path
/s 的意思刪除指定目錄下的所有文件以及子目錄
/q 安靜模式,不向用戶詢問是否刪除
比如刪除上面建立的文件夾
rd /s /q z:\a
文件和文件夾共同的命令:
① dir 顯式目錄中文件和子目錄列表,詳細參數見下圖
② tree 顯式目錄結構
常用格式:
tree > z:\C_result.txt :: 當前路徑為C盤根目錄
運行結果:
一些特殊符號:
① 重定向符號 > 與 >>
重定向符號就是傳遞和覆蓋的意思,它所起的作用是將運行的結果傳遞到后面的范圍(后邊可以是文件,也可以是默認的系統控制台,即命令提示符)。
例: tree /f > z:\result.txt :: 把當前目錄的樹形目錄結構打印到 result.txt 文件中
> 與 >> 的區別
> 是完全覆蓋以前文件內容
>> 是在以前文件內容后面接着寫
② 命令管道符 |
表示把在它之前的命令或語句的執行結果作為在它之后的命令或語句的處理對象,即,就是把它之前的輸出作為它之后的輸入。
例:
:: 查找qq.exe進程 如找到就結束 tasklist | find /i "qq.exe" && taskkill /f /im qq.exe
③ 組合命令 & 與 && 及 ||
& 順序執行多條命令,前面命令執行失敗了,不影響后邊的命令執行
:: 查找電腦 Z盤 Y 盤 以及 C盤下目錄和文件 dir z:\ & dir y:\ & dir c:\
&& 順序執行多條命令,當碰到執行錯誤的命令則停止執行,如無錯則一直執行下去
:: 由於我的電腦沒有y盤,故批處理執行到 dir y:\ 出錯后就停止 dir z:\ && dir y:\ && dir c:\
|| 順序執行多條命令,當碰到執行錯誤的命令才往后執行,如遇到執行正確的命令則停止
:: 大家敲下這代碼就不言自明了 dir y:\ || dir z:\ || dir c:\
④ 轉義字符 ^
如 echo ^>
⑤ 變量引用符 %
定義變量(后面批處理編程結構會提到)var 后,用兩個%%包圍變量的方式引用此變量 %var%
⑥ 界定符 ””
當路徑中有空格,需用英文狀態下的雙引號“ ”” ” 包圍路徑
如:
cd "c:\Program Files"
其余指令和符號:
命令 /? 命令幫助
pause 暫停批處理程序
type 顯式文本文件的內容
ver 顯式操作系統版本
rem 注釋符號
:: 注釋符號
xcopy 復制文件和目錄
* 通配符 表示任意多個字符
? 通配符 表示一個字符
find 搜索字符串
exit 退出命令
二、Windows 下的命令
網絡相關:
① ping
常用參數
-t 一直 ping
-l 指定包的字節數,最大 65500 字節
ping [-l 65500 最大字節數] IP [-t]
② ipconfig 顯示當前電腦TCP/IP 配置
常用參數:
/all 顯示所有信息
/flushdns 刷新DNS信息
/renew 更新 DHCP 配置
③ arp 顯式或修改ARP
arp –a :: 顯式 ARP表
更多命令參見 arp /?
④ netstat TCP統計
常用
netstat -nao
netstat -nao > z:\tcpstat.txt
⑤ tracert 路由追蹤命令
例: tracert www.baidu.com
更多命令參見 tracert /?
⑥ pathping 路程信息查看
例: pathping www.baidu.cm

更多參數詳見 pathping /?
⑦ telnet (推薦用 SecureCRT)
磁盤相關:
①chkdsk 磁盤檢測和修復(弱弱的修復
)
詳見 chkdsk /?
② subst 將驅動器與路徑關聯(在第一家公司寫代碼需要指定統一路徑時用過)
創建 subst 虛擬磁盤: 物理磁盤路徑
刪除 subst 虛擬磁盤: /d
系統相關:
①driverquery 顯示已安裝驅動(個人覺得用處不大
)
② systeminfo 獲取系統配置信息(個人覺得用處不大
)
③ regsvr32 注冊或卸載某個動態鏈接庫
regsvr32 /u或/i *.dll(*.ocx)
更多參數 詳見 regsvr32 /?
④ tasklist 顯式進程列表
用法相見 tasklist /?
⑤ taskkill 結束指定進程
我常用的格式:
taskkill /f /im 映像名 例如 關閉所有 IE 進程 taskkill /f /im iexplore.exe 結合 tasklist 和 taskkill 使用 tasklist | find /i "qq.exe" && taskkill /f /im qq.exe
⑥ shutdown 關閉計算機
shutdown/s 關閉計算機
shutdown/r 重啟計算機
shutdown/a 放棄關閉計算機
更多參數詳見shutdown/?
⑦ sc 命令系列
sc create 創建服務
例:
::創建MyService,執行文件為c:\windows\system32\zfServ.exe sc create MyService binpath=c:\windows\system32\zfServ.exe
sc delete 刪除服務
:: 刪除MyService sc delete MyService
sc start 啟動服務
:: 啟動服務 MyService sc start MyService
sc stop 停止服務
::停止服務 MyService sc delete MyService
更多參數詳見 sc/?
簡介批處理編程結構
批處理作為一個腳本語言也有編程語言的基本結構——變量、條件語句、循環語句、函數(批處理中與此類似的是過程)
一、變量
鍵入set命令 查看所有已知變量(環境變量、內置系統變量)
批處理變量命名:不區分大小寫
set varA =311
變量都是弱類型的(腳本語言嘛
)
區分空格
set varA = "sss"
set varA="ss"
是兩個變量
如果需要用局部變量則用
setlocal
set 語句
endlocal
引用變量用 兩個 %% 包圍 如 %varA%
數學運算
+ 加、-減、*乘、/除、%求模
set /a 數學表達式
如
::total 自加1
set /a total+=1
二、條件語句——if 語句
格式:
if cond (
statement_1
...
statement_n
)
[else(
statement_1
..
statement_n
)]
方括號“[]”的含義為可選
例子
if "%1"=="1" (echo is one) else ( echo is not one)
比較運算符
== 判斷相等
equ 判斷相等
lss 小於
leq 小於或等於
gtr 大於
geq 大於或等於
三、循環語句——for 循環
基本格式: for iterator do (statements)
①遍歷一系列的值
格式 :
for /L %%var in (start, step, end) do (statements) rem var 是單字母變量 如 %%i,如果是多字母變量如 %%aa 會報錯
例
@echo off for /l %%B in (0,1,15) do echo %%B
② 對文件的遍歷
格式:
for %%var in (fileSets) do (statements) rem fileSets 文件的集合
例1:
rem 打印 C盤下的txt文件
@echo off for %%i in (C:\*.txt) do echo %%i
rem 打印 C盤下的txt和 sys 文件
@echo off for %%i in (C:\*.txt C:\*.sys) do echo %%i
③ 對文件夾的遍歷
格式:
for /d %%var in (directorySet) do (statements) rem directorySet 目錄的集合
例:
@echo off for /d %%i in (Z:\) do echo %%i :: 對 Z:\ 下目錄的遍歷 @echo off for /d %%i in (Z:\*) do echo %%i ::多個目錄的例子 @echo off for /d %%i in (%SystemRoot%\* Z:\*) do echo %%i
④ 遞歸對文件遍歷
格式:
for /r [path] %%var in (fileSet) do (statements)
例子
@echo off for /r C:\ %%i in (*.txt) do echo %%i
⑤ /r 與 /d 結合
::輸出 %SystemRoot% 下的所有目錄及子目錄 @echo off for /r %SystemRoot% /d %%i in (*) do echo %%i
四、函數——在批處理編程中稱過程
① 不帶參數的函數
@echo off echo 調用前 pause call :sub ::調用子過程 echo 調用后 pause exit :sub echo 子過程調用中 pause goto :eof
② 帶參數的函數
@echo off set a=5 set b=4 call :add %a% %b% ::調用子過程 echo 兩個數的和為%sum% pause exit :add set /a sum=%1+%2 goto :eof
一個批處理游戲代碼欣賞
先看效果
源碼:
@echo off & setlocal enabledelayedexpansion mode con cols=22 lines=11 color b0 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: set touzhu=100 :begin set count=10000 echo 你現在有10000元賭資 ping -n 3 127.0.0.1>nul cls :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :first cls set/p touzhu=請輸入投注錢數 echo 按任意鍵開始游戲 if %touzhu% gtr %count% goto err pause>nul set/a user=%random%%%6+1 for /l %%i in (1,1,500) do ( cls echo ○ echo. echo ○ cls echo ● ● echo ○ ○ echo ○ ○ cls echo ○ ○ echo ● echo ○ ○ cls echo. echo ● echo. cls echo ○ ○ echo. echo ○ ○ cls echo ○ echo ● echo ○ cls ) goto %user% :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :start set/a computer=%random%%%6+1 if %user% equ %computer% echo 電腦的點數是%computer% & echo. & echo 打平了! & echo 你現在的賭資是!count! & pause & goto end if %user% gtr %computer% echo 電腦的點數是%computer% & echo. & echo 你贏了! & set/a count=%count%+%touzhu% & echo 你現在的賭資是!count! & pause & goto end if %user% lss %computer% echo 電腦的點數是%computer% & echo. & echo 你輸了! & set/a count=%count%-%touzhu% & echo 你現在的賭資是!count! & pause & goto end goto err :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :6 echo ● ● echo ○ ○ echo ○ ○ echo. ping -n 2 127.0.0.1>nul goto start :5 echo ○ ○ echo ● echo ○ ○ echo. ping -n 2 127.0.0.1>nul goto start :4 echo ○ ○ echo. echo ○ ○ echo. ping -n 2 127.0.0.1>nul goto start :3 echo ○ echo ● echo ○ echo. ping -n 2 127.0.0.1>nul goto start :2 echo ○ echo. echo ○ echo. ping -n 2 127.0.0.1>nul goto start :1 echo. echo ● echo. ping -n 2 127.0.0.1>nul goto start :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :err echo 錯誤…… ping -n 2 127.0.0.1>nul goto first :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :end if %count% leq 0 echo 你輸光了! & goto last if %count% geq 20000 echo 電腦輸光了! & goto last cls echo 按任意鍵進行下一輪賭博 pause>nul cls goto first :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :last echo 重玩?(是/y,否/n) set/p aa= if %aa% equ y cls & goto begin if %aa% equ Y cls & goto begin exit
總結
在Windows平台下批處理還是很有用的,一些簡單的任務用批處理來實現會效果不錯,但是比較復雜的任務用批處理編程實現就有點力有不逮了,或許能實現但是比其他語言比起來費力得多。總之簡單的任務用簡單的方法實現(考慮下批處理),這也許就是批處理腳本語言最好的歸宿。
本文完














