WINDOWS命令和批處理

另外查看WIndows和Linux的所有命令:http://www.ss64.com/nt/

該教程一共分爲4大部分,第一部分是批處理的專用命令,第二部分是特殊的符號與批處理,第三部分是批處理與變量,第四部分是完整案例。

 

%~dp0 表示當前bat所在的目錄。

第一部分:批處理的專用命令 

批處理文件是將一系列命令按一定的順序集合爲一個可執行的文本文件,其擴展名爲BAT。這些命令統稱批處理命令,下面我就來給大家介紹一下批處理的命令。 
1、 REM 
REM 是個註釋命令一般是用來給程序加上註解的,該命令後的內容在程序執行的時候將不會被顯示和執行。 

2、 ECHO 
ECHO 是一個回顯命令主要參數有OFF和 ON,一般用ECHO message來顯示一個特定的消息,如果沒有任何參數顯示當前的echo的設置 。

用法:
ECHO [ON | OFF] :如果是OFF僅顯示批處理的運行結果,如果是ON,不僅顯示運行結果,而且顯示此批處理的每一行,一般使用ON來調試。默認爲ON。
ECHO [message] :顯示message。
ECHO :顯示當前的echo設置。

3、 GOTO 
GOTO 即爲跳轉的意思。在批處理中允許以“:XXX”來構建一個標號然後用GOTO 標號 直接來執行標號後的命令。例 
:LABEL 
REM 上面就是名爲LABEL的標號。 
DIR C:\\ 
DIR D:\\ 
GOTO LABEL 
REM 以上程序跳轉標號LABEL處繼續執行。 

4、CALL 
CALL 命令可以在批處理執行過程中調用另一個批處理,當另一個批處理執行完後再繼續執行原來的批處理。例: 
批處理2.BAT內容如下: 
ECHO 這就是2的內容 


批處理1.BAT內容如下: 
ECHO 這是1的內容 
CALL 2.BAT 
ECHO 1和2的內容全部顯示完成 


執行結果如下: 
C:\\>1.BAT 
這是1的內容 
這就是2的內容 
1和2的內容全部顯示完成 

5、PAUSE 
PAUSE 停止系統命令的執行並顯示下面的內容。例: 
C:\\> PAUSE 
請按任意鍵繼續 . . . 

6、 IF / ELSE
IF 條件判斷語句,語法格式如下:
IF [NOT] DEFINED variable command
IF [NOT] ERRORLEVEL number command
IF CMDEXTVERSION number command

 


IF [/I] [NOT] item1==item2 command
IF [/I] item1 compare-op item2 command
IF [/I] item1 compare-op item2 (command) ELSE (command)


IF [NOT] EXIST filename command
IF [NOT] EXIST filename (command) ELSE (command)


說明: 
1)[NOT] 將返回的結果取反值即“如果沒有”的意思。 
2)ERRORLEVEL 是命令執行完成後返回的退出值。Number 退出值的數字取值範圍0~255。判斷時值的排列順序應該又大到小。返回的值大於或等於指定的值時條件成立。 
3)DEFINED 用來檢測variable是否定義。
4)item1==item2 此時的item爲string,英文字符的大小寫將看做不同,可以用/I來不區分大小寫,這個條件中的等於號必須是2個(絕對相等),條件想等後即執行後面的 command 。
5) 當item1和item2爲數字時,compare-op可以爲EQU : equal  NEQ : not equal LSS : less than < LEQ : less than or equal <= GTR : greater than > GEQ : greater than or equal >=。
6)EXIST filename 爲文件或目錄存在的意思。 
7)IF ERRORLEVEL這條語句必須放在某一個命令後面。執行命令後由IF ERRORLEVEL來判斷命令的返回值。 


實例: 
1) IF [NOT] ERRORLEVEL number command 
檢測命令執行完後的返回值做出判斷。 
echo off 
dir z: 
rem 如果退出代碼爲1(不成功)就跳至標題1處執行 
IF ERRORLEVEL 1 goto 1 
rem 如果退出代碼爲0(成功)就跳至標題0處執行 
IF ERRORLEVEL 0 goto 0 
:0 
echo 命令執行成功! 
Rem 程序執行完畢跳至標題exit處退出 
goto exit 
:1 
echo 命令執行失敗! 
Rem 程序執行完畢跳至標題exit處退出 
goto exit 
:exit 
Rem 這裏是程序的出口 


