cmd中的特殊符号
@
\\隱藏命令的回顯。
~
\\在for中表示使用增強(qiáng)的變量擴(kuò)展;
在set中表示使用擴(kuò)展環(huán)境變量指定位置的字符串;
在set/a中表示按位取反。
%
\\使用兩個(gè)%包含一個(gè)字符串表示引用環(huán)境變量。比如一個(gè)%time%可以擴(kuò)展到當(dāng)前的系統(tǒng)時(shí)間;
單個(gè)%緊跟0-9的一個(gè)數(shù)字表示引用命令行參數(shù);
用于for中表示引用循環(huán)變量;
連續(xù)的兩個(gè)%表示執(zhí)行時(shí)脫為一個(gè)%。
^
\\取消轉(zhuǎn)義字符,即將所有轉(zhuǎn)義字符的轉(zhuǎn)義作用關(guān)閉。比如要在屏幕顯示一些特殊的字符,比如> >> | ^等時(shí),就可以在其前面加一個(gè)^符號(hào)來(lái)顯示這個(gè)^后面的字符了,^^就是顯示一個(gè)^,^|就是顯示一個(gè)|字符了;
在set/a中是按位異;
在findstr/r的[]中表示不匹配指定的字符集。
&
\\命令連接字符。比如我要在一行文本上同時(shí)執(zhí)行兩個(gè)命令,就可以用&命令連接這兩個(gè)命令;
在set/a中是按位與。
*
\\代表任意個(gè)任意字符,就是我們通常所說(shuō)的"通配符";比如想在c盤(pán)的根目錄查找c盤(pán)根目錄里所有的文本文件(.txt),那么就可以輸入命令"dir c:\*.txt";
在set/a中是乘法。比如"set/a
x=4*2",得到的結(jié)果是8;
在findstr/r中表示將前一個(gè)字符多次匹配。
()
\\命令包含或者是具有優(yōu)先權(quán)的界定符吧,比如for命令要用到這個(gè)(),我們還可以在if,echo等命令中見(jiàn)到它的身影;
-
\\范圍表示符,比如日期的查找,for命令里的tokens操作中就可以用到這個(gè)字符;
在findstr/r中連接兩個(gè)字符表示匹配范圍;
-跟在某些命令的/后表示取反向的開(kāi)關(guān)。
+
\\主要是在copy命令里面會(huì)用到它,表示將很多個(gè)文件合并為一個(gè)文件,就要用到這個(gè)+字符了;
在set/a中是加法。
|
\\管道符。就是將上一個(gè)命令的輸出,作為下一個(gè)命令的輸入."dir /a/b | more"就可以逐屏的顯示dir命令所輸出的信息;
在set/a中是按位或;
在幫助文檔中表示其前后兩個(gè)開(kāi)關(guān)、選項(xiàng)或參數(shù)是二選一的。
:
\\標(biāo)簽定位符,可以接受goto命令所指向的標(biāo)簽。比如在批處理文件里面定義了一個(gè)":begin"標(biāo)簽,用"goto begin"命令就可以轉(zhuǎn)到":begin"變遷后面來(lái)執(zhí)行批處理命令了。
" "
\\界定符,在表示帶有空格的路徑時(shí)常要用""來(lái)將路徑括起來(lái),在一些命令里面也需要" "符號(hào);
在for/f中將表示它們包含的內(nèi)容當(dāng)作字符串分析;
在for/f "usebackq"表示它們包含的內(nèi)容當(dāng)作文件路徑并分析其文件的內(nèi)容;
在其它情況下表示其中的內(nèi)容是一個(gè)完整的字符串,其中的>、>>、<、&、|、空格等不再轉(zhuǎn)義。
/
\\表示其后的字符(串)是命令的功能開(kāi)關(guān)(選項(xiàng))。比如"dir /s/b/a-d"表示"dir"命令指定的不同的參數(shù);
在set/a中表示除法。
<
\\命令重定向符,將其前面的命令的輸出結(jié)果重新定向到其后面的設(shè)備中去,后面的設(shè)備中的內(nèi)容被覆蓋。比如可以用"dir > lxmxn.txt"將"dir"命令的結(jié)果輸出到"lxmxn.txt"這個(gè)文本文件中去;
在findstr/r中表示匹配單詞的右邊界,需要配合轉(zhuǎn)義字符\使用。
>>
\\命令重定向符。將其前面的命令的輸出結(jié)果重新定向到其后面的設(shè)備中去,后面設(shè)備中的內(nèi)容沒(méi)有被覆蓋。
<
\\將其后面的文件的內(nèi)容作為其前面命令的輸入。
在findstr/r中表示匹配單詞的左邊界,需要配合轉(zhuǎn)義字符\使用。
=
\\賦值符號(hào),用于變量的賦值。比如"set a=windows"的意思意思是將"windows"這個(gè)字符串賦給變量"a";
在set/a中表示算術(shù)運(yùn)算,比如"set /a x=5-6*5"。
\
\\這個(gè)"\"符號(hào)在有的情況下,代表的是當(dāng)前路徑的根目錄.比如當(dāng)前目錄在c:\windows\system32下,那么你"dir \"的話,就相當(dāng)與"dir c:\"
在findstr/r中表示正則轉(zhuǎn)義字符。
''
在for/f中表示將它們包含的內(nèi)容當(dāng)作命令行執(zhí)行并分析其輸出;
在for/f "usebackq"中表示將它們包含的字符串當(dāng)作字符串分析。
.
\\
在路徑的\后緊跟或者單獨(dú)出現(xiàn)時(shí):
一個(gè).表示當(dāng)前目錄;
兩個(gè).表示上一級(jí)目錄;
在路徑中的文件名中出現(xiàn)時(shí):
最后的一個(gè).表示主文件名與擴(kuò)展文件名的分隔。
&&
\\連接兩個(gè)命令,當(dāng)&&前的命令成功時(shí),才執(zhí)行&&后的命令;
||
\\連接兩個(gè)命令,當(dāng)||前的命令失敗時(shí),才執(zhí)行||后的命令。
$
\\在findstr命令里面表示一行的結(jié)束。
``
在for/f中表示它們所包含的內(nèi)容當(dāng)作命令行執(zhí)行并分析它的輸出。
[]
在幫助文檔表示其中的開(kāi)關(guān)、選項(xiàng)或參數(shù)是可選的;
在findstr/r中表示按其中指定的字符集匹配。
?
\\在findstr/r中表示在此位置匹配一個(gè)任意字符;
?在路徑中表示在此位置通配任意一個(gè)字符;
緊跟在/后表示獲取命令的幫助文檔。
!
\\當(dāng)啟用變量延遲時(shí),使用!!將變量名擴(kuò)起來(lái)表示對(duì)變量值的引用;
在set /a中表示邏輯非。比如set /a a=!0,這時(shí)a就表示邏輯1。
其他資料:
1、%是個(gè)ESCAPE字符,通常將之譯為轉(zhuǎn)義字符,但也有更形象的譯名脫逸字符、逃逸字符等。也就是說(shuō)%不僅僅將與其相關(guān)的特定字符串轉(zhuǎn)義并替換為特定字符串,而且自身也會(huì)被“脫逸”。而且類似于C語(yǔ)言中的轉(zhuǎn)義字符"\",雙%會(huì)轉(zhuǎn)義并脫逸為單%,四%則脫為雙%。
2、for本身是一個(gè)特殊的命令,類似于一個(gè)特化的命令解釋器,因?yàn)樗墓δ軐?shí)現(xiàn)需要執(zhí)行多條語(yǔ)句,因此它必須也具有對(duì)命令行(特指do后的命令行)分析處理的功能。而command/cmd實(shí)現(xiàn)for時(shí)自然會(huì)借用自身原有的命令行分析模塊,因此for具有二級(jí)轉(zhuǎn)義的特性,for中do后的語(yǔ)句被分兩級(jí)分析和解釋,第一級(jí)在command/cmd讀入并解釋for命令行時(shí),第二級(jí)在for讀入并解釋do命令時(shí),它通常會(huì)對(duì)同一命令行的進(jìn)行多次解釋。
然后,我們可以注意到,在do中使用命令行參數(shù)變量和環(huán)境變量時(shí),不需要雙%,那是因?yàn)椋@些變量在經(jīng)過(guò)第一級(jí)轉(zhuǎn)義后,被替換成特定的不變的字符串常量,參與for循環(huán)的所有執(zhí)行過(guò)程;而替代變量則要求在執(zhí)行(do后的子命令行中)過(guò)程中不斷的動(dòng)態(tài)變化,而這個(gè)變化自然仍需要通過(guò)脫逸字符來(lái)實(shí)現(xiàn),因此使用雙%就是成了必然的選擇。
另外,還需要注意到,在命令行中使用for時(shí)不需要雙%,這源于命令解釋器對(duì)命令行與批處理的處理方式不同。在早期的DOS版本中,%在命令行中不被視為轉(zhuǎn)義字符,所以不會(huì)被轉(zhuǎn)義和脫逸,所以當(dāng)時(shí)無(wú)法在命令行直接引用環(huán)境變量。而使用for時(shí),只需要一個(gè)%供for進(jìn)行轉(zhuǎn)義和脫逸就夠了。在以后的命令解釋器版本中,加入了命令行轉(zhuǎn)義的支持(主要是環(huán)境變量的支持),但命令行for使用單%的傳統(tǒng)仍然保留了下來(lái)。
而 cmd中的變量延遲替換是屬于特殊的情況,但不違背以上的轉(zhuǎn)義原則,只是for中的環(huán)境變量不再是常量了。
rmdir /S /Q %mhnet% 2>NUL 1>NUL 做簡(jiǎn)單解釋
這句代碼的大意是指將 %mhnet% 指定的目錄刪除,/s 代表刪除其中的子目錄, /q 表示刪除目錄樹(shù)時(shí)不提示確認(rèn), 1>nul 表示將正確刪除目錄樹(shù)的信息禁止輸出,2>nul 表示將刪除過(guò)程中的錯(cuò)誤信息禁止輸出
其中的1與2都是代表某個(gè)數(shù)據(jù)流輸入輸出的地址(NT CMD 稱之為句柄,MSDOS稱之為設(shè)備),下表(引自WinXP幫助文檔“使用命令重定向操作符
(Redirection Operators”一節(jié)))將列出可用的句柄。
句柄 句柄的數(shù)字代號(hào) 說(shuō)明
STDIN 0 鍵盤(pán)輸入
STDOUT 1 輸出到命令提示符窗口
STDERR 2 錯(cuò)誤輸出到命令提示符窗口
UNDEFINED 3-9 這些句柄由應(yīng)用程序和各個(gè)具體工具單獨(dú)定義
0 鍵盤(pán)輸入
1 輸出到命令提示符窗口
2 錯(cuò)誤輸出到命令提示符窗口
3-9 這些句柄由應(yīng)用程序和各個(gè)具體工具單獨(dú)定義。
2 > nul 表示程序出錯(cuò)的信息也不顯示。
call attrib -r -h c:\autoexec.bat >nul
這句其實(shí)是:
call attrib -r -h c:\autoexec.bat 1 > nul
這些1,2,0等等都是句柄,說(shuō)白了就是代號(hào),你只要知道1是代表輸出信息,2是代表出錯(cuò)信息,0是代表鍵盤(pán)輸入就行了。
如果有什么不明白的可以多看看幫助與支持。
命令行對(duì)重定向符號(hào)出現(xiàn)的位置不做過(guò)多限定,只要重定向符號(hào)后緊隨“字符設(shè)備”即可,故以下語(yǔ)句等效:
echo Hello World> hello.txt
echo Hello> Hello.txt World
echo> Hello.txt Hello World
> hello.txt echo Hello World
在NT系列命令行中,重定向的作用范圍由整個(gè)命令行轉(zhuǎn)變?yōu)閱蝹€(gè)命令語(yǔ)句,受到了命令分隔符&,&&,||和語(yǔ)句塊的制約限制。
echo Message1> msg1.txt & echo
Message2> msg2.txt
if "%target%"==""
(echo message to screen ) else (echo message to file> %target%)
綜上所述,>nul 意為將此句命令所產(chǎn)生的標(biāo)準(zhǔn)輸出請(qǐng)求重新定向到空設(shè)備中,而因?yàn)榇嗽O(shè)備的緘默特性,即相當(dāng)于將此語(yǔ)句的輸出信息屏蔽(并非隱藏);而 2>nul 則是將程序執(zhí)行錯(cuò)誤時(shí)的標(biāo)準(zhǔn)錯(cuò)誤信息輸出請(qǐng)求重定向后屏蔽。它們聯(lián)合使用,即為將此語(yǔ)句所可能產(chǎn)生的所有輸出信息屏蔽。
“重定向”是MSDOS起就存在的命令行特性,負(fù)責(zé)將指定命令或語(yǔ)句所產(chǎn)生的輸入輸出請(qǐng)求由缺省的“控制臺(tái)”轉(zhuǎn)交給其它的“設(shè)備”來(lái)完成,它的啟動(dòng)標(biāo)志是“重定向符號(hào)”(包括“>,>>,<”三個(gè),其各自意義見(jiàn)[1])出現(xiàn)在句中。
一般的命令行程序輸入輸出請(qǐng)求都通過(guò)內(nèi)部定義三個(gè)“端口”(在NT下稱為“句柄”,在DOS下未定義)來(lái)完成,分別為標(biāo)準(zhǔn)輸入stdin、標(biāo)準(zhǔn)輸出stdout、標(biāo)準(zhǔn)錯(cuò)誤stderr。它們通常指向的設(shè)備為控制臺(tái)(console,代碼為CON),其中stdin指向控制臺(tái)的鍵盤(pán),stdout/stderr指向控制臺(tái)的監(jiān)視器。因此,控制臺(tái)通常即指鍵盤(pán)與監(jiān)視器的聯(lián)合體,這是在早期大型機(jī)的終端機(jī)上所體現(xiàn)出來(lái)的概念。其中的stdin可被<重定向,stdout可被>、>>重定向,而stderr在DOS下不可直接重定向,只有通過(guò)ctty或其它命令將系統(tǒng)控制權(quán)轉(zhuǎn)交給其它設(shè)備的方式,來(lái)間接完成。
“設(shè)備”是指可控制PC硬件或端口的設(shè)備驅(qū)動(dòng)程序或端口代碼,它通常由系統(tǒng)底層或硬件驅(qū)動(dòng)程序?qū)崿F(xiàn)和支持。比如IO.SYS實(shí)現(xiàn)的控制臺(tái)CON、系統(tǒng)時(shí)鐘CLOCK$、未知設(shè)備CONFIG$、第一串口AUX、第一并口PRN、所有串口COM1~COM4、所有并口LPT1~LPT3、可用盤(pán)符A:-X:以及上文提到的空設(shè)備N(xiāo)UL。還有許多其它設(shè)備,比如HIMEM.SYS實(shí)現(xiàn)的XMSXXXX0,EMM386.EXE實(shí)現(xiàn)的EMMXXXX0,IFSHLP.SYS實(shí)現(xiàn)的IFS$HLP$等。
在這些設(shè)備中,可以處理輸入輸出信息的很少,只有CON、NUL以及連接有輸入輸出硬件(打印機(jī)、MODEM等)的串口或并口設(shè)備。它們被稱為“字符設(shè)備”,而磁盤(pán)文件也作為一種特殊的字符設(shè)備列選其中,這就大大擴(kuò)充了重定向的自由度與實(shí)用性,以致很多人也將重定向稱為“文件重定向”。
空設(shè)備N(xiāo)UL是一個(gè)特殊的設(shè)備,因?yàn)樗鼪](méi)有可控制的PC硬件或端口,而只是一個(gè)虛構(gòu)的的設(shè)備或端口,它僅存在于軟件層面。正因?yàn)槿绱耍梢越邮芩兄囟ㄏ虻妮斎胼敵稣?qǐng)求而不給出任何回應(yīng)(在NT下不會(huì)給出任何輸入信息而結(jié)束輸入請(qǐng)求,在DOS下則反復(fù)填充127個(gè)字節(jié)0后終止響應(yīng)),這種特性使它很像天文學(xué)上的能吞噬一切物質(zhì)和信息的“黑洞”,也很類似哲學(xué)上能顛轉(zhuǎn)陰陽(yáng)無(wú)中生有的“玄玄之道”。它之所以存在,是因?yàn)槲覀冃枰粋€(gè)可以默默無(wú)聞地?zé)o條件吸納各種冗余輸出信息或輸入請(qǐng)求的“回收站”,正如“黑洞”就像一個(gè)巨大的“宇宙垃圾場(chǎng)”一樣
CMD沒(méi)有神經(jīng)錯(cuò)亂,是set處理的整數(shù)太大了,set使用雙字節(jié)存儲(chǔ)整數(shù),有32位的存貯范圍限制,也就是說(shuō)它的處理范圍是2^-31~2^31-1,你的磁盤(pán)空間超過(guò)了這個(gè)范圍溢出了。
對(duì)此我沒(méi)有太好的解決辦法,只有舍棄后三位后除以1049的近似算法。
for /f "tokens=3" %%a in ('dir /-c c:\^|find "可用字節(jié)"') do set freesize=%%a
set /a freesize=%freesize:~0,-3%/1049>nul
echo Freesize:%freesize%
> 創(chuàng)建一個(gè)文件
>> 追加到一個(gè)文件后面
@ 前綴字符.表示執(zhí)行時(shí)本行在cmd里面不顯示, 可以使用 echo off關(guān)閉顯示
^ 對(duì)特殊符號(hào)( > < &)的前導(dǎo)字符.
第一個(gè)只是顯示aaa 第二個(gè)輸出文件bbb
echo 123456 ^> aaa
echo 1231231 > bbb
() 包含命令
(echo aa & echo bb)
, 和空格一樣的缺省分隔符號(hào).
; 注釋,表示后面為注釋
: 標(biāo)號(hào)作用
│ 管道操作
; 符號(hào)當(dāng)命令相同的時(shí)候可以將不同的目標(biāo)用;隔離開(kāi)來(lái)但執(zhí)行效果不變。如執(zhí)行過(guò)程中發(fā)生錯(cuò)誤則只返回錯(cuò)誤報(bào)告但程序還是會(huì)繼續(xù)執(zhí)行
首先, @ 不是一個(gè)命令, 而是DOS 批處理的一個(gè)特殊標(biāo)記符, 僅用于屏蔽命令行回顯. 下面是DOS命令行或批處理中可能會(huì)見(jiàn)到的一些特殊標(biāo)記符:
CR(0D) 命令行結(jié)束符
Escape(1B) ANSI轉(zhuǎn)義字符引導(dǎo)符
Space(20) 常用的參數(shù)界定符
Tab(09) ; = 不常用的參數(shù)界定符
+ COPY命令文件連接符
* ? 文件通配符
"" 字符串界定符
| 命令管道符
< > >> 文件重定向符
@ 命令行回顯屏蔽符
/ 參數(shù)開(kāi)關(guān)引導(dǎo)符
: 批處理標(biāo)簽引導(dǎo)符
% 批處理變量引導(dǎo)符
其次, :: 確實(shí)可以起到rem 的注釋作用, 而且更簡(jiǎn)潔有效; 但有兩點(diǎn)需要注意:
第一, 除了 :: 之外, 任何以 :開(kāi)頭的字符行, 在批處理中都被視作標(biāo)號(hào), 而直接忽略其后的所有內(nèi)容, 只是為了與正常的標(biāo)號(hào)相區(qū)別, 建議使用 goto 所無(wú)法識(shí)別的標(biāo)號(hào),
即在 :后緊跟一個(gè)非字母數(shù)字的一個(gè)特殊符號(hào).
第二, 與rem 不同的是, ::后的字符行在執(zhí)行時(shí)不會(huì)回顯, 無(wú)論是否用echo on打開(kāi)命令行回顯狀態(tài), 因?yàn)槊罱忉屍鞑徽J(rèn)為他是一個(gè)有效的命令行, 就此點(diǎn)來(lái)看, rem 在某些場(chǎng)合下將比 :: 更為適用; 另外, rem 可以用于 config.sys 文件中.
也可以使用以下的用法:
if exist command
device 是指DOS系統(tǒng)中已加載的設(shè)備, 在win98下通常有:
AUX, PRN, CON, NUL
COM1, COM2, COM3, COM4
LPT1, LPT2, LPT3, LPT4
XMSXXXX0, EMMXXXX0
A: B: C: ...,
CLOCK$, CONFIG$, DblBuff$, IFS$HLP$
具體的內(nèi)容會(huì)因硬軟件環(huán)境的不同而略有差異, 使用這些設(shè)備名稱時(shí),
需要保證以下三點(diǎn):
1. 該設(shè)備確實(shí)存在(由軟件虛擬的設(shè)備除外)
2. 該設(shè)備驅(qū)動(dòng)程序已加載(aux, prn等標(biāo)準(zhǔn)設(shè)備由系統(tǒng)缺省定義)
3. 該設(shè)備已準(zhǔn)備好(主要是指a: b: ...,
com1..., lpt1...等)
可通過(guò)命令 mem/d | find "device" /i 來(lái)檢閱你的系統(tǒng)中所加載的設(shè)備
另外, 在DOS系統(tǒng)中, 設(shè)備也被認(rèn)為是一種特殊的文件, 而文件也可以稱作字符設(shè)備; 因?yàn)樵O(shè)備(device)與文件都是使用句柄(handle)來(lái)管理的, 句柄就是名字,
類似于文件名, 只不過(guò)句柄不是應(yīng)用于磁盤(pán)管理, 而是應(yīng)用于內(nèi)存管理而已, 所謂設(shè)備加載也即指在內(nèi)存中為其分配可引用的句柄.
總結(jié)
- 上一篇: lyft amundsen简单试用
- 下一篇: Odoo 12开发之看板视图和用户端 Q