第一節(jié)(批處理基礎(chǔ))
各位非常批處理的朋友們,現(xiàn)在我們開始學(xué)習(xí)
批處理新手系列教學(xué)的第一課!(適合沒有編程經(jīng)驗(yàn)的朋友)
按照慣例,先講一下什么是"批處理".顧名思義,批處理就是把一批或者說是一條條命令放在一個(gè)文本里,然后批量執(zhí)行!執(zhí)行這
一批命令的文件的擴(kuò)展名是
BAT或者
CMD,把任何一批命令放入在有這樣擴(kuò)展名的文件里,執(zhí)行時(shí)里面的命令就會(huì)一條條的執(zhí)行完,當(dāng)然
我們還可以在其中加入一些邏輯判斷的語句,讓里面的命令在滿足一定條件時(shí)執(zhí)行指定的命令.
了解了大概意思后,我們正式開始學(xué)習(xí).先看一個(gè)簡單的例子!
@echo off
echo "歡迎來到非常BAT!"
pause
把上面的3條命令保存為test.bat或者test.cmd然后執(zhí)行,他就會(huì)在屏幕上顯示二行話:"歡迎來到非常BAT!請(qǐng)按任意鍵繼續(xù). . ."
這就是一個(gè)簡單批處理文件了,我們來分析一下.
這個(gè)批處理文件一共就用了2條命令 "echo" 和"pause" 還有一個(gè)特殊符號(hào)"@"
@符號(hào)在批處理中的作用是關(guān)閉當(dāng)前行命令的回顯,也就是不顯示執(zhí)行的是什么命令,只顯示命令的結(jié)果!
你可以執(zhí)行下面這個(gè)批處理文件來理解,保存為*.bat或者*.CMD
@echo 你好
echo 你好
@pause
echo命令的作用有兩個(gè),一個(gè)是在CMD上回顯一行內(nèi)容.如:echo "歡迎來到非常BAT!",還一個(gè)是關(guān)閉命令的回顯:echo off
echo off的作用就相當(dāng)于在每條命令前面加一個(gè)@符號(hào),這樣所有的命令將只會(huì)顯示結(jié)果不顯示命令.
我們?cè)趀cho off這命令前加一個(gè)@符號(hào)是為了不讓echo off這條命令本身顯示出來,讓批處理更完美!
pause命令就是暫停的意思,防止批處理執(zhí)行完后直接退出!執(zhí)行pause命令后會(huì)
自動(dòng)在CMD里顯示"請(qǐng)按任意鍵繼續(xù). . ."這樣一行話!
從上面這個(gè)簡單的批處理中,我們可以發(fā)現(xiàn)其實(shí)批處理就是運(yùn)用一些含有特殊意義的符號(hào)和一些完成指定功能的命令組合而成,那么
在批處理中有多少這樣的特殊符號(hào)和功能命令呢?我們現(xiàn)在就來仔細(xì)了解一下一些最常用的!
(以下內(nèi)容來源網(wǎng)絡(luò),請(qǐng)各位仔細(xì)閱讀,好進(jìn)入下節(jié)的實(shí)例說明)
批處理的常見命令
REM
ECHO
GOTO
CALL
PAUSE
IF
還有(FOR,SETLOCAL,SHIFT)這幾個(gè)命令比較難,不適合寫在
基礎(chǔ)篇,以后說明!
批處理定義:顧名思義,批處理文件是將一系列命令按一定的順序集合為一個(gè)可執(zhí)行的文本文件,其擴(kuò)展名為BAT。
這些命令統(tǒng)稱批處理命令。
介紹命令
1、REM
REM是個(gè)注釋命令,一般用來給程序加上注解,該命令后的內(nèi)容在
程序執(zhí)行時(shí),將不會(huì)被顯示和執(zhí)行。
例:REM 這個(gè)命令就是注釋
這一句將不會(huì)被執(zhí)行
2、ECHO
ECHO是一個(gè)回顯命令,主要參數(shù)有OFF和ON。一般用ECHO MESSAGE來顯示一個(gè)特定的消息。
例:
Echo off
Rem 以上代表關(guān)閉回顯(就是不顯示所執(zhí)行的命令)
Echo 這個(gè)就是消息(message)
Rem 以上代表顯示“這就是消息(message)”這列
字符
咱們來看看執(zhí)行結(jié)果:
3、GOTO
GOTO會(huì)點(diǎn)編程的朋友就會(huì)知道這是跳轉(zhuǎn)的意思。
在批處理中允許以“:XXX”來構(gòu)建一個(gè)標(biāo)號(hào),然后用GOTO XXX直接來執(zhí)行標(biāo)號(hào)后的命令。
例:
:lable
REM 上面就是名為LABEL的標(biāo)號(hào)
DIR C:"
DIR D:"
GOTO lable
REM 以上程序跳轉(zhuǎn)標(biāo)號(hào)LABEL處繼續(xù)執(zhí)行
咱們來看看結(jié)果:
4、CALL
CALL命令可以在批處理執(zhí)行過程中調(diào)用另一個(gè)批處理,當(dāng)另一個(gè)批處理執(zhí)行完后,再繼續(xù)執(zhí)行原來的批處理
例:
創(chuàng)建一個(gè)2.BAT,內(nèi)容如下
ECHO 這就是2的內(nèi)容
創(chuàng)建一個(gè)1.BAT,內(nèi)容如下
ECHO 這是1的內(nèi)容
CALL 2.BAT
ECHO 1和2的內(nèi)容全部顯示完成。
執(zhí)行1.BAT,來看看結(jié)果:
5、PAUSE
PAUSE,玩
游戲的人都知道,暫停的意思
在這里就是停止
系統(tǒng)命令的執(zhí)行并顯示下面的內(nèi)容。
例:
PAUSE
6、IF
IF 條件判斷語句,語法格式如下:
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
解釋下:
[NOT]:將返回結(jié)果取反值,就是“如果沒有”的意思
ERRORLEVEL:
是命令執(zhí)行完成后返回的退出值
Number:
退出值的數(shù)字取值范圍0~255,判斷時(shí)值的排列順序應(yīng)該由大到小。返回的值大于等于指定的值時(shí),條件成立
string1==string2:
string1和string2都為字符的數(shù)據(jù),英文內(nèi)字符的大小寫將看作不同,這個(gè)條件中的等于號(hào)必須是兩個(gè)(絕對(duì)相等的意思)
條件相等后即執(zhí)行后面的command
EXIST filename:
為文件或目錄存在的意思
IF ERRORLEVEL這個(gè)句子必須放在某一個(gè)命令的后面,執(zhí)行命令后由IF ERRORLEVEL 來判斷命令的返回值。
例:
(1)
IF [NOT] ERRORLEVEL number command
檢測命令執(zhí)行完后的返回值做出判斷
echo off
dir z:
rem 如果退出
代碼為1(不成功)就跳至標(biāo)題1處執(zhí)行
IF ERRORLEVEL 1 goto 1
REM 如果退出代碼為0(成功)就跳至標(biāo)題0處執(zhí)行
IF ERRORLEVEL 0 goto 0
:0
echo 命令執(zhí)行成功!
Rem 程序執(zhí)行完畢跳至標(biāo)題exit處退出
goto exit
:1
echo 命令執(zhí)行失敗!
Rem 程序執(zhí)行完畢跳至標(biāo)題exit處退出
goto exit
:exit
Rem 這里是程序的出口
(2)IF string1==string2 command
檢測當(dāng)前變量的值做出判斷
ECHO OFF
IF 1==2 goto no
Echo 變量相等!
goto exit
:no
echo 變量不相等
goto exit
:exit
看看效果,敲擊這個(gè)命令1.bat 數(shù)字
(3)IF [NOT] EXIST filename command
發(fā)現(xiàn)特定的文件做出判斷
echo off
IF not EXIST auto
exec.bat goto 1
echo 文件存在成功!
goto exit
:1
echo 文件不存在失敗!
goto exit
:exit
這個(gè)批處理大家可以放在C盤和D盤分別執(zhí)行,看看效果
特殊符號(hào):
1. @
2. >
3. >>
4. |
5. ^
6. &
7. &&
8. ""
9. ,
10. ;
廢話少說,開講了
一、 @
這個(gè)字符在批處理中的意思是關(guān)閉當(dāng)前行的回顯。我們從前幾課知道
ECHO OFF可以關(guān)閉掉整個(gè)批處理命令的回顯,但不能關(guān)掉ECHO OFF這個(gè)命令,現(xiàn)在我們?cè)贓CHO OFF這個(gè)命令前加個(gè)@,就可以達(dá)到所
有命令均不回顯的要求
1.bat
echo off
dir d:"
2.bat
@echo off
dir d:"
二、 >
這個(gè)字符的意思是傳遞并且覆蓋,他所起的作用是將運(yùn)行的回顯結(jié)果傳遞到后面的范圍(后邊可以是文件,也可以是默認(rèn)的系統(tǒng)控
制臺(tái))
比如:
文件1.txt 的文件內(nèi)容是:
1+1
使用命令:dir *.txt >1.txt
這時(shí)候1.txt 內(nèi)容如下
驅(qū)動(dòng)器 C 中的卷沒有標(biāo)簽。
卷的序列號(hào)是 3827-1BDD
C:" 的目錄
2004-05-25 00:57 17,755,907 Log.txt
2004-05-26 15:21 3 1.txt
2004-05-26 15:21 0 2.txt
3 個(gè)文件 17,755,910 字節(jié)
0 個(gè)目錄 339,111,936 可用字節(jié)
三、>>
這個(gè)符號(hào)的作用和>有點(diǎn)類似,但他們的區(qū)別是>>是傳遞并在文件的末尾追加,而>是覆蓋
用法同上
同樣拿1.txt做例子
內(nèi)容是1+1
使用命令:dir *.txt >>1.txt
咱們來看看顯示的結(jié)果如何
四、|
這是一個(gè)管道傳輸命令,意思是將上一命令執(zhí)行的結(jié)果傳到下一個(gè)命令去處理
例如:
dir c:"|find "txt"
以上命令是:查找C:"所有,并發(fā)現(xiàn)TXT字符串。
FIND的功能請(qǐng)用 FIND /? 自行查看
在不使format的自動(dòng)格式化參數(shù)時(shí),我是這樣來自動(dòng)格式化A盤的
echo y|format a: /s /q /v:system
用過format的都知道,再格盤時(shí)要輸入y來確認(rèn)是否格盤,這個(gè)命令前加上echo y并用|字符來將echo y的結(jié)果傳給format命令
從而達(dá)到自動(dòng)輸入y的目的
(這條命令有危害性,測試時(shí)請(qǐng)慎重)
五、^
^是對(duì)特殊符號(hào)"<",">","&"的前導(dǎo)字符,在命令中他將以上3個(gè)符號(hào)的特殊功能去掉,僅僅只把他們當(dāng)成符號(hào)而不使用他們的特殊意
義。
比如
echo test ^>1.txt
結(jié)果則是
他沒有追加在1.txt里,呵呵。只是顯示了出來
六、 &
這個(gè)符號(hào)允許在一行中使用2個(gè)以上不同的命令,當(dāng)?shù)谝粋€(gè)命令執(zhí)行失敗了,也不影響后邊的命令執(zhí)行。
比如:
dir z:" & dir y:" & dir c:"
以上命令會(huì)連續(xù)顯示z,y,c盤的內(nèi)容,不理會(huì)該盤是否存在
七、 &&
這個(gè)命令和上邊的類似,但區(qū)別是,第一個(gè)命令失敗時(shí),后邊的命令也不會(huì)執(zhí)行
dir z:" && dir y:" && dir c:"
八、""
雙引號(hào)允許在字符串中包含空格,進(jìn)入一個(gè)特殊目錄可以用如下方法
cd "program files"
cd progra~1
cd pro*
以上三種方法都可以進(jìn)入program files這個(gè)目錄
九、,
逗號(hào)相當(dāng)于空格,在某些情況下“,”可以用來當(dāng)做空格使
比如
dir,c:"
十、;
分號(hào),當(dāng)命令相同時(shí),可以將不同目標(biāo)用;來隔離,但執(zhí)行效果不變,如執(zhí)行過程中發(fā)生錯(cuò)誤,則只返回錯(cuò)誤報(bào)告,但程序還是會(huì)
執(zhí)行。
比如:
dir c:";d:"e:";f:"
以上命令相當(dāng)于
dir c:"
dir d:"
dir e:"
dir f:"
就說這些了!各位有什么
意見請(qǐng)回貼!有什么疑問請(qǐng)到BAT
交流區(qū)發(fā)貼!下一節(jié)改進(jìn)!
第二節(jié)(for命令詳解)
看了看第一節(jié)的東西,發(fā)現(xiàn)那些簡單的命令都有詳細(xì)解釋,實(shí)在想不出什么更好的東西來解釋他們,就直接來一個(gè)"FOR命令詳解"在其中運(yùn)用這些東西來解釋吧!
講FOR之前呢,咋先告訴各位新手朋友,如果你有什么命令不懂,直接在CMD下面輸入:
name /? 這樣的格式來看系統(tǒng)給出的幫助文件,比如for /? 就會(huì)把FOR命令的幫助全部顯示出來!當(dāng)然許多菜鳥同志都看不懂....所以才會(huì)有那么多批處理文章!!!!俺也照顧菜鳥,把FOR命令用我自己的方式說明下!
正式開始:
FOR這條命令基本上都被用來處理文本,我們這次除了要說他處理文本的作用外還要講他的其他一些好用的功能!
看看他的基本格式(這里我引用的是批處理中的格式,直接在命令行只需要一個(gè)%號(hào))
FOR 參數(shù) %%變量名 IN (相關(guān)文件或命令) DO 執(zhí)行的命令
參數(shù):FOR有4個(gè)參數(shù) /d /l /r /f 他們的作用我在下面用例子解釋
%%變量名 :這個(gè)變量名可以是小寫a-z或者大寫A-Z,他們區(qū)分大小寫哦~
FOR會(huì)把每個(gè)讀取到的值給他!
IN:命令的格式,照寫就是了!
(相關(guān)文件或命令) :FOR要把什么東西讀取然后賦值給變量,不懂的話看下面的例子
do:命令的格式,照寫就是了!
執(zhí)行的命令:對(duì)每個(gè)變量的值要執(zhí)行什么操作就寫在這.
看不懂我的這些說明,可以在CMD輸入for /?看系統(tǒng)提供的幫助!我這里也給出來吧,大家對(duì)照
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一個(gè)單一字母可替換的參數(shù)。
(set) 指定一個(gè)或一組文件。可以使用通配符。
command 指定對(duì)每個(gè)文件執(zhí)行的命令。
command-parameters
為特定命令指定參數(shù)或命令行開關(guān)。
現(xiàn)在開始講每個(gè)參數(shù)的意思
/d
僅為目錄
如果 Set (也就是我上面寫的 "相關(guān)文件或命令") 包含通配符(* 和 ?),將對(duì)與 Set 相匹配的每個(gè)目錄(而不是指定目錄中的文件組)執(zhí)行指定的 Command。
這個(gè)參數(shù)其實(shí)我也沒弄太懂...有錯(cuò)誤希望各位糾正!
系統(tǒng)幫助的格式:FOR /D %%variable IN (set) DO command
他主要用于目錄搜索,不會(huì)搜索文件,看這樣的例子
@echo off
for /d %%i in (*) do @echo %%i
pause
把他保存放在C盤根目錄執(zhí)行,就會(huì)把C盤目錄下的全部目錄名字打印出來,而文件名字一個(gè)也不顯示!
在來一個(gè),比如我們要把當(dāng)前路徑下文件夾的名字只有1-3個(gè)字母的打出來
@echo off
for /d %%i in (???) do @echo %%i
pause
這樣的話如果你當(dāng)前目錄下有目錄名字只有1-3個(gè)字母的,就會(huì)顯示出來,沒有就不顯示了
這里解釋下*號(hào)和?號(hào)的作用,*號(hào)表示任意N個(gè)字符,而?號(hào)只表示任意一個(gè)字符
知道作用了,給大家個(gè)思考題目!
@echo off
for /d %%i in (window?) do @echo %%i
pause
保存到C盤下執(zhí)行,會(huì)顯示什么呢?自己看吧!
/D參數(shù)只能顯示當(dāng)前目錄下的目錄名字,這個(gè)大家要注意!
/R
遞歸
進(jìn)入根目錄樹 [Drive:]Path,在樹的每個(gè)目錄中執(zhí)行 for 語句。如果在 /R 后沒有指定目錄,則認(rèn)為是當(dāng)前目錄。如果 Set 只是一個(gè)句點(diǎn) (.),則只枚舉目錄樹。
系統(tǒng)幫助的格式:FOR /R [[drive:]path] %%variable IN (set) DO command
上面我們知道,/D只能顯示當(dāng)前路徑下的目錄名字,那么現(xiàn)在這個(gè)/R也是和目錄有關(guān),他能干嘛呢?放心他比/D強(qiáng)大多了!
他可以把當(dāng)前或者你指定路徑下的文件名字全部讀取,注意是文件名字,有什么用看例子!
@echo off
for /r c:" %%i in (*.exe) do @echo %%i
pause
咋們把這個(gè)BAT保存到D盤隨便哪里然后執(zhí)行,我會(huì)就會(huì)看到,他把C盤根目錄,和每個(gè)目錄的子目錄下面全部的EXE文件都列出來了!!!!
再來一個(gè)
@echo off
for /r %%i in (*.exe) do @echo %%i
pause
參數(shù)不一樣了吧!這個(gè)命令前面沒加那個(gè)C:"也就是搜索路徑,這樣他就會(huì)以當(dāng)前目錄為搜索路徑,比如你這個(gè)BAT你把他防災(zāi)d:"test目錄下執(zhí)行,那么他就會(huì)把D:"test目錄和他下面的子目錄的全部EXE文件列出來!!!
這個(gè)參數(shù)大家因該理解了吧!還是滿好玩的命令!
/L
迭代數(shù)值范圍
使用迭代變量設(shè)置起始值 (Start#),然后逐步執(zhí)行一組范圍的值,直到該值超過所設(shè)置的終止值 (End#)。/L 將通過對(duì) Start# 與
End# 進(jìn)行比較來執(zhí)行迭代變量。如果 Start# 小于 End#,就會(huì)執(zhí)行該命令。如果迭代變量超過
End#,則命令解釋程序退出此循環(huán)。還可以使用負(fù)的 Step# 以遞減數(shù)值的方式逐步執(zhí)行此范圍內(nèi)的值。例如,(1,1,5) 生成序列 1 2
3 4 5,而 (5,-1,1) 則生成序列 (5 4 3 2 1)。語法是:
系統(tǒng)幫助的格式:for /L %% Variable in (Start#,Step#,End#) do Command
看著這說明有點(diǎn)暈吧!咋們看例子就不暈了!
@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
保存執(zhí)行看效果,他會(huì)打印從1 2 3 4 5 這樣5個(gè)數(shù)字
(1,1,5)這個(gè)參數(shù)也就是表示從1開始每次加1直到5終止!
大會(huì)暈,就打印個(gè)數(shù)字有P用...好的滿足大家,看這個(gè)例子
@echo off
for /l %%i in (1,1,5) do start cmd
pause
執(zhí)行后是不是嚇了一跳,怎么多了5個(gè)CMD窗口,呵呵!如果把那個(gè) (1,1,5)改成 (1,1,65535)會(huì)有什么結(jié)果,我先告訴大家,會(huì)打開65535個(gè)CMD窗口....這么多你不死機(jī)算你強(qiáng)!
當(dāng)然我們也可以把那個(gè)start cmd改成md %%i 這樣就會(huì)建立指定個(gè)目錄了!!!名字為1-65535
看完這個(gè)被我賦予破壞性質(zhì)的參數(shù)后,我們來看最后一個(gè)參數(shù)
/f
"迭代及文件解析
使用文件解析來處理命令輸出、字符串及文件內(nèi)容。使用迭代變量定義要檢查的內(nèi)容或字符串,并使用各種 ParsingKeywords
選項(xiàng)進(jìn)一步修改解析方式。使用 ParsingKeywords 令牌選項(xiàng)指定哪些令牌應(yīng)該作為迭代變量傳遞。請(qǐng)注意:在沒有使用令牌選項(xiàng)時(shí),/F
將只檢查第一個(gè)令牌。
文件解析過程包括讀取輸出、字符串或文件內(nèi)容,將其分成獨(dú)立的文本行以及再將每行解析成零個(gè)或更多個(gè)令牌。然后通過設(shè)置為令牌的迭代變量值,調(diào)用 for 循環(huán)。默認(rèn)情況下,/F 傳遞每個(gè)文件每一行的第一個(gè)空白分隔符號(hào)。跳過空行。
系統(tǒng)幫助的格式:
for /F "ParsingKeywords" %% Variable in (FileNameSet) do Command
有沒有發(fā)現(xiàn)這個(gè)參數(shù)說明比上面幾個(gè)都多...沒辦法,人們用FOR命令主要也就是用/f參數(shù),FOR的主場啊!大家得好好看!
先來解釋下那個(gè)多出來的"ParsingKeywords"
他表示4個(gè)參數(shù)
eol=c - 指一個(gè)行注釋字符的結(jié)尾(就一個(gè))
skip=n - 指在文件開始時(shí)忽略的行數(shù)。
delims=xxx - 指分隔符集。這個(gè)替換了空格和跳格鍵的
默認(rèn)分隔符集。
tokens=x,y,m-n - 指每行的哪一個(gè)符號(hào)被傳遞到每個(gè)迭代
的 for 本身。這會(huì)導(dǎo)致額外變量名稱的分配。m-n
格式為一個(gè)范圍。通過 nth 符號(hào)指定 mth。如果
符號(hào)字符串中的最后一個(gè)字符星號(hào),
那么額外的變量將在最后一個(gè)符號(hào)解析之后
分配并接受行的保留文本。
usebackq - 指定新語法已在下類情況中使用:
在作為命令執(zhí)行一個(gè)后引號(hào)的字符串并且一個(gè)單
引號(hào)字符為文字字符串命令并允許在 filenameset
中使用雙引號(hào)擴(kuò)起文件名稱。
先別暈了!我這就舉個(gè)例子幫助大家來理解這些參數(shù)!
usebackq這個(gè)參數(shù)不用理解了,系統(tǒng)默認(rèn)會(huì)給我們加上!
為了能使用這個(gè)例子,我們先新建一個(gè)文本文件,在里面打上這些內(nèi)容保存為test.txt:
;郁悶啊!
您好! 歡迎來到, 非常批處理
我們的網(wǎng)站 bbs.verybat.cn
完畢!
@echo off
FOR /F "eol=; tokens=1 delims= " %%i in (test.txt) do @echo %%i
pause
我們把這個(gè)BAT保存到和你的test.txt相同的目錄下面然后執(zhí)行
我們會(huì)看到屏幕上會(huì)顯示
您好!
我們的網(wǎng)站
完畢!
為什么會(huì)這樣?我來解釋
這個(gè)命令會(huì)讀取在當(dāng)前目錄下名為test.txt文件中的內(nèi)容,然后將每一行的內(nèi)容賦值給變量%%i,然后忽略掉以;號(hào)開頭的行,并且以空格做為分隔符號(hào),打印第每行以空各做分隔符號(hào)的第一列
結(jié)果就是這樣了!!
如果改成
當(dāng)然我們想要把全部文件內(nèi)容直接打印出來就可以這樣
@echo off
FOR /F "delims=" %%i in (test.txt) do @echo %%i
pause
另外/F參數(shù)還可以以輸出命令的結(jié)果看這個(gè)例子
@echo off
FOR /F "delims=" %%i in ('net user') do @echo %%i
pause
這樣你本機(jī)全部帳號(hào)名字就出來了把擴(kuò)號(hào)內(nèi)的內(nèi)容用兩個(gè)單引號(hào)引起來就表示那個(gè)當(dāng)命令執(zhí)行,FOR會(huì)返回命令的每行結(jié)果,加那個(gè)"delims=" 是為了讓我空格的行能整行顯示出來,不加就只顯示空格左邊一列!
基本上講完了FOR的基本用法了...如果你看過FOR的系統(tǒng)幫助,你會(huì)發(fā)現(xiàn)他下面還有一些特定義的變量,這些我先不講.大家因該都累了吧!你不累我累啊....
本節(jié)到此結(jié)速,希望對(duì)各位有所幫助!
第三節(jié)(FOR命令中的變量)
FOR命令中有一些變量,他們的用法許多新手朋友還不太了解,今天給大家講解他們的用法!
先把FOR的變量全部列出來:
~I - 刪除任何引號(hào)("),擴(kuò)展 %I
%~fI - 將 %I 擴(kuò)展到一個(gè)完全合格的路徑名
%~dI - 僅將 %I 擴(kuò)展到一個(gè)驅(qū)動(dòng)器號(hào)
%~pI - 僅將 %I 擴(kuò)展到一個(gè)路徑
%~nI - 僅將 %I 擴(kuò)展到一個(gè)文件名
%~xI - 僅將 %I 擴(kuò)展到一個(gè)文件擴(kuò)展名
%~sI - 擴(kuò)展的路徑只含有短名
%~aI - 將 %I 擴(kuò)展到文件的文件屬性
%~tI - 將 %I 擴(kuò)展到文件的日期/時(shí)間
%~zI - 將 %I 擴(kuò)展到文件的大小
%~$PATH:I - 查找列在路徑環(huán)境變量的目錄,并將 %I 擴(kuò)展
到找到的第一個(gè)完全合格的名稱。如果環(huán)境變量名
未被定義,或者沒有找到文件,此組合鍵會(huì)擴(kuò)展到
空字符串
我們可以看到每行都有一個(gè)大寫字母"I",這個(gè)I其實(shí)就是我們?cè)贔OR帶入的變量,我們FOR語句代入的變量名是什么,這里就寫什么.
比如:FOR /F %%z IN ('set') DO @echo %%z
這里我們代入的變量名是z那么我們就要把那個(gè)I改成z,例如%~fI改為%~fz
至于前面的%~p這樣的內(nèi)容就是語法了!
好開始講解:
~I - 刪除任何引號(hào)("),擴(kuò)展 %I
這個(gè)變量的作用就如他的說明,刪除引號(hào)!
我們來看這個(gè)例子:
首先我們?cè)谧烂娼⒁粋€(gè)名字為temp.txt文本文件,在里面輸入這些內(nèi)容
"1111
2222"
"3333"
44"44
然后在建立個(gè)BAT文件代碼如下:
FOR /F "delims=" %%i IN (temp.txt) DO @echo %%~i
pause
執(zhí)行后,我們看CMD的回顯如下:
1111
2222"
3333
44"44
和之前temp.txt中的內(nèi)容對(duì)比一下,我們會(huì)發(fā)現(xiàn)第一行和第三行的引號(hào)都消失了,這就是刪除引號(hào)~i的作用了!
刪除引號(hào)規(guī)則如下(BAT兄補(bǔ)充!)
1、若字符串首尾同時(shí)存在引號(hào),則刪除首尾的引號(hào);
2、若字符串尾不存在引號(hào),則刪除字符串首的引號(hào);
3、如果字符串中間存在引號(hào),或者只在尾部存在引號(hào),則不刪除。
%~fI - 將 %I 擴(kuò)展到一個(gè)完全合格的路徑名
看例子:
把代碼保存放在隨便哪個(gè)地方,我這里就放桌面吧.
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~fi
pause
執(zhí)行后顯示內(nèi)容如下
C:\Documents and Settings\Administrator\桌面\test.bat
C:\Documents and Settings\Administrator\桌面\test.vbs
當(dāng)我把代碼中的 %%~fi直接改成%%i
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%i
pause
執(zhí)行后就會(huì)顯示這些內(nèi)容
test.bat
test.vbs
通過對(duì)比,我們很容易就看出沒有路徑了,這就是"將 %I 擴(kuò)展到一個(gè)完全合格的路徑名"的作用
也就是如果%i變量的內(nèi)容是一個(gè)文件名的話,他就會(huì)把這個(gè)文件所在的絕對(duì)路徑打印出來,而不只單
單打印一個(gè)文件名,自己動(dòng)手動(dòng)實(shí)驗(yàn)下就知道了!
%~dI - 僅將 %I 擴(kuò)展到一個(gè)驅(qū)動(dòng)器號(hào)
看例子:
代碼如下,我還是放到桌面執(zhí)行!
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~di
pause
執(zhí)行后我CMD里顯示如下
C:
C:
我桌面就兩個(gè)文件test.bat,test.vbs,%%~di作用是,如果變量%%i的內(nèi)容是一個(gè)文件或者目錄名,他就會(huì)把他這文件
或者目錄所在的盤符號(hào)打印出來!
%~pI - 僅將 %I 擴(kuò)展到一個(gè)路徑
這個(gè)用法和上面一樣,他只打印路徑不打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~pi
pause
我就不打結(jié)果了,大家自己復(fù)制代碼看結(jié)果吧,下面幾個(gè)都是這么個(gè)用法,代碼給出來,大家自己看結(jié)果吧!
%~nI - 僅將 %I 擴(kuò)展到一個(gè)文件名
只打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ni
pause
%~xI - 僅將 %I 擴(kuò)展到一個(gè)文件擴(kuò)展名
只打印文件的擴(kuò)展名
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~xi
pause
%~sI - 擴(kuò)展的路徑只含有短名
打印絕對(duì)短文件名
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~si
pause
%~aI - 將 %I 擴(kuò)展到文件的文件屬性
打印文件的屬性
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ai
pause
%~tI - 將 %I 擴(kuò)展到文件的日期/時(shí)間
打印文件建立的日期
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ti
pause
%~zI - 將 %I 擴(kuò)展到文件的大小
打印文件的大小
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~zi
pause
%~$PATH:I - 查找列在路徑環(huán)境變量的目錄,并將 %I 擴(kuò)展
到找到的第一個(gè)完全合格的名稱。如果環(huán)境變量名
未被定義,或者沒有找到文件,此組合鍵會(huì)擴(kuò)展到
空字符串
這是最后一個(gè),和上面那些都不一樣,我單獨(dú)說說!
然后在把這些代碼保存為批處理,放在桌面.
FOR /F "delims==" %%i IN ('net.exe') DO @echo %%~$PATH:i
pause
他的意思就在PATH變量里指定的路徑里搜索net,exe文件,如果有net.exe則會(huì)把他所在絕對(duì)路徑打印出來,沒有就打印一個(gè)錯(cuò)誤!
好了,FOR的的變量就介紹到這了!
BY 傷腦筋
第四節(jié)(批處理中的變量)
批處理中的變量,我把他分為兩類,分別為"系統(tǒng)變量"和"自定義變量"
我們現(xiàn)在來詳解這兩個(gè)變量!
系統(tǒng)變量:
他們的值由系統(tǒng)將其根據(jù)事先定義的條件自動(dòng)賦值,也就是這些變量系統(tǒng)已經(jīng)給他們定義了值,
不需要我們來給他賦值,我們只需要調(diào)用而以! 我把他們?nèi)苛谐鰜?
%ALLUSERSPROFILE% 本地 返回“所有用戶”配置文件的位置。
%APPDATA% 本地 返回默認(rèn)情況下應(yīng)用程序存儲(chǔ)數(shù)據(jù)的位置。
%CD% 本地 返回當(dāng)前目錄字符串。
%CMDCMDLINE% 本地 返回用來啟動(dòng)當(dāng)前的 Cmd.exe 的準(zhǔn)確命令行。
%CMDEXTVERSION% 系統(tǒng) 返回當(dāng)前的“命令處理程序擴(kuò)展”的版本號(hào)。
%COMPUTERNAME% 系統(tǒng) 返回計(jì)算機(jī)的名稱。
%COMSPEC% 系統(tǒng) 返回命令行解釋器可執(zhí)行程序的準(zhǔn)確路徑。
%DATE% 系統(tǒng) 返回當(dāng)前日期。使用與 date /t 命令相同的格式。由 Cmd.exe 生成。有關(guān)
date 命令的詳細(xì)信息,請(qǐng)參閱 Date。
%ERRORLEVEL% 系統(tǒng) 返回上一條命令的錯(cuò)誤代碼。通常用非零值表示錯(cuò)誤。
%HOMEDRIVE% 系統(tǒng) 返回連接到用戶主目錄的本地工作站驅(qū)動(dòng)器號(hào)。基于主目錄值而設(shè)置。用
戶主目錄是在“本地用戶和組”中指定的。
%HOMEPATH% 系統(tǒng) 返回用戶主目錄的完整路徑。基于主目錄值而設(shè)置。用戶主目錄是在“本
地用戶和組”中指定的。
%HOMESHARE% 系統(tǒng) 返回用戶的共享主目錄的網(wǎng)絡(luò)路徑。基于主目錄值而設(shè)置。用戶主目錄是
在“本地用戶和組”中指定的。
%LOGONSERVER% 本地 返回驗(yàn)證當(dāng)前登錄會(huì)話的域控制器的名稱。
%NUMBER_OF_PROCESSORS% 系統(tǒng) 指定安裝在計(jì)算機(jī)上的處理器的數(shù)目。
%OS% 系統(tǒng) 返回操作系統(tǒng)名稱。Windows 2000 顯示其操作系統(tǒng)為 Windows_NT。
%PATH% 系統(tǒng) 指定可執(zhí)行文件的搜索路徑。
%PATHEXT% 系統(tǒng) 返回操作系統(tǒng)認(rèn)為可執(zhí)行的文件擴(kuò)展名的列表。
%PROCESSOR_ARCHITECTURE% 系統(tǒng) 返回處理器的芯片體系結(jié)構(gòu)。值:x86 或 IA64 基于
Itanium
%PROCESSOR_IDENTFIER% 系統(tǒng) 返回處理器說明。
%PROCESSOR_LEVEL% 系統(tǒng) 返回計(jì)算機(jī)上安裝的處理器的型號(hào)。
%PROCESSOR_REVISION% 系統(tǒng) 返回處理器的版本號(hào)。
%PROMPT% 本地 返回當(dāng)前解釋程序的命令提示符設(shè)置。由 Cmd.exe 生成。
%RANDOM% 系統(tǒng) 返回 0 到 32767 之間的任意十進(jìn)制數(shù)字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系統(tǒng) 返回包含 Windows server operating system 根目錄(即系統(tǒng)根目錄)
的驅(qū)動(dòng)器。
%SYSTEMROOT% 系統(tǒng) 返回 Windows server operating system 根目錄的位置。
%TEMP% 和 %TMP% 系統(tǒng)和用戶 返回對(duì)當(dāng)前登錄用戶可用的應(yīng)用程序所使用的默認(rèn)臨時(shí)目錄。
有些應(yīng)用程序需要 TEMP,而其他應(yīng)用程序則需要 TMP。
%TIME% 系統(tǒng) 返回當(dāng)前時(shí)間。使用與 time /t 命令相同的格式。由 Cmd.exe 生成。有關(guān)
time 命令的詳細(xì)信息,請(qǐng)參閱 Time。
%USERDOMAIN% 本地 返回包含用戶帳戶的域的名稱。
%USERNAME% 本地 返回當(dāng)前登錄的用戶的名稱。
%USERPROFILE% 本地 返回當(dāng)前用戶的配置文件的位置。
%WINDIR% 系統(tǒng) 返回操作系統(tǒng)目錄的位置。
這么多系統(tǒng)變量,我們?nèi)绾沃浪闹凳鞘裁茨?
在CMD里輸入 echo %WINDIR%
windir變量名,不是隨便亂輸?shù)?
這樣就能顯示一個(gè)變量的值了!
舉個(gè)實(shí)際例子,比如我們要復(fù)制文件到當(dāng)前帳號(hào)的啟動(dòng)目錄里就可以這樣
copy d:\1.bat "%USERPROFILE%\「開始」菜單\程序\啟動(dòng)\"
%USERNAME% 本地 返回當(dāng)前登錄的用戶的名稱。 注意有空格的目錄要用引號(hào)引起來
另外還有一些系統(tǒng)變量,他們是代表一個(gè)意思,或者一個(gè)操作!
他們分別是%0 %1 %2 %3 %4 %5 ......一直到%9 還有一個(gè)%*
%0 這個(gè)有點(diǎn)特殊,有幾層意思,先講%1-%9的意思.
%1 返回批處理的第一個(gè)參數(shù)
%2 返回批處理的第二個(gè)參數(shù)
%3-%9依此推類
反回批處理參數(shù)?到底怎么個(gè)返回法?
我們看這個(gè)例子,把下面的代碼保存為test.BAT然后放到C盤下
@echo off
echo %1 %2 %3 %4
echo %1
echo %2
echo %3
echo %4
進(jìn)入CMD,輸入cd c:\
然后輸入 test.bat 我是第一個(gè)參數(shù) 我是第二個(gè)參數(shù) 我是第三個(gè)參數(shù) 我是第四個(gè)參數(shù)
注意中間的空額,我們會(huì)看到這樣的結(jié)果:
我是第一個(gè)參數(shù) 我是第二個(gè)參數(shù) 我是第三個(gè)參數(shù) 我是第四個(gè)參數(shù)
我是第一個(gè)參數(shù)
我是第二個(gè)參數(shù)
我是第三個(gè)參數(shù)
我是第四個(gè)參數(shù)
對(duì)比下代碼,%1就是我是第一個(gè)參數(shù) %2就是我是第二個(gè)參數(shù)
怎么樣理解了吧!
這些%1和%9可以讓批處理也能帶參數(shù)運(yùn)行,大大提高批處理功能!
還有一個(gè)%* 他是什么呢?他的作用不是很大,只是返回參數(shù)而已,不過他是一次返回全部參數(shù)
的值,不用在輸入%1 %2來確定一個(gè)個(gè)的
例子
@echo off
echo %*
同樣保存為test.bat 放到C盤
進(jìn)入CMD,輸入cd c:\
然后輸入 test.bat 我是第一個(gè)參數(shù) 我是第二個(gè)參數(shù) 我是第三個(gè)參數(shù) 我是第四個(gè)參數(shù)
可以看到他一次把全部參數(shù)都顯示出來了
好現(xiàn)在開始講那個(gè)比較特殊的%0
%0 這個(gè)不是返回參數(shù)的值了,他有兩層意思!
第一層意思:返回批處理所在絕對(duì)路徑
例子:
@echo off
echo %0
pause
保存為test.BAT放在桌面運(yùn)行,會(huì)顯示如下結(jié)果
"C:\Documents and Settings\Administrator\桌面\test.bat"
他把當(dāng)前批處理執(zhí)行的所在路經(jīng)打印出來了,這就是返回批處理所在絕對(duì)路徑的意思
第二層意思:無限循環(huán)執(zhí)行BAT
例子:
@echo off
net user
%0
保存為BAT執(zhí)行,他就會(huì)無限循環(huán)執(zhí)行net user這條命令,直到你手動(dòng)停止.
以上就是批處理中的一些系統(tǒng)變量,另外還有一些變量,他們也表示一些功能,
FOR命令中的那些就是,FOR變量已經(jīng)說過,就不講了.
現(xiàn)在說自定義變量
故名思意,自定義變量就是由我們來給他賦予值的變量
要使用自定義變量就得使用set命令了,看例子.
@echo off
set var=我是值
echo %var%
pause
保存為BAT執(zhí)行,我們會(huì)看到CMD里返回一個(gè) "我是值"
var為變量名,=號(hào)右變的是要給變量的值
這就是最簡單的一種設(shè)置變量的方法了
如果我們想讓用戶手工輸入變量的值,而不是在代碼里指定,可以用用set命令的/p參數(shù)
例子:
@echo off
set /p var=請(qǐng)輸入變量的值
echo %var%
pause
var變量名 =號(hào)右邊的是提示語,不是變量的值
變量的值由我們運(yùn)行后自己用鍵盤輸入!
好了批處理的變量先介紹到這,關(guān)于set命令,下次在寫個(gè)專門的文章吧.
by 傷腦筋
第五節(jié)(set命令詳解)
很久沒發(fā)貼了,今天來寫點(diǎn)講BAT的新手教學(xué)貼!
在上一貼中我簡單的介紹了一下SET設(shè)置自定義變量的作用,現(xiàn)在我來具體講一下set的其他功
能.
先回顧一下他設(shè)置自定義變量的用法
例子:
@echo off
set var=我是值
echo %var%
pause
請(qǐng)看 set var=我是值 ,這就是BAT直接在批處理中設(shè)置變量的方法!
set 是命令 var是變量名 =號(hào)右邊的"我是值"是變量的值
在批處理中我們要引用這個(gè)變就把var變量名用兩個(gè)%(百分號(hào))擴(kuò)起來,如%var%
這種SET語法只能直接在BAT代碼的提前賦予變量的值,有時(shí)候我們需要提供一個(gè)交互界面,讓
用戶自己輸入變量的值,然后我們?cè)趤砀鶕?jù)這個(gè)值來做相應(yīng)操作,現(xiàn)在我就來說說這SET的這
種語法,只需要加一個(gè)"/P"參數(shù)就可以了!
例子:
@echo off
set /p var=請(qǐng)輸入變量的值:
if %var% == 1 echo 您輸入了 1 ~_~
pause
set /p 是命令語法 var是變量名 =號(hào)右邊的"請(qǐng)輸入變量的值: ",這個(gè)是提示語,不是變
量的值了!
運(yùn)行后,我們?cè)谔崾菊Z后面直接輸入1,就會(huì)顯示一行您輸入了 1 ~_~ ,輸入別的就沒有任何反
映!
好了,先回顧到這,現(xiàn)在講SET其他功能
使用set /?查看SET的幫助我們發(fā)現(xiàn)SET除了我上面講的
SET [variable=[string]]
SET /P variable=[promptString]
這兩種語法外,還有如下幾種語法:
SET /A expression
環(huán)境變量替換已如下增強(qiáng):
%PATH:str1=str2%
%PATH:~10,5%
%PATH:~-10%
%PATH:~0,-2%
這機(jī)種語法有什么用處呢?現(xiàn)在我們來一個(gè)個(gè)講解他們!
SET /A expression
/A 命令行開關(guān)指定等號(hào)右邊的字符串為被評(píng)估的數(shù)字表達(dá)式。該表達(dá)式
評(píng)估器很簡單并以遞減的優(yōu)先權(quán)順序支持下列操作:
() - 分組
! ~ - - 一元運(yùn)算符
* / % - 算數(shù)運(yùn)算符
+ - - 算數(shù)運(yùn)算符
<< >> - 邏輯移位
& - 按位“與”
^ - 按位“異”
| - 按位“或”
= *= /= %= += -= - 賦值
&= ^= |= <<= >>=
, - 表達(dá)式分隔符
上面這些是系統(tǒng)幫助里的內(nèi)容,看著是不是有點(diǎn)暈,沒關(guān)系我來簡單解釋一下:
set的/A參數(shù)就是讓SET可以支持?jǐn)?shù)學(xué)符號(hào)進(jìn)行加減等一些數(shù)學(xué)運(yùn)算!
現(xiàn)在開始舉例子介紹這些數(shù)學(xué)符號(hào)的用法:
看例子 這里的例子請(qǐng)直接在CMD下拷貝命令運(yùn)行,不需要保存為BAT!
set /a var=1 + 1
set /a 語法, var變量名 1 + 1 數(shù)學(xué)式子
拷貝運(yùn)行后會(huì)直接顯示一個(gè)2,或者運(yùn)行完后我們輸入echo %var%,也是二,這就是
一個(gè)簡單的加法運(yùn)算!
set /a var=2 - 1 結(jié)果是多少呢?如果你看不到結(jié)果就echo %var%.....
set /a var=2 * 2 乘法運(yùn)算
set /a var=2 / 2 除法運(yùn)算
set /a var=(1+1) + (1+1) 結(jié)果等于4 看得懂吧!
set /a a=1+1,b=2+1,c=3+1 運(yùn)行后會(huì)顯示一個(gè)4,但我們用
echo %a% %b% %c%后看結(jié)果,會(huì)發(fā)現(xiàn)其他數(shù)學(xué)運(yùn)算也有效果!,這就是"斗"號(hào)的
作用!
有時(shí)候我們需要直接在原變量進(jìn)行加減操作就可以用這種語法
set /a var+=1 這樣的語法對(duì)應(yīng)原始語法就是set /a var = %var% + 1
都是一樣的結(jié)果,在原變量的值上在進(jìn)行數(shù)學(xué)運(yùn)算,不過這樣寫簡單一點(diǎn)
在來一個(gè):
set /a var*=2
其他都這么用,只要幫助里有這個(gè)語法!
另外還有一些用邏輯或取余操作符,這些符號(hào),按照上面的使用方法會(huì)報(bào)錯(cuò)的
比如我們?cè)贑MD里輸入set /a var=1 & 1 "與運(yùn)算",他并不會(huì)顯示為1,而是報(bào)錯(cuò),
為什么?對(duì)于這樣的"邏輯或取余操作符",我們需要把他們用雙引號(hào)引起來,看例子
set /a var= 1 "&" 1 這樣結(jié)果就顯示出來了,其他邏輯或取余操作符用法
set /a var= 1 "+" 1 異運(yùn)算
set /a var= 1 "%" 1 取模運(yùn)算
set /a var= 2 "<<" 2 次方運(yùn)算
set /a var= 4 ">>" 2 這個(gè)不太記得數(shù)學(xué)里的叫法....
還有幾個(gè)數(shù)學(xué)不太行,搞不清楚了....不列出來了,
這些符號(hào)也可以用&= ^= |= <<= >>= 這樣的簡單用法如
set /a var"&=" 1 等于set /a var = %var% "&" 1 注意引號(hào)
好符號(hào)說到這,現(xiàn)在說%PATH:str1=str2%
這個(gè)是替換變量值的內(nèi)容,看例子
@echo off
set a= bbs.verybat.cn
echo 替換前的值: "%a%"
set var=%a: =%
echo 替換后的值: "%var%"
pause
對(duì)比一下,我們發(fā)現(xiàn)他把變量%a%的空格給替換掉了,從這個(gè)例子,我們就可以發(fā)現(xiàn)
%PATH:str1=str2%這個(gè)操作就是把變量%PATH%的里的str1全部用str2替換
比如我們把上面的例子改成這樣
@echo off
set a=bbs.verybat.cn
echo 替換前的值: "%a%"
set var=%a:.=傷腦筋%
echo 替換后的值: "%var%"
pause
解釋set var=%a:.=傷腦筋%
set命令 var變量名 字a是要進(jìn)行字符替換的變量的值,"."為要替換的值,
"傷腦筋"為替換后的值!
執(zhí)行后就會(huì)把變量%a%里面的"."全部替換為"傷腦筋"
這就是set的替換字符的很好的功能!先講到這
%PATH:~10,5% 這個(gè)什么意思,看例子:
@echo off
set a=bbs.verybat.cn
set var=%a:~1,2%
echo %var%
pause
執(zhí)行后,我們會(huì)發(fā)現(xiàn)只顯示了"bs"兩個(gè)字母,我們的變量%a%的值不是為bbs.verybat.cn嗎
怎么只顯示了第2個(gè)字母和第3個(gè)字母"bs",分析一結(jié)果我們就可以很容易看出
%PATH:~10,5%就是顯示變量PATH里指定幾位的值!
分析set var=%a:~1,2%
set命令 var變量值 a要進(jìn)行字符操作的變量 "1"從變量"a"第幾位開始顯示 "2"顯示幾位
和起來就是把變量a的值從第一位開始,把后兩位賦予給變量var
就樣因該明白了吧~
其他兩種語法
%PATH:~-10%
%PATH:~0,-2%
他們也是顯示指定變量指定幾位的值得的意思
%PATH:~-10% 例子
@echo off
set a=bbs.verybat.cn
set var=%a:~-3%
echo %var%
pause
這個(gè)就是把變量a倒數(shù)3位的值給變量VAR
當(dāng)然我們也可以改成這樣
@echo off
set a=bbs.verybat.cn
set var=%a:~3%
echo %var%
pause
這個(gè)就是把變量a的從第3位開始后面全部的值給變量VAR
%PATH:~0,-2% 例子
@echo off
set a=bbs.verybat.cn
set var=%a:~0,-3%
echo %var%
pause
執(zhí)行后,我們發(fā)現(xiàn)顯示的是"bbs.verybat",少了".cn"
從結(jié)果分析,很容易分析出,這是把變量a的值從0位開始,
到倒數(shù)第三位之間的值全部賦予給var
如果改成這樣
@echo off
set a=bbs.verybat.cn
set var=%a:~2,-3%
echo %var%
pause
那么他就是顯示從第2位開始減去倒數(shù)三位字符的值,并賦予給變量var
好了set的一些用法,就介紹到這了,希望對(duì)各位有所幫助,時(shí)間不早睡覺Zz....
by 傷腦筋
if命令講解
最近發(fā)現(xiàn)有些朋友一老問IF命令的用法,IF命令個(gè)人覺得很簡單,所以就一直沒把發(fā)放到新手教學(xué)貼里說,現(xiàn)在我給補(bǔ)上一文,希望對(duì)各位"非常BAT的"新手朋友們有所幫助.
現(xiàn)在開始:
在CMD使用IF /?打開IF的系統(tǒng)幫助(自己看我就不全部列出來了),我們會(huì)發(fā)現(xiàn)IF有3種基本的用法!
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
首先來講第一種用法 IF [NOT] ERRORLEVEL number command
這個(gè)用法的基本做用是判斷上一條命令執(zhí)行結(jié)果的代碼,以決定下一個(gè)步驟.
一般上一條命令的執(zhí)行結(jié)果代碼只有兩結(jié)果,"成功"用0表示 "失敗"用1表示.
舉個(gè)例子:
@echo off
net user
IF %ERRORLEVEL% == 0 echo net user 執(zhí)行成功了!
pause
這是個(gè)簡單判斷上條命令是否執(zhí)行成功.
細(xì)心的朋友可能會(huì)發(fā)現(xiàn),這個(gè)用法和幫助里的用法不太一樣,按照幫助里的寫法"IF %ERRORLEVEL% == 0 echo net user 執(zhí)行成功了! "這一句代碼因該寫成:IF ERRORLEVEL 0 echo net user 執(zhí)行成功了!
那為什么我要寫成這樣呢?各位自己把代碼改掉執(zhí)行后,就會(huì)發(fā)現(xiàn)錯(cuò)誤了!用這種語法,不管你的上面的命令是否執(zhí)行成功,他都會(huì)認(rèn)為命令成功了,不知道是BUG還是本人理解錯(cuò)誤...
%ERRORLEVEL% 這是個(gè)系統(tǒng)變量,返回上條命令的執(zhí)行結(jié)果代碼! "成功"用0表示 "失敗"用1表示. 當(dāng)然還有其他參數(shù),用的時(shí)候基本就這兩數(shù)字.
在舉幾個(gè)例子給新手理解
@echo off
net usertest
IF %ERRORLEVEL% == 1 echo net user 執(zhí)行失敗了!
pause
這個(gè)是判斷上一條命令是否執(zhí)行失敗的
@echo off
set /p var=隨便輸入個(gè)命令:
%var%
if %ERRORLEVEL% == 0 goto yes
goto no
:yes
echo !var! 執(zhí)行成功了
pause
exit
:no
echo 基本上執(zhí)行失敗了..
pause
這個(gè)是根據(jù)你輸入的命令,自動(dòng)判斷是成功還是失敗了!
在來一個(gè)簡化版的
@echo off
set /p var=隨便輸入個(gè)命令:
%var%
if %ERRORLEVEL% == 0 (echo %var%執(zhí)行成功了) ELSE echo %var%執(zhí)行失敗了!
pause
else后面寫上執(zhí)行失敗后的操作!
當(dāng)然我門還可以把if else這樣的語句分成幾行寫出來,使他看上去好看點(diǎn)...
@echo off
set /p var=隨便輸入個(gè)命令:
%var%
if %ERRORLEVEL% == 0 (
echo !var! 執(zhí)行成功了
) ELSE (
echo 基本上執(zhí)行失敗了..
)
pause
這里介紹的兩種簡寫對(duì)IF的三種語法都可以套用,不單單是在IF [NOT] ERRORLEVEL number command
這種法上才能用
現(xiàn)在來說第二種用法IF [NOT] string1==string2 command
這個(gè)呢就是用來比較變量或者字符的值是不是相等的.
例子
@echo off
set /p var=請(qǐng)輸入第一個(gè)比較字符:
set /p var2=請(qǐng)輸入第二個(gè)比較字符:
if %var% == %var2% (echo 我們相等) ELSE echo 我們不相等
pause
上面這個(gè)例子可以判斷你輸入的值是不是相等,但是你如果輸入相同的字符,但是如果其中一個(gè)后面打了一個(gè)空格,
這個(gè)例子還是會(huì)認(rèn)為相等,如何讓有空格的輸入不相等呢?我們?cè)诒容^字符上加個(gè)雙引號(hào)就可以了.
@echo off
set /p var=請(qǐng)輸入第一個(gè)比較字符:
set /p var2=請(qǐng)輸入第二個(gè)比較字符(多輸入個(gè)空格試試):
if "%var%" == "%var2%" (echo 我們相等) ELSE echo 我們不相等
pause
第三種用法IF [NOT] EXIST filename command
這個(gè)就是判斷某個(gè)文件或者文件夾是否存在的語法
例子
@echo off
if exist "c:"test" (echo 存在文件) ELSE echo 不存在文件
pause
判斷的文件路徑加引號(hào)是為了防止路徑有空格,如果路徑有空格加個(gè)雙引號(hào)就不會(huì)出現(xiàn)判斷出錯(cuò)了!
這個(gè)語法沒什么太多的用法,基本就這樣了,就不多介紹了.
另外我們看到每條IF用法后都有個(gè)[NOT]語句,這啥意思?其他加上他的話,就表示先判斷我們的條件不成立時(shí),
沒加他默認(rèn)是先判斷條件成立時(shí),比如上面這個(gè)例子
@echo off
if not exist "c:"test" (echo 存在文件) ELSE echo 不存在文件
pause
加個(gè)NOT,執(zhí)行后有什么結(jié)果,如果你的C盤下更本就沒c:"test,他還是會(huì)顯示"存在文件",這就表示了加了NOT就
會(huì)先判斷條件失敗!懂了吧,上面例子改成這樣就正確了!
@echo off
if not exist "c:"test" (echo 不存在文件) ELSE echo 存在文件
pause
另外IF還有一些增強(qiáng)的用法,如下
IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command
后面兩個(gè)用法,我不做介紹,因?yàn)樗麄兒蜕厦娴挠梅ū硎镜囊饬x基本一樣,只簡單說說 IF [/I] string1 compare-op string2 command這個(gè)語句在判斷字符時(shí)不區(qū)分字符的大小寫,看這兩個(gè)例子
@echo off
if a == A (echo 我們相等) ELSE echo 我們不相等
pause
執(zhí)行后會(huì)顯示我們不相等
@echo off
if /i a == A (echo 我們相等) ELSE echo 我們不相等
pause
加上/I不區(qū)分大小寫就相等了!
最后面還有一些用來判斷數(shù)字的符號(hào)
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
我?guī)着e一個(gè)例子,大家都懂?dāng)?shù)學(xué)...不講多了
@echo off
set /p var=請(qǐng)輸入一個(gè)數(shù)字:
if %var% LEQ 4 (echo 我小于等于4) ELSE echo 我不小于等于4
pause
BY 傷腦筋
芳兒寶貝.我愛你