當(dāng)前位置:首頁文章首頁 IT學(xué)院 IT技術(shù)

批處理(bat)學(xué)習(xí)的一些總結(jié)

作者:  來源:  發(fā)布時(shí)間:2012-1-11 14:01:50  點(diǎn)擊:

這篇筆記是我對(duì)批處理學(xué)習(xí)的一些總結(jié),能在系統(tǒng)幫助里找到的內(nèi)容我就不寫了,太偏門的也不寫,只寫些個(gè)人感覺很好用的技巧,大部分屬于整理

一、set 篇:

1、set(無開關(guān))

set .=test

set.

::若一個(gè)變量以:\.這三個(gè)與路徑相關(guān)的符號(hào)開頭,用set查看以該字符打頭的變量時(shí)可以省去一個(gè)空格。

echo %tmp:*\=%

::顯示tmp變量第一個(gè)\之后的部分,其余變量替換與變量偏移太簡單不解釋

2、set /p 變量名=注釋<設(shè)備名

當(dāng)設(shè)備名為文件時(shí),因?yàn)槲募袚Q行符與回車符伴生,所以只取文件第一行作為var變量的內(nèi)容,但是不超過1024字節(jié);而當(dāng)設(shè)備名為nul或者com3時(shí),只顯示不換行的注釋,這種情況下可以省略變量名(如:set /p=Hello World

3、set /a,最具技巧的命令之一

set /a n=1,m=2

::同時(shí)把不同數(shù)值分別賦予兩個(gè)變量

set /a a=b=c=d=e=f=1

::用一條算式為多個(gè)變量同時(shí)賦值

set /a "1/n" 2>nul||echo 變量n非純數(shù)字或?yàn)榱?/p>

::利用分母不能為0的特征,用set判斷一個(gè)變量是否為非零純數(shù)字

set n=1

set /a "n=!!123|!!234&!!0"

::位運(yùn)算,!、^、|和&常用于布爾運(yùn)算,而邏輯位移常用于二進(jìn)制運(yùn)算(>>還可判斷數(shù)值是否為負(fù),見下例)

set /a n=-100,"1/(-100>>31)"||echo 變量n為負(fù)數(shù)

::順應(yīng)cmd中的正負(fù)數(shù)存儲(chǔ)特點(diǎn),可以用邏輯位移實(shí)現(xiàn)判斷正負(fù)數(shù)的“布爾運(yùn)算”,可以衍生出繁多的算法,比如稍加改動(dòng)就可以比較兩數(shù)甚至多個(gè)數(shù)的大小

set /a n=~-100

::利用~將所有二進(jìn)制的1、0逆轉(zhuǎn),負(fù)號(hào)在后或在前配合可以實(shí)現(xiàn)簡單加1或減1,這個(gè)技巧主要用來減少括號(hào)的使用,因?yàn)閪號(hào)與負(fù)號(hào)的優(yōu)先級(jí)都是高于算數(shù)運(yùn)算符的

set /a test=%test:~5,1%-0

::可以避免%test:~5,1%為空時(shí)出錯(cuò)的情況

set /a 十進(jìn)制=0x十六進(jìn)制,十進(jìn)制=0八進(jìn)制

::快速將十六進(jìn)制與八進(jìn)制數(shù)轉(zhuǎn)為十進(jìn)制,可惜沒有二進(jìn)制...

:loop

set /a n+=1001

echo %n:~-3%

goto loop

::這比常規(guī)的補(bǔ)位方法更優(yōu)越

for %%a in (test 123 ABC test @#$ 123) do set /a ".%%a+=1"

set .|findstr /v /e "=1"

::經(jīng)典的獲取字符串的重復(fù)次數(shù)的方案

二、for 篇:

這是批處理中最強(qiáng)的內(nèi)部命令,沒有之一!

1、for(無開關(guān))

for %%a in (c:\*.*) do echo %%a

::顯示C盤根目錄下所有非隱藏、非系統(tǒng)屬性文件

for %%a in (.\..) do echo %%~nxa

::顯示上一級(jí)目錄的文件夾名

set str=123,234,345

set str=%str:,=\%

for %%a in (%str%\..) do echo %%~nxa

::用前一個(gè)技巧,巧取倒數(shù)第二段字符串,與for /f "delims=\"相映成趣

for %%a in (*.txt) do (

for /f "useback delims=" %%b in ("%%a") do (

set str=%%b

for %%c in ("!str:分隔符=" "!") do (

for /f "tokens=1*" %%d in (%%c) do echo %%~d

)

)

)

::不帶參數(shù)的for與for /f配合,威力極大,僅舉此一例

for %%a in (123) do for %%a in (234) do for %%a in (345) do echo %%a

::其實(shí)如果只讀取最后一層for的參數(shù),即使多層for嵌套也可以使用同樣的參數(shù),比如%%a

for %%z in (!tmp!) do echo !%%z!

::目前已知的擺脫call實(shí)現(xiàn)多層變量嵌套的最好方法,不少人用

2、for /l

for /l %%a in () do echo 

::無限循環(huán),步數(shù)為0也是一樣的效果,但是沒這個(gè)簡潔

for /l %%a in (-4 1) do echo %%a

::for /l中的三項(xiàng)參數(shù)從左至右的三位分別是初始值、步數(shù)、終止點(diǎn),當(dāng)用戶給定的數(shù)量不足時(shí),將按從右至左的順序把不足的一項(xiàng)賦為0

3、for /d /r

for /r /d %%a in (*) do echo %%a

::可以遍歷所有子文件夾,之所以可以聯(lián)用r開關(guān)和d開關(guān)是因?yàn)樗鼈兊膮?shù)有交集,l開關(guān)和f開關(guān)就不行了。

