1、交互界面設計編程
沒啥說的,看看高手設計的菜單界面吧:windows
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
@
echo
off
cls
title 終極多功能修復
:menu
cls
color 0A
echo
.
echo
==============================
echo
請選擇要進行的操做,而後按回車
echo
==============================
echo
.
echo
1.網絡修復及上網相關設置,修復IE,自定義屏蔽網站
echo
.
echo
2.病毒專殺工具,端口關閉工具,關閉自動播放
echo
.
echo
3.清除全部多餘的自啓動項目,修復系統錯誤
echo
.
echo
4.清理系統垃圾,提升啓動速度
echo
.
echo
Q.退出
echo
.
echo
.
:cho
set
choice=
set
/p choice= 請選擇:
IF NOT
"%choice%"
==
""
SET
choice=%choice:~0,1%
if /i
"%choice%"
==
"1"
goto ip
if /i
"%choice%"
==
"2"
goto setsave
if /i
"%choice%"
==
"3"
goto kaiji
if /i
"%choice%"
==
"4"
goto clean
if /i
"%choice%"
==
"Q"
goto endd
echo
選擇無效,請從新輸入
echo
.
goto cho
|
只要學完本教程前面的章節,上面的程序應該能看懂了。網絡
2、if…else…條件語句dom
前面已經談到,DOS條件語句主要有如下形式
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
加強用法:IF [/I] string1 compare-op string2 command
加強用法中加上/I就不區分大小寫了!
加強用法中還有一些用來判斷數字的符號:編程語言
EQU - 等於
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於函數
上面的command命令均可以用小括號來使用多條命令的組合,包括else子句,組合命令中能夠嵌套使用條件或循環命令。工具
例如:學習
IF EXIST filename (
del filename
) ELSE (
echo filename missing
)測試
也可寫成:
if exist filename (del filename) else (echo filename missing)網站
但這種寫法不適合命令太多或嵌套命令的使用。
3、循環語句
一、指定次數循環
FOR /L %variable IN (start,step,end) DO command [command-parameters]
組合命令:
FOR /L %variable IN (start,step,end) DO (
Command1
Command2
……
)
二、對某集合執行循環語句。
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件。可使用通配符。
command 對每一個文件執行的命令,可用小括號使用多條命令組合。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 爲根的目錄樹,指向每一個目錄中的
FOR 語句。若是在 /R 後沒有指定目錄,則使用當前
目錄。若是集僅爲一個單點(.)字符,則枚舉該目錄樹。
同前面同樣,command能夠用括號來組合:
FOR /R [[drive:]path] %variable IN (set) DO (
Command1
Command2
……
commandn
)
三、條件循環
上面的循環結構是用for命令來實現的,for命令循環有一個缺點,就是整個循環被看成一條命令語句,涉及到變量延遲的問題。
利用goto語句和條件判斷,dos能夠實現條件循環,很簡單啦,看例子:
例:
1
2
3
4
5
6
7
8
9
10
|
@
echo
off
set
var=0
rem ************循環開始了
:continue
set
/a var+=1
echo
第%var%次循環
if %var% lss 100 goto continue
rem ************循環結束了
echo
循環執行完畢
pause
|
例:
1
2
3
4
5
6
7
8
9
10
|
@
echo
off
set
var=100
rem ************循環開始了
:continue
echo
第%var%次循環
set
/a var-=1
if %var% gtr 0 goto continue
rem ************循環結束了
echo
循環執行完畢
pause
|
4、子程序
在批處理程序中能夠調用外部可運行程序,好比exe程序,也可調用其餘批處理程序,這些也能夠看做子程序,可是不夠方便,若是被調用的程序不少,就顯得不夠簡明瞭,很繁瑣。
在windowsXP中,批處理能夠調用本程序中的一個程序段,至關於子程序,這些子程序通常放在主程序後面。
子程序調用格式:
CALL :label arguments
子程序語法:
:label
command1
command2
......
commandn
goto :eof
在子程序段中,參數%0指標籤:label
子過程通常放在最後,而且注意在主程序最後要加上exit或跳轉語句,避免錯誤的進入子過程。
子程序和主程序中的變量都是全局變量,其做用範圍都是整個批處理程序。
傳至子程序的參數在call語句中指定,在子程序中用%一、%2至%9的形式調用,而子程序返回主程序的數據只需在調用結束後直接引用就能夠了,固然也能夠指定返回變量,請看下面的例子。
子程序例1:
1
2
3
4
5
6
7
8
|
@
echo
off
call :sub return 你好
echo
子程序返回值:%return%
pause
:sub
set
%1=%2
goto :eof
|
運行結果:你好
子程序例2:設計一個求多個整數相加的子程序
1
2
3
4
5
6
7
8
9
10
11
12
|
@
echo
off
set
sum=0
call :sub sum 10 20 35
echo
數據求和結果:%sum%
pause
:sub
rem 參數1爲返回變量名稱
set
/a %1=%1+%2
shift /2
if not
"%2"
==
""
goto sub
goto :eof
|
運行結果:65
在win98系統中,不支持上面這種標號調用,須將子程序單獨保存爲一個批處理程序,而後調用。
5、用ftp命令實現自動下載
ftp是經常使用的下載工具,ftp界面中有40多個經常使用命令,本身學習了,不介紹了。這裏介紹如何用dos命令行調用ftp命令,實現ftp自動登陸,並上傳下載,並自動退出ftp程序。
其實能夠將ftp命令組合保存爲一個文本文件,而後用如下命令調用便可。
ftp -n -s:[[drive:]path]filename
上面的filename爲ftp命令文件,包括登陸IP地址,用戶名、密碼、操做命令等
例:
1
2
3
4
5
6
7
8
9
10
|
open 90.52.8.3 #打開ip
user iware #用戶爲iware
password8848 #密碼
bin #二進制傳輸模式
prompt
cd
tmp1 #切換至iware用戶下的tmp1目錄
pwd
lcd d:\download #本地目錄
mget * #下載tmp1目錄下的全部文件
bye #退出ftp
|
6、用7-ZIP實現命令行壓縮和解壓功能
語法格式:(詳細狀況見7-zip幫助文件,看得頭暈能夠跳過,用到再學)
7z <command> [<switch>...] <base_archive_name> [<arguments>...]
7z.exe的每一個命令都有不一樣的參數<switch>,請看幫助文件
<base_archive_name>爲壓縮包名稱
<arguments>爲文件名稱,支持通配符或文件列表
其中,7z是至命令行壓縮解壓程序7z.exe,<command>是7z.exe包含的命令,列舉以下:
a: Adds files to archive. 添加至壓縮包
a命令可用參數:
-i (Include)
-m (Method)
-p (Set Password)
-r (Recurse)
-sfx (create SFX)
-si (use StdIn)
-so (use StdOut)
-ssw (Compress shared files)
-t (Type of archive)
-u (Update)
-v (Volumes)
-w (Working Dir)
-x (Exclude)
b: Benchmark
d: Deletes files from archive. 從壓縮包中刪除文件
d命令可用參數:
-i (Include)
-m (Method)
-p (Set Password)
-r (Recurse)
-u (Update)
-w (Working Dir)
-x (Exclude)
e: Extract解壓文件至當前目錄或指定目錄
e命令可用參數:
-ai (Include archives)
-an (Disable parsing of archive_name)
-ao (Overwrite mode)
-ax (Exclude archives)
-i (Include)
-o (Set Output Directory)
-p (Set Password)
-r (Recurse)
-so (use StdOut)
-x (Exclude)
-y (Assume Yes on all queries)
l: Lists contents of archive.
t: Test
u: Update
x: eXtract with full paths用文件的完整路徑解壓至當前目錄或指定目錄
x命令可用參數:
-ai (Include archives)
-an (Disable parsing of archive_name)
-ao (Overwrite mode)
-ax (Exclude archives)
-i (Include)
-o (Set Output Directory)
-p (Set Password)
-r (Recurse)
-so (use StdOut)
-x (Exclude)
-y (Assume Yes on all queries)
7、調用VBScript程序
使用 Windows 腳本宿主,能夠在命令提示符下運行腳本。CScript.exe 提供了用於設置腳本屬性的命令行開關。
用法:CScript 腳本名稱 [腳本選項...] [腳本參數...]
選項:
//B 批模式:不顯示腳本錯誤及提示信息
//D 啓用 Active Debugging
//E:engine 使用執行腳本的引擎
//H:CScript 將默認的腳本宿主改成 CScript.exe
//H:WScript 將默認的腳本宿主改成 WScript.exe (默認)
//I 交互模式(默認,與 //B 相對)
//Job:xxxx 執行一個 WSF 工做
//Logo 顯示徽標(默認)
//Nologo 不顯示徽標:執行時不顯示標誌
//S 爲該用戶保存當前命令行選項
//T:nn 超時設定秒:容許腳本運行的最長時間
//X 在調試器中執行腳本
//U 用 Unicode 表示來自控制檯的重定向 I/O
「腳本名稱」是帶有擴展名和必需的路徑信息的腳本文件名稱,如d:\admin\vbscripts\chart.vbs。
「腳本選項和參數」將傳遞給腳本。腳本參數前面有一個斜槓 (/)。每一個參數都是可選的;但不能在未指定腳本名稱的狀況下指定腳本選項。若是未指定參數,則 CScript 將顯示 CScript 語法和有效的宿主參數。
8、將批處理轉化爲可執行文件:
因爲批處理文件是一種文本文件,任何人均可以對其進行隨便編輯,不當心就會把裏面的命令破壞掉,因此若是將其轉換成.com格式的可執行文件,不只執行效率會大大提升,並且不會破壞原來的功能,更能將優先級提到最高。Bat2Com就能夠完成這個轉換工做。
小知識:在DOS環境下,可執行文件的優先級由高到低依次爲.com>.exe>.bat>.cmd,即若是在同一目錄下存在文件名相 同的這四類文件,當只鍵入文件名時,DOS執行的是name.com,若是須要執行其餘三個文件,則必須指定文件的全名,如name.bat。
這是一個只有5.43K大小的免費綠色工具,能夠運行在純DOS或DOS窗口的命令行中,用法:Bat2Com FileName,這樣就會在同一目錄下生成一個名爲FileNme.com的可執行文件,執行的效果和原來的.bat文件同樣。
9、時間延遲
什麼是時間延遲?顧名思義,就是執行一條命令後延遲一段時間再進行下一條命令。
延遲的應用見下節:「模擬進度條」。
一、利用ping命令延時
例:
1
2
3
4
5
|
@
echo
off
echo
延時前:%time%
ping /n 3 127.0.0.1 >nul
echo
延時後:%time%
pause
|
解說:用到了ping命令的「/n」參數,表示要發送多少次請求到指定的ip。本例中要發送3次請求到本機的ip(127.0.0.1)。127.0.0.1可簡寫爲127.1。「>nul」就是屏蔽掉ping命令所顯示的內容。
二、利用for命令延時
例:
1
2
3
4
5
|
@
echo
off
echo
延時前:%time%
for /l %%i in (1,1,5000) do
echo
%%i>nul
echo
延時後:%time%
pause
|
解說:原理很簡單,就是利用一個計次循環並屏蔽它所顯示的內容來達到延時的目的。
三、利用vbs延遲函數,精確度毫秒,偏差1000毫秒內
例:
1
2
3
4
5
6
7
8
9
10
11
12
|
@
echo
off
echo
%time%
call :delay 5000
echo
%time%
pause
exit
:delay
echo
WScript.
Sleep
%1>delay.vbs
CScript //B delay.vbs
del
delay.vbs
goto :eof
|
運行顯示:
10:44:06.45
10:44:11.95
請按任意鍵繼續. . .
上面的運行結果顯示實際延時了5500毫秒,多出來的500毫秒時創建和刪除臨時文件所耗費的時間。偏差在一秒以內。
四、僅用批處理命令實現任意時間延遲,精確度10毫秒,偏差50毫秒內
僅用批處理命令就能夠實現延遲操做。
例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@
echo
off
set
/p delay=請輸入需延遲的毫秒數:
set
TotalTime=0
set
NowTime=%time%
::讀取起始時間,時間格式爲:13:01:05.95
echo
程序開始時間:%NowTime%
:delay_continue
set
/a minute1=1
%
NowTime:~3,2%-100
::讀取起始時間的分鐘數
set
/a second1=1
%
NowTime:~-5,2%%NowTime:~-2
%
0-100000
::將起始時間的秒數轉爲毫秒
set
NowTime=%time%
set
/a minute2=1
%
NowTime:~3,2%-100
:: 讀取如今時間的分鐘數
set
/a second2=1
%
NowTime:~-5,2%%NowTime:~-2
%
0-100000
::將如今時間的秒數轉爲毫秒
set
/a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
if %TotalTime% lss %delay% goto delay_continue
echo
程序結束時間:%time%
echo
設定延遲時間:%delay%毫秒
echo
實際延遲時間:%TotalTime%毫秒
pause
|
運行顯示:
請輸入需延遲的毫秒數:6000
程序開始時間:15:32:16.37
程序結束時間:15:32:22.37
設定延遲時間:6000毫秒
實際延遲時間:6000毫秒
請按任意鍵繼續. . .
實現原理:首先設定要延遲的毫秒數,而後用循環累加時間,直到累加時間大於等於延遲時間。
偏差:windows系統時間只能精確到10毫秒,因此理論上有可能存在10毫秒偏差。
經測試,當延遲時間大於500毫秒時,上面的延遲程序通常不存在偏差。當延遲時間小於500毫秒時,可能有幾十毫秒偏差,爲何?由於延遲程序自己也是有運行時間的,同時系統時間只能精確到10毫秒。
爲了方便引用,可將上面的例子改成子程序調用形式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@
echo
off
echo
程序開始時間:%Time%
call :delay 10
echo
實際延遲時間:%totaltime%毫秒
echo
程序結束時間:%time%
pause
exit
::-----------如下爲延時子程序--------------------
:delay
@
echo
off
if
"%1"
==
""
goto :eof
set
DelayTime=%1
set
TotalTime=0
set
NowTime=%time%
::讀取起始時間,時間格式爲:13:01:05.95
:delay_continue
set
/a minute1=1
%
NowTime:~3,2%-100
set
/a second1=1
%
NowTime:~-5,2%%NowTime:~-2
%
0-100000
set
NowTime=%time%
set
/a minute2=1
%
NowTime:~3,2%-100
set
/a second2=1
%
NowTime:~-5,2%%NowTime:~-2
%
0-100000
set
/a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
if %TotalTime% lss %DelayTime% goto delay_continue
goto :eof
|
10、模擬進度條
下面給出一個模擬進度條的程序。若是將它運用在你本身的程序中,可使你的程序更漂亮。
1
2
3
4
5
6
7
8
9
10
11
12
|
@
echo
off
mode con cols=113 lines=15 &color 9f
cls
echo
.
echo
程序正在初始化. . .
echo
.
echo
┌──────────────────────────────────────┐
set
/p= ■<nul
for /L %%i in (1 1 38) do
set
/p a=■<nul&ping /n 1 127.0.0.1>nul
echo
100%%
echo
└──────────────────────────────────────┘
pause
|
解說:「set /p a=■<nul」的意思是:只顯示提示信息「■」且不換行,也不需手工輸入任何信息,這樣可使每一個「■」在同一行逐個輸出。「ping /n 0 127.1>nul」是輸出每一個「■」的時間間隔,即每隔多少時間輸出一個「■」。
11、特殊字符的輸入及應用
開始 -> 運行 -> 輸入cmd -> edit -> ctrl+p(意思是容許輸入特殊字符)-> 按ctrl+a將會顯示笑臉圖案。
(若是要繼續輸入特殊字符請再次按ctrl+p,而後ctrl+某個字母)
以上是特殊字符的輸入方法,選自[英雄]教程,很管用的。也就是用編輯程序edit輸入特殊字符,而後保存爲一文本文件,再在windows下打開此文件,複製其中的特殊符號便可。
一些簡單的特殊符號能夠在dos命令窗口直接輸入,並用重定向保存爲文本文件。
例:
C:>ECHO ^G>temp.txt
「^G」是用Ctrl+G或Alt+007輸入,輸入多個^G能夠產生多聲鳴響。
特殊字符的應用也頗有意思,這裏僅舉一例:退格鍵
退格鍵表示刪除左邊的字符,此鍵不能在文檔中正常輸入,但能夠經過edit編輯程序錄入並複製出來。即「」。
利用退格鍵,能夠設計閃爍文字效果
例:文字閃爍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@
echo
off
:start
set
/p=牀前明月光<nul
::顯示文字,光標停於行尾
ping
-n
0 127.0.0.1>nul
::設置延遲時間
set
/p a=<nul
:: 輸出一些退格符將光標置於該行的最左端(退格符的數量能夠本身調整)。
set
/p a= <nul
::輸出空格將以前輸出的文字覆蓋掉。
set
/p a=<nul
::再次輸出退格符將光標置於該行的最左端,這裏的退格符數量必定不能比前面的空格數少。
::不然光標不能退到最左端。
goto start
|
例:輸出唐詩一首,每行閃動屢次
set str=牀前明月光 疑是地上霜 舉頭望明月 低頭思故鄉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
::定義字符串str
for %%i in (%str%) do (
rem 因爲str中含有空格,則以空格爲分隔符將str中的每個部分依次賦給變量%%i。
set
char=%%i
echo
.
echo
.
for /l %%j in (0,1,5) do (
set
/p=!char:~%%j,1!<nul
rem 依次取出變量char中的每個字符,並顯示。
ping
-n
0 127.0.0.1>nul
rem 設置輸出每一個字符的時間延遲。
)
call :hero %%i
)
pause>nul
exit
:hero
for /l %%k in (1,1,10) do (
ping /n 0 127.0.0.1>nul
set
/p a=<nul
set
/p a= <nul
set
/p a=<nul
ping /n 0 127.0.0.1>nul
set
/p a=%1<nul
)
::文字閃動
goto :eof
|
12、隨機數(%random%)的應用技巧
%RANDOM% 系統變量 返回 0 到 32767 之間的任意十進制數字。由 Cmd.exe 生成。
2的15次方等於32768,上面的0~32767實際就是15位二進制數的範圍。
那麼,如何獲取100之內的隨機數呢?很簡單,將%RANDOM%按100進行求餘運算便可,見例子。
例:生成5個100之內的隨機數
1
2
3
4
5
6
7
|
@
echo
off
setlocal enabledelayedexpansion
for /L %%i in (1 1 5) do (
set
/a randomNum=!random!%%100
echo
隨機數:!randomNum!
)
pause
|
運行結果:(每次運行不同)
隨機數:91
隨機數:67
隨機數:58
隨機數:26
隨機數:20
請按任意鍵繼續. . .
求餘數運算set /a randomNum=!random!%%100中的100能夠是1~32768之間的任意整數。
總結:利用系統變量%random%,求餘數運算%%,字符串處理等,能夠實現不少隨機處理。
思考題目:生成給定位數的隨機密碼
解答思路:將26個英文字母或10數字以及其它特殊字符組成一個字符串,隨機抽取其中的若干字符。
參考答案1:(簡單)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@
echo
off
call :randomPassword 5 pass1 pass2
echo
%pass1% %pass2%
pause
exit
:randomPassword
::---------生成隨機密碼
::---------%1爲密碼長度,%2及之後爲返回變量名稱
::--------
-for
命令最多隻能區分31個字段
@
echo
off
set
password_len=%1
if not defined password_len goto :eof
if %password_len% lss 1 goto :eof
set
wordset=a b c d e f g
h
i j k l m n o p q
r
s t u v w x y z
set
return=
set
num=0
:randomPassword1
set
/a num+=1
set
/a numof=%random%%%26+1
for /f
"tokens=%numof% delims= "
%%i in (
"%wordset%"
) do
set
return=%return%%%i
if %num% lss %password_len% goto randomPassword1
if not
"%2"
==
""
set
%2=%return%
shift /2
if not
"%2"
==
""
goto randomPassword
goto :eof
|
參考答案2:(最優
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
@
echo
off
call :randomPassword 6 pass1 pass2 pass3
echo
%pass1% %pass2% %pass3%
pause
exit
:randomPassword
::---------生成隨機密碼
::---------%1爲密碼長度,%2及之後爲返回變量名稱
::--------
-goto
循環、變量嵌套、命令嵌套
@
echo
off
if
"%1"
==
""
goto :eof
if %1 lss 1 goto :eof
set
password_len=%1
set
return=
set
wordset=abcdefghijklmnopqrstuvwxyz023456789_
::---------------------------循環
:randomPassword1
set
/a numof=%random%%%36
call
set
return=%return%%%wordset:~%numof%,1%%
set
/a password_len-=1
if %password_len% gtr 0 goto randomPassword1
::---------------------------循環
if not
"%2"
==
""
set
%2=%return%
shift /2
if not
"%2"
==
""
goto randomPassword
goto :eof
|
說明:本例涉及到變量嵌套和命令嵌套的應用,見後。
十3、變量嵌套 與 命令嵌套
和其它編程語言相比,dos功能顯得相對簡單,要實現比較複雜的功能,須要充分運用各類技巧,變量嵌套與命令嵌套就是此類技巧之一。
先複習一下前面的「字符串截取」的關鍵內容:
**********************************************
截取功能統一語法格式爲:%a:~[m[,n]]%
**********************************************
方括號表示可選,%爲變量標識符,a爲變量名,不可少,冒號用於分隔變量名和說明部分,符號~能夠簡單理解爲「偏移」便可,m爲偏移量(缺省爲0),n爲截取長度(缺省爲所有)。
百分號若是須要當成單一字符,必須寫成%%
以上是dos變量處理的通用格式,若是其中的m、n爲變量,那麼這種狀況就是變量嵌套了。
好比設變量word爲「abcdefghij」,變量num爲「123456789」
%word:~4,1%爲e,其中4能夠從變量num中取值,即%num:~3,1%,寫成組合形式以下:
%word:~%num:~3,1%,1% 經測試這種寫法不能正確執行,寫成%word:~(%num:~3,1%),1%一樣不行,那麼,怎麼實現這種變量嵌套呢?這就必須結合命令嵌套。
什麼是命令嵌套呢?簡單的說,首先用一條dos命令生成一個字符串,而這個字符串是另外一條dos命令,用call語句調用字符串將其執行,從而獲得最終結果。
例:用call語句實現命令嵌套
1
2
3
4
5
6
7
8
|
@
echo
off
set
str1=aaa
echo
ok bbb
echo
初始字符串:%str1%
echo
生成命令字符串以下:
echo
%str1:~4,7%
echo
運行命令字符串生成最終結果爲:
call %str1:~4,7%
pause
|
運行顯示:初始字符串:aaa echo ok bbb生成命令字符串以下:echo ok運行命令字符串生成最終結果爲:ok請按任意鍵繼續. . .