2)IF string1==string2 command 
檢測當前變量的值做出判斷 
ECHO OFF 
IF %1==2 goto no 
Echo 變量相等! 
Goto exit 
:no 
echo 變量不相等 
goto exit 
:exit 
大家可以這樣看效果 C:\\>test.bat 數字 

3) IF [NOT] EXIST filename command 
發現特定的文件做出判斷 
echo off 
IF not EXIST autoexec.bat goto 1 
echo 文件存在成功! 
goto exit 
:1 
echo 文件不存在失敗! 
goto exit 
:exit 
這個批處理大家可以放在c盤和d盤分別執行看看效果。 


7、 FOR 
FOR這個命令比較特殊是一個循環執行命令的命令,同時FOR的循環裏面還可以套用FOR在進行循環。這篇我們介紹基本的用法就不做套用的循環了,後面再來講解套用的循環。在批處理中FOR的命令在批處理中如下: 
FOR [%%c] IN (set) DO [command] [arguments] 
在命令行中命令如下,少一個%: 
FOR [%c] IN (set) DO [command] [arguments]

常用參數: 

1)無參數,表示循環處理文件夾下的所有文件。
2)/R表示遞歸到子文件夾。
3)/L 該集表示以增量形式從開始到結束的一個數字序列。因此,(1,1,5) 將產生序列 1 2 3 4 5,(5,-1,1) 將產生序列 (5 4 3 2 1)。 
4)/D 處理多個文件夾。 
5)/F 從指定的文件中讀取數據作爲變量,或從一個命令的輸出中讀取數據。
6)其他的選項:
eol=c - 指一個行註釋字符的結尾(就一個) ,
skip=n - 指在文件開始時忽略的行數。 
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。 
tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代的 for 本身。這會導致額外變量名稱的分配。m-n格式爲一個範圍。通過 nth 符號指定 mth。如果符號字符串中的最後一個字符星號,那麼額外的變量將在最後一個符號解析之後分配並接受行的保留文本。 
usebackq - 指定新語法已在下類情況中使用:在作爲命令執行一個後引號的字符串並且一個單引號字符爲文字字符串命令並允許在 filenameset中使用雙引號擴起文件名稱。 


實例:

1)會枚舉當前環境中的環境變量名稱。
echo off
FOR /F "delims==" %%G IN ('SET') DO @Echo %%G

echo off
FOR /F "usebackq delims==" %%G IN (`SET`) DO @Echo %%G

2)以下列舉一個簡單的例子,他將說明參數/L和沒有參數的區別: 
刪除文件1.TXT 2.TXT 3.TXT 4.TXT 5.TXT 
例: 
ECHO OFF 
FOR /L %%F IN (1,1,5) DO DEL %%F.TXT 
 
FOR %%F IN (1,2,3,4,5) DO DEL %%F.TXT 
以上2條命令執行的結果都是一樣的如下: 
C:\\>DEL 1.TXT 
C:\\>DEL 2.TXT 
C:\\>DEL 3.TXT 
C:\\>DEL 4.TXT 
C:\\>DEL 5.TXT 