4、for /f

for /f本身的技巧并不是特別多,它的優(yōu)勢是能夠?qū)⑵渌畹妮敵鲎鳛檩斎雭矸治,所以for /f可以說是當(dāng)之無愧的內(nèi)部命令之王

for /f "tokens=* delims=0123" %%a in ("0000123456") do echo %%a

::去除前綴的n個(gè)字符

for /f "skip=99" %%a in (1.txt) do echo 1.txt至少100行

::以前看到某版主寫的,印象頗深。

for /l %%a in (1 1 10) do (

for /f "tokens=1,2* delims=\" %%a in ("!tmp!") do (

for %%c in (%%a %%b) do echo %%c

set tmp=%%c

)

)

::將tokens的取值范圍無限拓展

set tmp=123=234=345=456

for /l %%a in (1 1 40) do (

for /f "tokens=1,2* delims==" %%a in ("!tmp!") do (

set str=!str!,%%a,%%b

set tmp=%%c

)

)

echo %str:~1%

::有時(shí)候set變量替換是無法替換一些特殊字符的,此時(shí)可以用for /f處理

set test=d:\test\

for %%a in (test.*) do (

if "%%~za" neq "%%~z$test:a" replace /p /u "%%a" "%%~dp$test:a"

)

::判斷當(dāng)前目錄下以test為名的文件是否在d:\test\文件夾下存在同名文件,如果存在且大小不同、修改日期更早,則替換之,否則不做處理。for幫助信息中的“%%~dp$path:a”參數(shù)似乎沒見人用過,雖然它的適用范圍很狹隘,但是特定的情況下不妨一試。

setlocal enabledelayedexpansion

set t=tmp

set @=t

for /f %%a in ('echo !%@%!') do echo !%%a!

::另一種三層嵌套方法,其實(shí)不實(shí)用。

三、findstr 篇

我最鐘愛的命令,可惜外部命令的啟動(dòng)速度太慢,所以實(shí)際運(yùn)用時(shí)較少露面。

findstr /s /m .* *.*

::其實(shí)findstr也是一個(gè)dir,雖然比dir慢些,卻多了查找文件內(nèi)容的功能

findstr /n .* 1.txt|findstr "^5000:"

::非常實(shí)用的取指定行的方法,配合正則可以取指定范圍之內(nèi)的行

set /p n=請(qǐng)輸入數(shù)字或大小寫字母

(echo !n!)|findstr /i "[0-9a-Z]"&&echo 輸入有誤!

::這個(gè)夠?qū)嵱冒桑坎唤忉?/p>

dir|findstr ['-Z]

::利用findstr和if命令中字符的實(shí)際大小順序?qū)崿F(xiàn)查找含有寬字符的行

findstr /x ".........." 1.txt

::查找1.txt中10字節(jié)的行

(type 1.txt&echo;)|findstr /o .*|more +1

::加上for,很容易獲取1.txt每行的字節(jié)數(shù)

findstr>1.txt /m /p .* *.*

dir /b /a-d|findstr>2.txt /v /i /m /g:1.txt

::獲取含有不可打印字符的文件名,關(guān)鍵是findstr取集

findstr "^Rar!" /g:1.txt

::此處1.txt是上個(gè)技巧的1.txt,內(nèi)容是所有含不可打印字符的文件列表,此技巧可搜索rar文件,雖然簡單,但是至今也未出錯(cuò)過,原創(chuàng)。

more>tmp +2 1.txt

findstr>前兩行.txt /x /v /g:1.txt 2.txt

::有時(shí)候可用此辦法獲取前幾行,當(dāng)然,絕大部分情況下沒有for /f合適,而且存在特殊字符bug

@echo off

findstr /n .* 1.txt>tmp1

find /n /v "" 2.txt|more>tmp2 +2

for /f "tokens=2*delims=]:" %%a in ('fc /n /lb10000 tmp1 tmp2^|sort') do (

echo;%%b

)

del tmp?

pause

::qzwqzw首創(chuàng)用fc /n同時(shí)輸出雙文本的思路,但是存在排序有可能被打亂的缺陷,所以加了個(gè)find彌補(bǔ)一下

首頁 上一頁 [1] [2] [3]  下一頁 尾頁

文章評(píng)論

軟件按字母排列: 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