bat腳本
--莫非
BAT腳本與shell腳本區別
Shell腳本使用Linux/Unix下的命令,一般文件開頭以#號來告訴系統這個腳本需要什么解釋器來執行(如:#!/bin/bash采用bash而不是dash來執行)。而bat文件是dos下的批處理文件。批處理文件是無格式的文本文件,它包含一條或多條命令,它的文件擴展名為.bat 或.cmd。
常用命令1:where、cls、title、color、mode con
Where
顯示符合搜索模式的文件位置: Where \R C:\ *.dll \F \T
Cls:清屏
Title
設置控制台BAT的標題
Color
設置bat顯示的背景和前景色:color 02 (背景黑色,字符綠色)
MODE CON
設置bat的設置窗體大小:MODE CON COLS=200 LINES=1000
常用命令2:@、echo、::、rem、pause、:和goto、%以及if
@
@的作用就是讓腳本在執行時不顯示命令部分:@echo off
echo
echo命令的另一種用法一:可以用它來顯示信息:echo Edit by CODERED
echo命令的另一種用法二:可以直接編輯文本文件:echo nbtstat -A 192.168.0.1 > a.bat
::、rem
::和rem是注釋命令: ::close echo
與rem不同的是,::后的字符行在執行時不會回顯, 無論是否用echo on打開命令行回顯狀態,另外,rem 可以用於config.sys文件中.
pause
pause是暫停命令:pause
:和goto
goto是個跳轉命令,: 是一個標簽,當程序運行到goto時,將自動跳轉到:定義的部分去執行了:
……
goto end
……
:end
%
%是批處理變量引導符,為命令行傳遞給批處理的參數(多個%一起使用的情況除外,以后還將詳細介紹):
set p=”abcdefg” & echo %p:~3,2%
If
輸入判斷: if "%1"=="" goto usage
存在判斷:
if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif
結果判斷: if errorlevel 1 pause & edit %1.asm
常用命令3:call、find、for、set、shift
Call
call命令用來從一個批處理腳本中調用另一個批處理腳本:
echo %1 This is a call example.
call a.bat
find
find用來在文件中搜索特定字符串,通常也作為條件判斷的鋪墊程序:
type a.txt | find "7626" && echo "Congratulations! You have infected GLACIER!"
shift
改變傳入的參數偏移量,如將%3移位到%2,將%4移位到%3,等等;並且不影響%0和%1:
SHIFT /2
Set
顯示、設置或刪除cmd.exe環境變量。
- Set path=”D:\”
- Set /p input=請輸入: & echo 你輸入的是:%input%
- setlocal enabledelayedexpansion
Set /p input=請輸入: & echo 你輸入的是:!input!
For
基本格式:
FOR %%variable IN (set) DO command [command-parameters]
/D參數(匹配目錄):
for /d %%i in (c:\*) do echo %%i
/R參數(匹配文件)
for /r [c:\] %%i in (???.exe) do if exist %%i echo %%i
/L參數(該集表示以增量形式從開始到結束的一個數字序列)
for /l %%i in (1,1,5) do @echo %%i
/F參數
使用文件解析來處理命令輸出、字符串及文件內容。使用迭代變量定義要檢查的內容或字符串,並使用各種options選項進一步修改解析方式。默認情況下,/F 傳遞每個文件每一行的第一個空白分隔符號。跳過空行。
for /f "[eol=; skip=1] delims=" %%i in ('net user') do @echo %%i
管道命令 |、>、>>、>、>&、<&
|
|命令的作用,就是讓前一命令的輸出當做后一命令的輸入:
help | more,ipconfig /all | find “IPv4”
>
>會清除掉原有文件中的內容后把新的內容寫入原文件: echo @echo off > a.bat
>>
>>只會另起一行追加新的內容到原文件中,而不會改動其中的原有內容:
echo exit >> a.bat
<
<是輸入重定向命令,從文件中讀入命令輸入,而不是從鍵盤中讀入
>&
>&將一個句柄的輸出寫入到另一個句柄的輸入中
<&
<&剛好和>&相反,從一個句柄讀取輸入並將其寫入到另一個句柄輸出中
組合命令:&、&&、||
組合命令,顧名思義,就是可以把多個命令組合起來當一個命令來執行,那么這多個命令就要用這些組合命令連接起來放在同一行,因為批處理認行不認命令數目
&
&命令作用是用來連接n個DOS命令,並把這些命令按順序執行,而不管是否有命令執行失敗:
copy a.txt b.txt /y & del a.txt
&&
&&可以把它前后兩個命令組合起來當一個命令來用,一旦發現有命令出錯將不繼續執行剩下的命令:
dir 文件://1%/www/user.mdb && copy 文件://1%/www/user.mdb e:\backup\www
if exist 文件://1%/www/user.mdb copy 文件://1%/www/user.mdb e:\backup\www
dir c:\ && dir d:\ > a.txt;
得不到預期結果必須:
dir c:\ > a.txt && dir d:\ >> a.txt
||
||命令執行正確就退出此命令組合,不再執行剩下的命令:
dir s*.exe || echo Didn't exist file s*.exe & pause & exit
其他符號:,、;、””、()、!
;
分號,當命令相同時,可以將不同目標用;來隔離,但執行效果不變,如執行過程中發生錯誤,則只返回錯誤報告,但程序仍會執行。
dir c:\;d:\;e:\;z:\ > 1.txt
,
逗號相當於空格,在某些情況下“,”可以用來當做空格使用:
dir,C:\
“”
雙引號允許在字符串中包含空格:
cd,"C:\ program files"
()
小括號在批處理編程中有特殊的作用,左右括號必須成對使用,括號中可以包括多行命令,這些命令將被看成一個整體,視為一條命令行。
(echo a && echo bb) > 1.txt
!
在變量延遲問題中,用來表示變量,即%var%應該表示為!var!
Set /p input=請輸入: & echo 你輸入的是:!input!
if…else…條件語句
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
)
循環語句
指定次數循環
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]
同前面一樣,command可以用括號來組合:
FOR /R [[drive:]path] %variable IN (set) DO (
Command1
Command2
……
commandn
)
條件循環
上面的循環結構是用for命令來實現的,for命令循環有一個缺點,就是整個循環被當作一條命令語句,涉及到變量延遲的問題。
利用goto語句和if條件判斷,dos可以實現條件循環:
@echo off
set var=0
rem ************循環開始了
:continue
set /a var+=1
echo 第%var%次循環
if %var% lss 100 goto continue
rem ************循環結束了
echo 循環執行完畢
pause
子程序
在批處理程序中可以調用外部可運行程序,比如exe程序,也可調用其他批處理程序,批處理可以調用本程序中的一個程序段,相當於子程序,這些子程序一般放在主程序后面。
子程序調用格式:
CALL :label arguments
子程序語法:
:label
command1
command2
......
commandn
goto :eof
在子程序段中,參數%0指標簽:label
子過程一般放在最后,並且注意在主程序最后要加上exit或跳轉語句,避免錯誤的進入子過程。
子程序和主程序中的變量都是全局變量,其作用范圍都是整個批處理程序。
傳至子程序的參數在call語句中指定,在子程序中用%1、%2至%9的形式調用,而子程序返回主程序的數據只需在調用結束后直接引用就可以了,當然也可以指定返回變量。
打印你好:
@echo off
call :sub return
echo 子程序返回值:%return%
pause
goto :eof
:sub
set %1=你好
goto :eof
設計一個求多個整數相加的子程序:
@echo off
set sum=0
call :sub 10 20 35 40 50
echo 數據求和結果:%sum%
pause
goto :eof
:sub
rem 參數1為返回變量名稱
set /a sum+=%1
shift /1
if not "%1"=="" goto sub
goto :eof
運行結果:155
變量嵌套與命令嵌套
和其它編程語言相比,dos功能顯得相對簡單,要實現比較復雜的功能,需要充分運用各種技巧,變量嵌套與命令嵌套就是此類技巧之一。
簡單的說,命令嵌套首先用一條dos命令生成一個字符串,而這個字符串是另一條dos命令,用call語句調用字符串將其執行,從而得到最終結果。
用call語句實現命令嵌套:
@echo off
set str1=aaa echo ok bbb
echo 初始字符串:%str1%
echo 生成命令字符串如下:
echo %str1:~4,7%
echo 運行命令字符串生成最終結果為:
call %str1:~4,7%
pause