8、 SETLOCAL 
開 始批處理文件中環境改動的本地化操作。在執行 SETLOCAL 之後所做的環境改動只限於批處理文件。要還原原先的設置,必須執行 ENDLOCAL。 達到批處理文件結尾時,對於該批處理文件的每個尚未執行的 SETLOCAL 命令,都會有一個隱含的 ENDLOCAL 被執行。例: 
@ECHO OFF 
SET PATH /*察看環境變量PATH 
PAUSE 
SETLOCAL 
SET PATH=E:\\TOOLS /*重新設置環境變量PATH 
SET PATH 
PAUSE 
ENDLOCAL 
SET PATH 
從 上例我們可以看到環境變量PATH第1次被顯示得時候是系統默認路徑。被設置成了E:\\TOOLS後顯示爲E:\\TOOLS但當 ENDLOCAL後我們可以看到他又被還原成了系統的默認路徑。但這個設置只在該批處理運行的時候有作用。當批處理運行完成後環境變量PATH將會還原。 

9、 SHIFT 
SHIFT命令可以讓在命令上的的命令使用超過10個(%0~%9)以上的可替代參數例: 
ECHO OFF 
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9 
SHIFT 
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9 
SHIFT 
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9 
執行結果如下: 
C::\\>SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11 
1 2 3 4 5 6 7 8 9 
2 3 4 5 6 7 8 9 10 
3 4 5 6 7 8 9 10 11 
以上就是基於WIN2000下的9個批處理命令。 

第二部分:特殊的符號與批處理 

在命令行下有些符號是不允許使用的但有些符號卻有着特殊的意義。 
1、 符號(@) 
@在批處理中的意思是關閉當前行的回顯。我們從上面知道用命令echo off可以關掉整個批處理的命令回顯但卻不能不顯示echo off這個命令。現在我們在這個命令前加上@這樣echo off這一命令就被@關閉了回顯從而達到所有命令均不回顯得要求 
2、 符號(>) 
>的意思是傳遞並覆蓋。他所起的作用是將運行後的回顯結果傳遞到後面的範圍(後面可是文件也可是默認的系統控制檯)例: 
文件1.txt的文件內容爲: 
1+1 
使用命令c:\\>dir *.txt >1.txt 
這時候1.txt的內容如下 
驅動器 C 中的卷沒有標籤。 
卷的序列號是 301A-1508 
C:\\ 的目錄 
2003-03-11 14:04 1,005 FRUNLOG.TXT 
2003-04-04 16:38 18,598,494 log.txt 
2003-04-04 17:02 5 1.txt 
2003-03-12 11:43 0 aierrorlog.txt 
2003-03-30 00:35 30,571 202.108.txt 
5 個文件 18,630,070 字節 
0 個目錄 1,191,542,784 可用字節 
>將命令執行的結果覆蓋了原始的文件內容。 
在傳遞給控制檯的時候程序將不會有任何回顯(注意:這裏的回顯跟echo off關掉的回顯不是同一概念。Echo off關掉的是輸入命令的回顯,這裏的回顯是程序執行中或後的回顯)例: 
C:\\>dir *.txt >nul 
程序將沒有任何顯示也不會產生任何痕跡。 
3、 符號(>>) 
符號>>的作用與符號>相似,但他們的區別在於>>是傳遞並在文件末尾追加>>也可將回顯傳遞給控制檯(用法同上)例: 
文件1.txt內同爲: 
1+1 
使用命令c:\\>dir *.txt >>1.txt 
這時候1.txt的內容如下 
1+1 
驅動器 C 中的卷沒有標籤。 
卷的序列號是 301A-1508 
C:\\ 的目錄 
2003-03-11 14:04 1,005 FRUNLOG.TXT 
2003-04-04 16:38 18,598,494 log.txt 
2003-04-04 17:02 5 1.txt 
2003-03-12 11:43 0 aierrorlog.txt 
2003-03-30 00:35 30,571 202.108.txt 
5 個文件 18,630,070 字節 
0 個目錄 1,191,542,784 可用字節 
>>將命令執行的結果覆加在了原始的文件內容後面。 
4、 符號(|) 
|是一個管道傳輸命令意思是將上一命令執行的結果傳遞給下一命令去處理。例: 
C:\\>dir c:\\|find "1508" 
卷的序列號是 301A-1508 
以上命令的意思爲查找c:\\的所有並發現1508字符串。Find的用法請用 find /?自行查看 
在不使用format的自動格式化參數的時候我是這樣來自動格式化盤片的 
echo y|fornat a: /s /q /v:system 
用過format命令的人都知道format有一個交互對化過程,要使用者輸入y來確定當前的命令是否被執行。在這個命令前加上echo y並用管道傳輸符|將echo執行的結果y傳遞給format從而達到手工輸入y的目的(這條命令有危害性,測試的時候請謹慎) 
5、 符號(^) 
^ 是對特殊符號 > 、<、 &、的前導字符。在命令中他將以上的3個符號的特殊動能去掉僅僅只吧他們當成符號而不使用他們的特殊意義。例: 
c:\\>echo test ^> 1.txt 
test > 1.txt 
從上面可以看出並沒有把test寫入文件1.txt而是將test >1.txt 當字符串顯示了出來。這個符號在遠程構建批處理的時候很有效果。 
6、 符號(&) 
&符號允許在一行中使用2個以上不同的命令,當第一個命令執行失敗將不影響第2個命令的執行。例: 
c:\\> dir z:\\ &dir y:\\ &dir c:\\ 
以上的命令將會連續顯示z: y: c:盤內的內容不理會該盤符是否存在。 
7、 符號(&&) 
&&符號也是允許在一行中使用2個以上不同的命令,當第一個命令執行失敗後後續的命令將不會再被執行。例: 
c:\\> dir z:\\ &&dir y:\\ &&dir c:\\ 
以上的命令將會提示檢查是否存在z:盤如果存在則執行,如果不存在則停止執行所有的後續命令 
8、 符號(" ") 
" "符號允許在字符串中包含空格。進入一個特殊的目錄可以用如下方法例: 
c:\\>cd “Program Files” 
c:\\>cd progra~1 
c:\\>cd pro* 
以上方法都可以進入Program Files目錄 
9、 符號(,) 
,符號相當於空格。在某些特殊的情況下可以用,來代替空格使用。例: 
c:\\>dir,c:\\ 
10、 符號(;) 
;符號當命令相同的時候可以將不同的目標用;隔離開來但執行效果不變。如執行過程中發生錯誤則只返回錯誤報告但程序還是會繼續執行。例: 
DIR C:\\;D:\\;E:\\F:\\ 
以上的命令相當於 
DIR C:\\ 
DIR D:\\ 
DIR E:\\ 
DIR F:\\ 
當然還有些特殊的符號但他們的使用範圍很小我就不再這裏一一的說明了。 

第三部分:批處理與變量 

在批處理中適當的引用變量將會使你所編制的程序應用面更廣。批處理每次能處理的變量從%0~%9共10個。其中%0默認給批處理的文件名使用。除非在使用SHIFT命令後%0才能被%1所替代。引用shift命令的例子如果把%1前面多加上一個%0那麼結果如下: 
C::\\>SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11 
SHIFT.BAT 1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 10 
2 3 4 5 6 7 8 9 10 11 
系統是如何區分每個變量的呢,系統區分變量的規則爲字符串中間的空格,即只要發現空格就把空格前面的字符當作一個變量而空格後面的字符則作爲另一個變量。如果你的變量是一個當中包含空格的長目錄名這時候你需要用上一節特殊符號8中所用的引號將他圈起來。例: 
批處理內容爲: 
ECHO %1 
ECHO %2 
ECHO %3 
輸入命令: 
C:\\>TEST “Program Files” Program Files 
Program Files 
Program 
Files 
在 一個複雜的批處理中又可能同時使用的變量會超過10個這時候會和系統的規則想衝突那麼這個問題怎麼解決呢?在系統中還有一種變量稱之爲環境變量(使用 SET命令可以查看當前系統的環境變量)如當前系統目錄是%windir%或%SystemRoot%等。當同時使用的參數超過10個的時候,我們可以把 某些在後面的程序中還要調用的變量保存爲環境變量。具體用法如 SET A=%1 這樣我們就命名了一個新的環境變量A 在調用變量A的時候要%A%這樣調用,環境變量不受SHIFT命令影響。如果要改變一個環境變量需要重新對其設置才能改變。當然也可以進行變量與變量之間 的傳遞來達到目的。下面我們來看一個例子,批處理如下: 
ECHO OFF 
SET PASS=%1 
SHIFT 
SET PASS1=%1 
SHIFT 
ECHO %PASS% %PASS1% %1 %2 %3 %4 %5 %6 %7 %8 %9 
SHIFT 
ECHO %PASS% %PASS1% %9 
SET PASS=%PASS1% 變量的傳遞 
SET PASS1=%9 
SHIFT 
ECHO %PASS% %PASS1% %9 
使用命令:C:\\>TEST A B 3 4 5 6 7 8 9 10 K L 
A B 3 4 5 6 7 8 9 10 K 注意:這一行顯示了11個變量 
A B L 在使用了3次SHIFT之後%9變成了L 
B L 變量的傳遞後的結果 

第四部分:完整案例 
實例1列舉進程.bat:

@echo for each ps in getobject _ >ps.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_process").instances_ >>ps.vbs
@echo wscript.echo ps.handle^&vbtab^&ps.name^&vbtab^&ps.executablepath:next >>ps.vbs
cscript //nologo ps.vbs & del ps.vbs
pause

實例2查看電腦硬件信息.bat:

start C:\WINDOWS\PCHealth\HelpCtr\System\sysinfo\sysComponentInfo.htm

實例3查看進程使用的端口.bat:

@echo off 
color 1f 
Title XP端口-進程查詢 
setlocal enabledelayedexpansion 
echo ╔-                              -╗ 
echo   本機開放的端口及使用該端口的進程 
echo ╚-                              -╝ 
echo ------------------------------------ 
echo          端口號           進程名稱       
ECHO TCP協議: 
::利用netstat命令找出使用TCP協議通信的端口,並將結果分割; 
::將第二個參數(IP加端口)傳給%%i,第五個參數(PID號)傳給%%j; 
for /F "usebackq skip=4 tokens=2,5" %%i in (`"netstat -ano -p TCP"`) do ( 
  call :Assoc %%i TCP %%j 
  echo           !TCP_Port!           !TCP_Proc_Name!  
) 

ECHO UDP協議: 
for /F "usebackq skip=4 tokens=2,4" %%i in (`"netstat -ano -p UDP"`) do (  
  call :Assoc %%i UDP %%j 
  echo           !UDP_Port!           !UDP_Proc_Name! 
) 
echo 按任意鍵退出 
pause>nul 

:Assoc 
::對%1(第一個參數)進行分割,將第二個參數傳給%%e。在本程序中,%1即爲上面的%%i(形式爲:IP:端口號) 
for /F "tokens=2 delims=:" %%e in ("%1") do ( 
    set  %2_Port=%%e 
  ) 
:: 查詢PID等於%3(第三個參數)的進程,並將結果傳給變量?_Proc_Name,?代表UDP或者TCP; 
for /F "skip=2 usebackq delims=, tokens=1" %%a in (`"Tasklist /FI "PID eq %3" /FO CSV"`) do ( 
   ::%%~a表示去掉%%a外面的引號,因爲上述命令的結果是用括號括起來的。  
   set %2_Proc_Name=%%~a 
  ) 

實例4查看網關的MAC地址.bat:

@echo off
set /p getway="請輸入網關IP地址:"%getway%
arp -a|find "%getway% "
pause

實例5顯示網絡配置.bat:

@echo off
:: 代碼編寫:3742668 代碼修訂:namejm www.cn-dos.net

::調用格式:
call :select "ip address" "ip"
call :select "Physical Address" "mac"
call :select "Default Gateway" "gateway"
call :select "DNS Servers" "dns"
call :select "Description" "netcard"

:: 演示效果
echo IP:%ip%
echo MAC:%mac%
echo DNS:%dns%
echo GATEWAY:%gateway%
echo NETCARD:%netcard%
pause>nul
goto :eof

::**************************************************************
::              解析ipconfig命令輸出通用函數
::**************************************************************
:select
    for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| findstr /i /c:%1') do if not "!%~2!" == "" set "%~2=%%i"
goto :eof

實例6中文顯示ping結果.bat:

@echo off
color f2
echo.
set for=於
set of=的
set with=用
set in=(以
set data:=數據
set milli-seconds:=毫秒爲單位)
set Approximate=大約
set times=時間:
set round=來回
set trip=行程
set Reply=應答
set from=來自
set bytes=字節
set time=時間:
set timed=時間
set out=超過
set statistics=統計
set Packets:=包:
set Sent=已發送=
set Received=已收到=
set Lost=已丟失=
set loss)=丟失)
set Minimum=最小值=
set Maximum=最大值=
set Average=平均值=
set TTL=TTL=
setlocal enabledelayedexpansion
set a=
set/p a=請輸入要ping的網址或IP   
for /f "delims=" %%i in ('ping %a%') do (
    set ret=
    for %%a in (%%i) do if defined %%a (set ret=!ret!!%%a!) else set ret=!ret! %%a 
    if not "!ret!"=="" (set ret=!ret:time=時間! && echo !ret!) else echo.
)
pause>nul

完!


來源: <http://www.cnblogs.com/itech/archive/2009/04/15/1436409.html>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章