- 1. 50個(gè)經(jīng)典BAT(批處理)實(shí)例
- 2. BAT解碼器(BAT解密器) 綠色版
- 3. adsl自動(dòng)撥號(hào)批處理
- 4. 批處理 for 語(yǔ)法精通
- 5. 戰(zhàn)地3(Battlefield 3)十一項(xiàng)修改器 1.02下載
- 6. 10個(gè)系統(tǒng)優(yōu)化的批處理(bat)文件
- 7. 批處理常用命令
- 8. 電池監(jiān)視桌面工具(Battery Monitor ) 1.6綠色版
- 9. 批處理命令(DOS命令)大全
- 10. Light Image Resizer(圖片批處理) 4.1.0.2便攜綠色...
批處理(bat)學(xué)習(xí)的一些總結(jié)
之所以放在一起,是因?yàn)檫@三個(gè)命令的功能有所交集
1、start
@echo off
%1 cd.>tmp
set /p=%1
%1 start /b "" %0 :(五秒后退出) tm
if not "%1"=="" goto %1
set /p n=輸入任意字符
if defined n (
del tmp
echo 您輸入的是%n%,五秒后退出。
) else echo 輸入為空!五秒后退出。
:(五秒后退出)
ping /n 5 localhost>nul
if exist %2p exit
pause
::妙用start /b讓set /p實(shí)現(xiàn)choice的延時(shí)功能,不知道哪位前輩首創(chuàng)的,再次贊一個(gè)。此處%1、%2的技巧僅作點(diǎn)綴,我只是覺(jué)得這樣“搭積木”很好玩才強(qiáng)加上去的。
2、call
set a=b
set b=c
call echo %%%a%%%
::不使用變量延遲仍然可以借助call實(shí)現(xiàn)變量的延遲讀取與嵌套,但是效率上有缺陷
3、cmd
set a=b
set b=c
cmd /c echo %%%a%%%
::這證明call一個(gè)命令時(shí)的效果近似于cmd /c,二者的區(qū)別體現(xiàn)在"for"和"if"這兩個(gè)命令不能用call運(yùn)行,因?yàn)閒or和if其實(shí)可能只是關(guān)鍵字,而非真實(shí)存在的命令
set a=b
set b=c
cmd /v:on /c echo !%a%!
::不需要setlocal,照樣可以使用變量延遲
%1 %0 :: echo;成功調(diào)用自身
%2
::個(gè)人很常用,這里用%1和%2的技巧為我所偏愛(ài),那個(gè)::可以視情況換為rem。雖然此處并未出現(xiàn)cmd命令,但其實(shí)運(yùn)行自身時(shí)執(zhí)行的就是cmd /c %0。
@echo off
%1 cmd /v:on /c %0 ::
set n=123
echo !n!
pause
::綜合前兩個(gè)技巧實(shí)現(xiàn)不使用setlocal,開(kāi)啟變量延遲
@echo off
set str=test測(cè)試1234
setlocal enabledelayedexpansion
for /f "delims=:; " %%a in ('((cmd /u /c echo !str!^)^&echo^;^;^)^|findstr /o ^;') do set /a n=%%a-5
for /f "delims=:" %%a in ('((echo !str!^)^&echo^;^;^)^|findstr /o ^;') do set /a d=n-%%a+3
set /a m=n/2,s=m-d
echo 共!m!個(gè)字符,!d!個(gè)單字節(jié)字符、!s!個(gè)雙字節(jié)字符
pause
::三步判斷單字符、雙字符個(gè)數(shù)的另類辦法。優(yōu)勢(shì)在于支持對(duì)超長(zhǎng)字符串進(jìn)行計(jì)算(此時(shí)用常規(guī)算法步驟多且難通用),缺點(diǎn)在于效率低。
ren 1.exe 1.bat
echo 請(qǐng)雙擊1.bat
::為什么這樣也可以運(yùn)行呢?因?yàn)閑xe的打開(kāi)方式是"%1" %*,bat是cmd /c "%1" %*,所以把exe當(dāng)做bat運(yùn)行時(shí),相當(dāng)于cmd /c 1.exe...不過(guò)這只適合雙擊打開(kāi),在cmd內(nèi)部調(diào)用此文件的時(shí)候是當(dāng)成真正的bat運(yùn)行的,所以會(huì)出錯(cuò)。
五、其他命令 篇
1、xcopy比copy強(qiáng)大得多,最大的遺憾在于它是外部命令
xcopy /a 源文件夾 目標(biāo)文件夾
::xcopy用在篩選上也很實(shí)用
xcopy /l /y /n %cd% ..
::巧取當(dāng)前目錄下文件的短名,并不會(huì)真的復(fù)制
xcopy /d:1-31-2011 /l "%cd%" tmp\
::獲取修改日期在2011年1月31日以后的文件清單
xcopy /t *.txt C:\test\
::復(fù)制含有txt文件的目錄結(jié)構(gòu)到C:\test
@echo 1.txt>list
xcopy /exclude:list ?.txt test\
::復(fù)制所有以單個(gè)字符為名的文件到test文件夾
xcopy /s *.txt ..\txt\
::復(fù)制所有以txt為名的子文件到上一級(jí)目錄中的txt文件夾
for /f "delims=" %%a in ('dir /s /b /ad^|sort -r') do rd "%%a" 2>nul
::刪除空文件夾的經(jīng)典思路,利用rd默認(rèn)不刪除非空文件夾的特性進(jìn)序刪除空文件夾
for /d %%a in (*) do (
xcopy /q /h /r /s /k "%%a" "tmp\"
rd /s /q "%%a"
ren "tmp" "%%a"
)
::刪除空文件夾的另類方案
2、相比于前面幾個(gè)大佬級(jí)的命令,這些命令算是比較不起眼的了,所以歸在一類
copy nul+Unicode.bat 解密.bat
::用Unicode文件頭來(lái)進(jìn)行編碼混淆加密的bat,可以用這條命令解密
echo>tmp 12323412 2323242134122434 345
more /t20 tmp>對(duì)齊.txt
type 對(duì)齊.txt
pause
::more命令的t開(kāi)關(guān)也有大用途,潛規(guī)則不解釋。
cmd /u /c echo 0123456789|more
::more命令會(huì)將cmd /u輸出的nul字符轉(zhuǎn)換為空格,從而實(shí)現(xiàn)逐字打印一行單字節(jié)字符。
@echo off&setlocal enabledelayedexpansion
set n=32768
(for %%a in (16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do sort /rec !n! %0&&set /a n-=%%a||set /a n+=%%a)>nul 2>nul
echo 最長(zhǎng)行有%n%個(gè)字符
pause
::當(dāng)最長(zhǎng)的行字符數(shù)大于128時(shí)可能可以用這個(gè)來(lái)判斷最長(zhǎng)行的字符數(shù)(短于128時(shí)rec開(kāi)關(guān)會(huì)失效,代碼中那一大堆2的N次方就是湊字?jǐn)?shù)的,實(shí)戰(zhàn)中可以省掉一些),支持超長(zhǎng)字符串,計(jì)算大文件時(shí)效率明顯優(yōu)于傳統(tǒng)算法,新折半法來(lái)自plp626的轉(zhuǎn)帖,sort的/rec開(kāi)關(guān)比較雞肋,想來(lái)想去也只想到這個(gè)用途,未見(jiàn)先例
ren 1.exe 1.bat
echo 請(qǐng)雙擊1.bat
::為什么可以把exe改為bat后綴名運(yùn)行呢?因?yàn)閑xe的打開(kāi)方式是"%1" %*,bat是cmd /c "%1" %*,所以把exe當(dāng)做bat運(yùn)行時(shí),相當(dāng)于cmd /c 1.exe...不過(guò)這只適合雙擊打開(kāi),在cmd內(nèi)部調(diào)用此文件的時(shí)候是當(dāng)成真正的bat運(yùn)行的,所以會(huì)出錯(cuò)。而且基于同樣的原因,它還可以改成com或者cmd后綴名來(lái)執(zhí)行。
3、再介紹一些在cmd窗口中的技巧,當(dāng)然它們僅僅是“欺騙”cmd窗口,一旦輸出到文件就原形畢露:
@echo off
echo 1
echo 2
echo 3
echo 退行了
pause>nul
::這個(gè)太牛了,不知道哪位發(fā)現(xiàn)的
set "dq= "
(echo 2、計(jì)劃生育的重要性%dq%啊
echo 1、貫徹落實(shí)科學(xué)發(fā)展觀%dq%哇)|sort
::借助tab鍵與退格符實(shí)現(xiàn)多行捆綁排序并錯(cuò)行顯示,tab與退格之間的那個(gè)空格是關(guān)鍵,否則變?yōu)橥诵?/p>
set /p=同一行顯示不同顏色:
set /p=紅底藍(lán)字
echo 黃底綠字
findstr /a:41 .* 紅底藍(lán)字?
findstr /a:62 .* 黃底綠字?
del>nul 紅底藍(lán)字 黃底綠字
pause
::經(jīng)常見(jiàn)到的在同一行顯示不同顏色的辦法,不過(guò)很多人總是用 (四個(gè)退格四個(gè)空格),說(shuō)明沒(méi)理解退格鍵的意義
@prompt $_
dir fuck.tmp
pause
::利用這個(gè)prompt,打開(kāi)回顯后可以同時(shí)輸出命令與命令結(jié)果,而不會(huì)有多余內(nèi)容,適合制作bat運(yùn)行日志
echo
::這個(gè)黑色的圓點(diǎn)在前面的介紹中作為配角出現(xiàn)過(guò),是ansi碼中的0x07,也等同于在cmd中輸入的ctrl+G,它每次被顯示在屏幕上時(shí)都會(huì)發(fā)出“滴”的一聲,所以以后findstr *.*時(shí)一定要留神了(除非不得已,否則需要把結(jié)果顯示到窗口時(shí)建議加上/p開(kāi)關(guān)),萬(wàn)一不小心打印出幾萬(wàn)個(gè),你的電腦會(huì)像發(fā)電報(bào)一樣響個(gè)不停,我中招N次了...
六、cmd運(yùn)行機(jī)制 篇
1、預(yù)處理機(jī)制:特殊字符優(yōu)先級(jí)、語(yǔ)句和語(yǔ)塊的劃分
setlocal enabledelayedexpansion
(set n=3
set /a n=2,n=%n%+!n!+n)
::利用預(yù)處理機(jī)制,將一個(gè)變量解釋為多個(gè)值
setlocal enabledelayedexpansion
echo ^^!
::當(dāng)語(yǔ)句中存在變量延遲符號(hào)時(shí),將被預(yù)處理兩次,這是一定要注意的
set str=.
set "str name=str"
for %%a in (%tmp%) do if defined %%a echo %%a 存在變量str
::利用for的參數(shù)變量在if參數(shù)劃分之后才被解釋的特點(diǎn),彌補(bǔ)if defined對(duì)于空格變量名的兼容性缺陷,本質(zhì)原因是for和if都是特殊的函數(shù),他們的參數(shù)設(shè)置在語(yǔ)塊的預(yù)處理中就已經(jīng)被cmd“記住”了,之后無(wú)法對(duì)其進(jìn)行改變。
- 1. 批處理(bat)學(xué)習(xí)的一些總結(jié)
- 2. 為了噴mybatis我下載了mybatis源碼
- 3. 鐵匠給你一本技能書(shū)讓你第一次學(xué)習(xí)技能
- 4. 關(guān)于Aspjpeg簡(jiǎn)例的學(xué)習(xí)分享
- 5. ASP學(xué)習(xí)之Cookie的基本使用技巧
- 6. ASP基本技巧學(xué)習(xí)分享
- 7. ASP中數(shù)據(jù)庫(kù)知識(shí)學(xué)習(xí)
- 8. 利用asp生成excel報(bào)表與打印的實(shí)例學(xué)習(xí)
- 9. 在學(xué)習(xí)ASP中必須認(rèn)識(shí)到的十一種數(shù)學(xué)函數(shù)
- 10. 分享學(xué)習(xí)asp動(dòng)態(tài)include文件