Windows 批處理(bat)語法大全


本文是學習bat整理的筆記,由於內容較多,建議結合右側文章大綱查看。

%~dp0[獲取當前路徑]

%~dp0 “d”為Drive的縮寫,即為驅動器,磁盤“p”為Path縮寫,即為路徑,目錄

cd %~dp0 :進入批處理所在目錄

cd %~dp0bin\ :進入批處理所在目錄的bin目錄

示例

這個示例在win10 x64測試正常

::作用:以管理員身份安裝Apache
d:
cd %~dp0bin\
httpd.exe -k install -n "Apache24"

運行結果

以管理員身份運行 示例.bat ,執行結果如下:

C:\Windows\system32>d:
D:\>cd D:\Server\Apache24\bin\
D:\Server\Apache24\bin>httpd.exe -k install -n "Apache24"

我的常用命令

%cd%[執行的路徑]

當前執行的路徑,並非目標文件的路徑

taskkill /f /im notepad.exe [終止進程]

taskkill /?打開幫助

image

cmd窗口中文亂碼

CMD窗口右鍵/默認值,打開屬性選擇 “默認代碼頁為簡體中文GBK”,

image

獲取命令幫助 xxx /?

遇到記不清楚的命令,但記得名字,就可以鍵入 命令名 空格 /?就會有詳細的該命令的幫助了,比如:ping /?     cd /?

imageimage

查看內置命令的幫助信息

ver /?

cmd /?

set /?

rem /?

if /?

echo /?

goto /?

for /?

shift /?

call /?

其他常用的命令

type /?

find /?

findstr /?

copy /?

一、基礎語法

1.批處理文件是一個“.bat”結尾的文本文件,這個文件的每一行都是一條DOS命令。可以使用任何文本文件編輯工具創建和修改。

2.批處理是一種簡單的程序,可以用 if 和 goto 來控制流程,也可以使用 for 循環。

3.批處理的編程能力遠不如C語言等編程語言,也十分不規范。

4.每個編寫好的批處理文件都相當於一個DOS的外部命令,把它所在的目錄放到DOS搜索路徑(path)中,即可在任意位置運行。

5.C:\AUTOEXEC.BAT 是每次系統啟動時都會自動運行的,可以將每次啟動時都要運行的命令放入該文件中。

6.大小寫不敏感(命令符忽略大小寫)

7.批處理的文件擴展名為 .bat 或 .cmd。

8.在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe來運行該文件。

 

二、參數

1) 系統參數

%SystemRoot% === C:\WINDOWS (%windir% 同樣)

%ProgramFiles% === C:\Program Files

%USERPROFILE% === C:\Documents and Settings\Administrator (子目錄有“桌面”,“開始菜單”,“收藏夾”等)

%APPDATA% === C:\Documents and Settings\Administrator\Application Data

%TEMP% === C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp (%TEM% 同樣)

%APPDATA% === C:\Documents and Settings\Administrator\Application Data

%OS% === Windows_NT (系統)

%Path% === %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem (原本的設置)

%HOMEDRIVE% === C: (系統盤)

%HOMEPATH% === \Documents and Settings\Administrator

:: 枚舉當前的環境變量

setlocal enabledelayedexpansion

FOR /F "usebackq delims==" %%i IN (`set`) DO @echo %%i !%%i!

 

2) 傳遞參數給批處理文件

%[1-9]表示參數,參數是指在運行批處理文件時在文件名后加的以空格(或者Tab)分隔的字符串。

變量可以從%0到%9,%0表示批處理命令本身,其它參數字符串用 %1 到 %9 順序表示。

Sample:

call test2.bat "hello" "haha" (執行同目錄下的“test2.bat”文件,並輸入兩個參數)

在“test2.bat”文件里寫:

echo %1 (打印: "hello")

echo %2 (打印: "haha")

echo %0 (打印: test2.bat)

echo %19 (打印: "hello"9)

 

三、批處理基本命令

0. help 命令

/? 命令

語法: 命令 /?

可顯示此命令的幫助信息

Sample: type /? >>tmp.txt (把 type 命令的幫助信息寫入到tmp.txt文件里)

Sample: help type (顯示跟“type /?”一樣)

 

1.Echo 命令

語法: echo [{on|off}] [message]

ECHO [ON | OFF] 打開回顯或關閉回顯功能。

ECHO 顯示當前回顯設置。

ECHO [message] 顯示信息。

echo off 表示在此語句后所有運行的命令都不顯示命令行本身;默認是on,on時會顯示如: C:\文件夾路徑>命令行。

在實際應用中我們會把這條命令和重定向符號( 也稱為管道符號,一般用 > >> ^ )結合來實現輸入一些命令到特定格式的文件中。

Sample: echo off

Sample: echo hello world (顯示出“hello world”)

Sample: echo Windows Registry Editor Version 5.00 > c:\setupreg.reg (此前還沒有 setupreg.reg 這個文件)

Sample: echo "SourcePath"="D:\\Win2003\\" >> c:\setupreg.reg (追加內容進 setupreg.reg 這個文件)

 

2.@ 命令

表示不顯示@后面的命令,(在入侵過程中自然不能讓對方看到你使用的命令啦)

@ 與 echo off 相象,但它是加在每個命令行的最前面,表示運行時不顯示這一行的命令行(只能影響當前行)。

Sample: @echo off (此語句常用於開頭,表示不顯示所有的命令行信息,包括此句)

Sample: @echo please wait a minite...

Sample: @format X: /q/u/autoset

(format 這個命令是不可以使用/y這個參數的,可喜的是微軟留了個autoset這個參數給我們,效果和/y是一樣的。)

 

3.Goto 命令

語法:goto label (label是參數,指定所要轉向的批處理程序中的行。)

指定跳轉到標簽行,找到標簽行后,程序將處理從下一行開始的命令。

label標簽的名字可以隨便起,但是最好是有意義的,字母前必須加個冒號“:”來表示這個字母是標簽。

goto命令就是根據這個冒號來尋找下一步跳到到那里。經常與 if 配合使用,根據不同的條件來執行不同的命令組。

例題見“5.Pause 命令”

 

4.Rem 命令

語法:Rem Message...

(小技巧:用::代替rem)

注釋命令,在C語言中相當與/*...*/,它並不會被執行,只是起一個注釋的作用,便於別人閱讀和自己日后修改。

Sample:@Rem Here is the description.

 

5.Pause 命令

會暫停批處理的執行並在屏幕上顯示Press any key to continue...的提示,等待用戶按任意鍵后繼續

Sample:

@echo off

:begin

copy a:*.* d:\back

echo Please put a new disk into driver A

pause

goto begin

在這個例子中,驅動器 A 中磁盤上的所有文件均復制到d:\back中。

顯示的信息提示您將另一張磁盤放入驅動器 A 時,pause 命令會使程序掛起,以便您更換磁盤,然后按任意鍵再次復制。

 

6.Call 命令

語法: call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]

參數: [Drive:][Path] FileName 指定要調用的批處理程序的位置和名稱。filename 參數必須具有 .bat 或 .cmd 擴展名。

調用另一個批處理程序,並且不終止父批處理程序。

如果不用call而直接調用別的批處理文件,那么執行完那個批處理文件后將無法返回當前文件並執行當前文件的后續命令。

call 命令接受用作調用目標的標簽。如果在腳本或批處理文件外使用 Call,它將不會在命令行起作用。

Sample:call="%cd%\test2.bat" haha kkk aaa (調用指定目錄下的 test2.bat,且輸入3個參數給他)

Sample:call test2.bat arg1 arg2 (調用同目錄下的 test2.bat,且輸入2個參數給他)

注:可以調用自身(死循環、遞歸)

7.start 命令

調用外部程序,所有的 DOS命令 和 命令行程序 都可以由 start命令 來調用。

入侵常用參數:

MIN 開始時窗口最小化

SEPARATE 在分開的空間內開始 16 位 Windows 程序

HIGH 在 HIGH 優先級類別開始應用程序

REALTIME 在 REALTIME 優先級類別開始應用程序

WAIT 啟動應用程序並等候它結束

parameters 這些為傳送到命令/程序的參數

Sample:start /MIN test2.bat arg1 arg2 (調用同目錄下的 test2.bat,且輸入2個參數給他,且本窗口最小化)

Sample:e:\"program files"\極品列車時刻表\jpskb.exe (文件路徑名有空格時)

8.If 命令

if 表示將判斷是否符合規定的條件,從而決定執行不同的命令。有三種格式:

1) IF

語法: if [not] "參數" == "字符串" 待執行的命令

參數如果等於(not表示不等,下同)指定的字符串,則條件成立,運行命令,否則運行下一句。(注意是兩個等號)

Sample: if "%1" == "a" format a:

Sample: if {%1} == {} goto noparms

2) if exist

語法: if [not] exist [路徑\]文件名 待執行的命令

如果有指定的文件,則條件成立,運行命令,否則運行下一句。

Sample: if exist config.sys edit config.sys (表示如果存在這文件,則編輯它,用很難看的系統編輯器)

Sample: if exist config.sys type config.sys (表示如果存在這文件,則顯示它的內容)

3) if errorlevel number

語法: if [not] errorlevel <數字> 待執行的命令

如果程序返回值等於指定的數字,則條件成立,運行命令,否則運行下一句。(返回值必須按照從大到小的順序排列)

Sample:

@echo off

XCOPY F:\test.bat D:\

IF ERRORLEVEL 1 (ECHO 文件拷貝失敗

) Else IF ERRORLEVEL 0 ECHO 成功拷貝文件

pause

很多DOS程序在運行結束后會返回一個數字值用來表示程序運行的結果(或者狀態),稱為錯誤碼errorlevel或稱返回碼。

常見的返回碼為0、1。通過if errorlevel命令可以判斷程序的返回值,根據不同的返回值來決定執行不同的命令。

4) else

語法: if 條件 (成立時執行的命令) else (不成立時執行的命令)

如果是多個條件,建議適當使用括號把各條件包起來,以免出錯。

Sample: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) else (echo comment3 )

注:如果 else 的語句需要換行,if 執行的行尾需用“^”連接,並且 if 執行的動作需用(括起來),否則報錯

Sample: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) ^

else (echo comment3 )

5) 比較運算符:

EQU - 等於 (一般使用“==”)

NEQ - 不等於 (沒有 “!=”,改用“ if not 1==1 ”的寫法)

LSS - 小於

LEQ - 小於或等於

GTR - 大於

GEQ - 大於或等於

 

9.choice 命令

choice 使用此命令可以讓用戶輸入一個字符(用於選擇),從而根據用戶的選擇返回不同的 errorlevel,

然后配合 if errorlevel 選擇運行不同的命令。

注意:choice命令為DOS或者Windows系統提供的外部命令,不同版本的choice命令語法會稍有不同,請用choice /?查看用法。

choice 使用此命令可以讓用戶輸入一個字符,從而運行不同的命令。

使用時應該加/c:參數,c:后應寫提示可輸入的字符,之間無空格。它的返回碼為1234……

Sample: choice /c:dme defrag,mem,end

將顯示: defrag,mem,end[D,M,E]?

Sample:

choice /c:dme defrag,mem,end

if errorlevel 3 goto defrag (應先判斷數值最高的錯誤碼)

if errorlevel 2 goto mem

if errotlevel 1 goto end

10.for 命令

for 命令是一個比較復雜的命令,主要用於參數在指定的范圍內循環執行命令。

1) for {%variable | %%variable} in (set) do command [command-parameters]

%variable 指定一個單一字母可替換的參數。變量名稱是區分大小寫的,所以 %i 不同於 %I

在批處理文件中使用 FOR 命令時,指定變量建議用 %%variable而不要用 %variable。

(set) 指定一個或一組文件。可以使用通配符。

command 指定對每個文件執行的命令。

command-parameters 為特定命令指定參數或命令行開關。

2) 如果命令擴展名被啟用,下列額外的 FOR 命令格式會受到支持:

a.FOR /D %variable IN (set) DO command [command-parameters]

如果集里面包含通配符,則指定與目錄名匹配,而不與文件名匹配。

b.FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的FOR 語句。

如果在 /R 后沒有指定目錄,則使用當前目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹。

c.FOR /L %variable IN (start,step,end) DO command [command-parameters]

該集表示以增量形式從開始到結束的一個數字序列。

如:(1,1,5) 將產生序列 1 2 3 4 5; 而(5,-1,1) 將產生序列 (5 4 3 2 1)。

d.有或者沒有 usebackq 選項:

FOR /F ["options"] %variable IN (file-set) DO command

FOR /F ["options"] %variable IN ("string") DO command

FOR /F ["options"] %variable IN (command) DO command

參數"options"為:

eol=c - 指一個行注釋字符的結尾(就一個,如“;”)

skip=n - 指在文件開始時忽略的行數。

delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。

tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代的 for 本身。這會導致額外變量名稱的分配。

m-n格式為一個范圍。通過 nth 符號指定 mth。

如果符號字符串中的最后一個字符星號,那么額外的變量將在最后一個符號解析之后分配並接受行的保留文本。

usebackq - 指定新語法已在下類情況中使用:

在作為命令執行一個后引號的字符串並且一個單引號字符為文字字符串命令並允許在 filenameset中使用雙引號擴起文件名稱。

3) Sample:

1. 如下命令行會顯示當前目錄下所有以bat或者txt為擴展名的文件名。

for %%c in (*.bat *.txt) do (echo %%c)

a. 如下命令行會顯示當前目錄下所有包含有 e 或者 i 的目錄名。

for /D %%a in (*e* *i*) do echo %%a

b. 如下命令行會顯示 E盤test目錄 下所有以bat或者txt為擴展名的文件名。

for /R E:\test %%b in (*.txt *.bat) do echo %%b

for /r %%c in (*) do (echo %%c) :: 遍歷當前目錄下所有文件

c. 如下命令行將產生序列 1 2 3 4 5

for /L %%c in (1,1,5) do echo %%c

d. 以下兩句,顯示當前的年月日和時間

For /f "tokens=1-3 delims=-/. " %%j In ('Date /T') do echo %%j年%%k月%%l日

For /f "tokens=1,2 delims=: " %%j In ('TIME /T') do echo %%j時%%k分

e. 把記事本中的內容每一行前面去掉8個字符

setlocal enabledelayedexpansion

for /f %%i in (zhidian.txt) do (

set atmp=%%i

set atmp=!atmp:~8!

if {!atmp!}=={} ( echo.) else echo !atmp!

)

:: 讀取記事本里的內容(使用 delims 是為了把一行顯示全,否則會以空格為分隔符)

for /f "delims=" %%a in (zhidian.txt) do echo.%%a

4) continue 和 break

利用 goto 實現程序中常用的 continue 和 break 命令, 其實非常簡單

continue: 在 for 循環的最后一行寫上一個標簽,跳轉到這位置即可

break: 在 for 循環的外面的下一句寫上一個標簽,跳轉到這位置即可

Sample: (偽代碼)

for /F ["options"] %variable IN (command) DO (

... do command ...

if ... goto continue

if ... goto break

... do command ...

:continue

)

:break

 

四、其它命令

1. ping 命令

測試網絡聯接狀況以及信息包發送和接收狀況。但是不能夠測試端口。

語法:ping IP地址或主機名 [-t] [-a] [-n count] [-l size]

參數含義:

-t 不停地向目標主機發送數據;

-a 以IP地址格式來顯示目標主機的網絡地址;

-n count 指定要Ping多少次,具體次數由count來指定;

-l size 指定發送到目標主機的數據包的大小。

Sample: ping 192.168.0.1 -t (不停的測試192.168.0.1,按ctrl+c停止)

Sample: for /L %%a in (0,1,255) do ping 192.168.0.%%a -n 1 >> tmp.txt (ping一下所有的局域網電腦)

2. telnet 命令

測試端口使用 telnet IP地址或主機名 端口,使用tcp協議的

Sample: telnet 192.168.0.1 80 (測試192.168.0.1的80端口)

3.color 命令

設置背景及字體顏色

語法: color bf

b 是指定背景色的十六進制數字; f 指定前景顏色(即字體顏色)。

顏色值: 0:黑色 1:藍色 2:綠色 3:湖藍 4:紅色 5:紫色 6:** 7:白色

8:灰色 9:淡藍 A:淡綠 B:淺綠 C:淡紅 D:淡紫 E:淡黃 F:亮白

如果沒有給定任何參數,該命令會將顏色還原到 CMD.EXE 啟動時的顏色。

如果兩參數一樣,視為無效輸入。只有一個參數時,設置字體。

4. random 命令

產生隨機數(正整數0~)

5. exit 命令

結束程序。即時是被調用的程序,結束后也不會返回原程序

6. shutdown命令

shutdown -s 關機

五、字符串處理

1) 分割字符串,以查看時間為例

%源字符串:~起始值,截取長度% (起始值從0開始;截取長度是可選的,如果省略逗號和截取長度,將會從起始值截取到結尾;

截取長度如果是負數,表示截取到倒數第幾個。)

"%time%" 顯示如:"11:04:23.03" (完整的時間"hh:mm:ss.tt")

"%time:~0,5%" 顯示"hh:mm"(即"11:04"),其中0表示從右向左移位操作的個數,5表示從左向右移位操作的個數

"%time:~0,8%" 顯示標准時間格式"hh:mm:ss"(即"11:04:23",前8個字符串)

"%time:~3,-3%"顯示"mm:ss"(即從第4個開始,截去最后3個的字符串)

"%time:~3%" 顯示"04:23.03"(即去掉前4個字符串)

"%time:~-3%" 顯示".tt"(即最后3個字符串)

上面的字串分割格式,也可以用於其它地方,如目錄路徑:"%cd:~0,10%"

2) 替換字符串

set a="abcd1234"

echo %a% 顯示:"abcd1234"

set a=%a:1=kk% 替換“1”為“kk”

echo %a% 顯示:"abcdkk234"

3) 字符串合並

由於沒有直接的字符串合並函數,只能用笨方法了。

set str1=%str1%%str2% (合並 str1 和 str2)

4) 計算字符串長度

沒有現成的函數。如下程序利用 goto形成循環,不斷將字符串截短1,並記錄截短的次數,到字符串變成空時的次數即長度。

set testStr=This is a test string

:: 將 testStr 復制到str,str 是個臨時字符串

set str=%testStr%

:: 標簽,用於goto跳轉

:next1

:: 判斷str是不是空,如果不是則執行下邊的語句

if not "%str%"=="" (

:: 算術運算,使num的值自增1,相當於num++或者++num語句

set /a num+=1

:: 截取字符串,每次截短1

set "str=%str:~1%"

:: 跳轉到next1標簽: 這里利用goto和標簽,構成循環結構

goto next1

)

:: 當以上循環結構執行完畢時,會執行下邊的語句

echo testStr=%testStr%

echo testStr的長度為:%num%

5) 截取字符串時,需要傳遞參數

直接 echo %args:~%num%,-5% 沒辦法想要的字符串,需要如下兩步

setlocal enabledelayedexpansion

echo !args:~%num%,-5!

 

六、注冊表操作

1) 備份注冊表,將[HKEY_LOCAL_MACHINE ... Run]的內容,備份到“c:\windows\1.reg”

reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run c:\windows\1.reg

reg export HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run c:\windows\2.reg

2) 修改/添加注冊表內容

a.一般的添加或修改

reg add "HKCU\Environment" /v Java_Home /t reg_sz /d "D:\Java\jdk1.6.0_07" /f

上句解析:“HKCU”是“HKEY_CURRENT_USER”的縮寫,不用縮寫用全稱也可以;

添加名稱為“Java_Home”的變量;類型為“reg_sz”,另一種常見類型是“reg_dword”;值為 D:\Java\jdk1.6.0_07;

b.使用變量

set SoftWareHome=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java

reg add "%SoftWareHome%Web Start\1.6.0_07" /v Home /t reg_sz /d "%cd%\jre1.6.0_07\bin" /f

c.如果注冊表的名稱有空格,或者數據用特殊符號時

reg add "%SoftWareHome2%\HelpCommands" /v "01:Online Documentation" /t reg_sz /d "\"%cd%\Documentation\Index.htm\"" /f

傳入值為(值用雙引號括起來的):"D:\ProgramFiles\1.work_soft\Sybase\PowerDesigner_12\Documentation\Index.htm"

reg add "%SoftWareHome2%\Paths" /v ReportTemplates /t reg_sz /d "%cd%\Resource Files\Report Templates\\" /f

傳入值為(“\”結尾的): E:\Holemar\1.notes\90. Windows\Resource Files\Report Templates\

d.增加空的內容

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg\IMJPMIG8.1"

e.添加或修改默認值

reg add "%vpath%InstallPath" /ve /t reg_sz /d "%cd%" /f

這里用“/ve”來代替一般修改時的“/v 變量名”,即可修改默認值了

3) 刪除注冊表的內容

雙引號里面的是注冊表的目錄,下面兩句將刪除這目錄下的所有信息

reg delete "HKEY_CURRENT_USER\Software\RealVNC" /f

reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC" /f

雙引號里面的是注冊表的目錄,下面一句將刪除這目錄下指定的某個信息

reg delete "HKEY_LOCAL_MACHINE\Software\RealVNC" /v VNC_Server /f

4) 注冊表的常用位置

a.系統啟動項:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]

example: REG ADD HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run /v VNC_Server /t REG_SZ /d "%cd%\VNC_Server.bat" /f

b.系統環境變量:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]

c.當前用戶的環境變量:

[HKEY_CURRENT_USER\Environment]

5) 修改注冊表之后,結束並重新加載explorer.exe進程,可刷新注冊表,令其生效

taskkill /f /im explorer.exe >nul

start "" "explorer.exe"

 

七、系統服務

1) 停止服務:NET STOP 服務名

啟動服務:NET Start 服務名

2) 設置啟動類型

自動: SC CONFIG 服務名 START= auto

手動: SC CONFIG 服務名 START= demand

已禁用:SC CONFIG 服務名 START= disabled

附:“START= ”等號后面必須要有一個空格。(start還有boot,system兩個值)

Sample: SC CONFIG Spooler START= demand (打印機加載項,設置成手動,默認自動)

3) 查看系統服務:start %SystemRoot%\system32\services.msc /s

 

八、setlocal與變量延遲

0) 在沒有開啟變量延遲的情況下,某條命令行中的變量改變,必須到下一條命令才能體現。

另外例如for命令等,其后用一對圓括號閉合的所有語句也當作一行。

example:

set a=4

set a=5 & echo %a%

結果:4

也可以對這種機制加以利用,如下的變量交換

example:

set var1=abc

set var2=123

echo 交換前: var1=%var1% var2=%var2%

set var1=%var2%& set var2=%var1%

echo 交換后: var1=%var1% var2=%var2%

1) 啟動批處理文件中環境變量的本地化。本地化將持續到出現匹配的 endlocal 命令或者到達批處理文件結尾為止。

語法: setlocal {enableextension | disableextensions} {enabledelayedexpansion | disabledelayedexpansion}

enableextension: 啟用命令擴展,直到出現匹配的 endlocal 命令,無論 setlocal 命令之前的設置如何。

disableextensions: 禁用命令擴展,直到出現匹配的 endlocal 命令,無論 setlocal 命令之前的設置如何。

enabledelayedexpansion: 啟用延遲的環境變量擴展,直到出現匹配的 endlocal 命令,無論 setlocal 命令之前的設置如何。

disabledelayedexpansion: 禁用延遲的環境變量擴展,直到出現匹配的 endlocal 命令,無論 setlocal 命令之前的設置如何。

 

2) 為了能夠感知環境變量的動態變化,批處理設計了變量延遲。簡單來說,在讀取了一條完整的語句之后,不立即對該行的變量賦值,而會在某個單條語句執行之前再進行賦值,也就是說“延遲”了對變量的賦值。

examle:

setlocal enabledelayedexpansion

set a=4

set a=5 & echo !a!

結果: 5

變量延遲的啟動語句是“setlocal enabledelayedexpansion”,並且變量要用一對嘆號“!!”括起來

由於啟動了變量延遲,所以批處理能夠感知到動態變化,即不是先給該行變量賦值,而是在運行過程中給變量賦值,因此此時a的值就是5了

另外,啟動變量延遲,“%”的變量還是不變

example2:

setlocal enabledelayedexpansion

for /l %%i in (1,1,5) do (

set a=%%i

echo !a!

)

結果,打印從1到5;如果不變量延遲,一個變量也沒有打印

 

九、文件處理

1.刪除

1) 刪除一個文件或多個文件

del /s /q /f d:\test\a.bat

將直接刪除d:\test\a.bat,沒有任務提示

del temp\* /q /f /s

將直接刪除 本目錄的 temp 目錄的所有文件,沒有任務提示

刪除文件的時候可以使用“*”作通配符

2) 刪除一個空目錄

rd /q /s d:\test\log

將直接刪除d:\test\log目錄,如果log目錄里面有文件將無法刪除

3) 刪除一個非空目錄 (必須指定目錄名稱)

rmdir /q /s d:\test\logs

必須指定目錄名稱,不能使用通配符

/S 除目錄本身外,還將刪除指定目錄下的所有子目錄

/Q 安靜模式,帶 /S 刪除目錄樹時不要求確認

無論里面是否有文件或文件夾將全部直接刪除

2.創建目錄

MKDIR [drive:]path

MD [drive:]path

路徑有空格時,可以用雙引號括起來,也可以用 &nbsp; 替代

實踐部分:

======================================================================

 

小摘錄:

1. 調用其他程序時,對文件的大小寫不敏感,文件后綴也可忽略

如:start LeapFTP.exe 與 start leapftp 效果一樣,都是運行“LeapFTP.exe”文件

每行的開頭的字符串會自動查找程序來運行,還可用雙引號引起來(文件名或目錄名含空格時必須用)

如:"D:\Program Files\Leap FTP.exe"

"LeapFTP.exe" 可正常運行文件,start "" "LeapFTP.exe" 也可以正常運行文件(注意,第一個參數是窗口顯示的標題)

3. copy C:\test\*.* D:\back (復制C盤test文件夾的所有文件(不包括文件夾及子文件夾里的東西)到D盤的back文件夾)

4. dir c:\*.* > a.txt (將c盤文件列表寫入 a.txt 中)

5. > 生成文件並寫入內容(如果有這文件則覆蓋), >> 文件里追加內容

6. md d:\aa (創建文件夾)

7. 在命令末尾加上“>NUL 2>NUL”,表示隱蔽返回信息。

8. 等待用戶輸入: set /p 變量名=屏幕顯示信息。 Sample:set /p pass=請輸入密碼:

9. 讓用戶按回車退出

小技巧(替代pause),文件的最后一句:set /p tmp=操作結束,請按回車鍵退出...

10.設置標題: title JDK安裝

11.設置屏幕顯示顏色,如綠色: color 0a

12.清屏: cls

13.查看自己的IP:

for /f "tokens=15" %%i in ('ipconfig ^| find /i "ip address"') do set ip=%%i

echo %ip% (這時的 %ip% 就是自己的IP地址)

 

14. 修改文件的更新日期

copy 文件名+,,>nul (修改為當前時間,如果要修改為指定時間,先修改系統時間,再改回系統時間)

15. 修改文件的后綴名

ren C:\test\*.jpg *.JPG

for /r %%c in (*.jpg) do (ren %%c *.JPG) :: 修改當前目錄下的所有文件的后綴名,包括子目錄的

16. 修改文件的文件名

rename test.jpg test2.JPG

rename *.jpg *.888.JPG

17. 查看DNS、IP、Mac等

1) Win98: winipcfg

2) Win2000以上: Ipconfig /all

3) NSLOOKUP

18.查看IP上的共享資源,就可以

net view 192.168.10.8

19.共享

A.查看你機器的共享資源: net share

B.手工刪除共享

net share 共享資源名稱$ /d

注意$后有空格。

C.增加一個共享:

net share mymovie=e:\downloads\movie /users:3

mymovie 共享成功。 同時限制鏈接用戶數為3人。

20.打開某網站

start iexplore.exe http://www.baidu.com

 

實例

1. 生成 reg 文件,運行它,再刪除它

echo "更改windows安裝文件的路徑"

echo Windows Registry Editor Version 5.00 > c:\setupreg.reg

echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup] >> c:\setupreg.reg

echo "ServicePackSourcePath"="D:\\Win2003\\" >> c:\setupreg.reg

echo "SourcePath"="D:\\Win2003\\" >> c:\setupreg.reg

:: 寫入注冊表

regedit /S c:\setupreg.reg

:: 刪除注冊表文件

del c:\setupreg.reg

 

2.調用了exe文件,結束后沒有關閉,解決方法

用start命令運行文件,如:

start LeapFTP.exe 192.168.0.100

 

3.設置系統環境變量

:: 有這個環境變量,則不需再設置,直接結束

if not "%JAVA_HOME%" == "" exit

:: 設置環境變量的地址

set inputJavaHome=%cd%\jdk1.6.0_07

:: 設置環境變量,也可以設置當前用戶的變量

set EnvironmentHome=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

echo 正在設置環境變量,請稍候......

reg add "%EnvironmentHome%" /v JAVA_HOME /t reg_sz /d "%inputJavaHome%" /f

reg add "%EnvironmentHome%" /v ClassPath /t reg_sz /d ".;%%JAVA_HOME%%\lib" /f

reg add "%EnvironmentHome%" /v Path /t reg_sz /d "%%JAVA_HOME%%\bin;%Path%" /f]

:: 刷新,令環境變量生效

taskkill /f /im explorer.exe >nul

start "" "explorer.exe"

 

4.隱藏某目錄的所有文件及文件夾

cd /d 要隱藏的目錄(如:D:)

for /f "usebackq delims=" %%A in (`dir /a /b`) do (attrib "%%A" -r +h -s)

 

5.在批處理中使用密碼。密碼為admin,輸入正確,跳轉到next1 ,若輸入密碼錯誤3次,則鎖屏。。

@echo off

set num=0

:11

set /p pass=請輸入密碼:

if "%pass%"=="admin" goto next1

set /a num=%num% + 1

if %num%==3 goto no1

goto 11

:no1

%windir%\system32\rundll32.exe user32.dll,LockWorkStation

goto 11

:next1

echo 密碼正確,執行下面的程式

pause

 

6.清空回收站(未成功)

@echo off

del /f /s /q c:\recycler\*.*

::刷新屏幕

taskkill /f /im explorer.exe >nul

start "" "explorer.exe"

 

7.讓系統斷斷續續地鳴叫

@echo off

:begin

:: 發出鳴叫(“”實際就是ASCII碼值為7的特殊字符(蜂鳴鍵beep)

echo

:: 讓程序暫停一小陣子

ping -n 1 -l 1 127.1>nul

goto :begin

8.將 FAT 卷轉換成 NTFS

利用“CONVERT.exe”進行,解析如下:

CONVERT volume /FS:NTFS [/V] [/CvtArea:filename] [/NoSecurity] [/X]

volume 指定驅動器號(后面跟一個冒號)、裝載點或卷名。

/FS:NTFS 指定要被轉換成 NTFS 的卷。

/V 指定 Convert 應該用詳述模式運行。

/CvtArea:filename

將根目錄中的一個接續文件指定為NTFS 系統文件的占位符。

/NoSecurity 指定每個人都可以訪問轉換的文件和目錄的安全設置。

/X 如果必要,先強行卸載卷。該卷的所有打開的句柄則無效。

 

程序如下:

@ ECHO OFF

@ ECHO.

@ ECHO. 說 明

@ ECHO --------------------------------------------------------------------------

@ ECHO NTFS是一種磁盤格式。該格式能存放大於4G的單個文件(如高清電影文件),並可對

@ ECHO 文件夾進行加密,但有個缺點是DOS下無法訪問。建議D盤及其后的盤使用NTFS格式,

@ ECHO C盤如非必要可以不轉換,FAT32與NTFS這兩種格式的讀寫速度幾乎是沒有差別的。

@ ECHO --------------------------------------------------------------------------

@ ECHO.

convert c: /fs:ntfs

:: D盤也轉成 NTFS

convert d: /fs:ntfs

 

9. 獲取我的文檔

SET SF="HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"

FOR /F "tokens=2,*" %%I IN ('REG QUERY %SF% /v Personal 2^>NUL^|FIND /I "Personal"') DO SET "myDoc=%%~J"

:: 復制文件到我的文檔

XCOPY /D /E /R /Y /C "%cd%\test.txt" "%myDoc%\test\"

10 獲取當前目錄路徑

cd ./

set CURR_PATH=%cd%

==========================================

實例:

3.IF-ERRORLEVEL

@ECHO OFF

XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷貝失敗

IF ERRORLEVEL 0 ECHO 成功拷貝文件

 

如果文件拷貝成功,屏幕就會顯示“成功拷貝文件”,否則就會顯示“文件拷貝失敗”。

IF ERRORLEVEL 是用來測試它的上一個DOS命令的返回值的,注意只是上一個命令的返回值,而且返回值必須依照從大到小次序順序判斷。因此下面的批處理文件是錯誤的:

@ECHO OFF

XCOPY C:\AUTOEXEC.BAT D:\

CHO 成功拷貝文件

IF ERRORLEVEL 1 ECHO 未找到拷貝文件

IF ERRORLEVEL 2 ECHO 用戶通過ctrl-c中止拷貝操作

IF ERRORLEVEL 3 ECHO 預置錯誤阻止文件拷貝操作

IF ERRORLEVEL 4 ECHO 拷貝過程中寫盤錯誤

無論拷貝是否成功,后面的:

未找到拷貝文件

用戶通過ctrl-c中止拷貝操作

預置錯誤阻止文件拷貝操作

拷貝過程中寫盤錯誤

都將顯示出來。

以下就是幾個常用命令的返回值及其代表的意義:

backup

0 備份成功

1 未找到備份文件

2 文件共享沖突阻止備份完成

3 用戶用ctrl-c中止備份

4 由於致命的錯誤使備份操作中止

diskcomp

0 盤比較相同

1 盤比較不同

2 用戶通過ctrl-c中止比較操作

3 由於致命的錯誤使比較操作中止

4 預置錯誤中止比較

diskcopy

0 盤拷貝操作成功

1 非致命盤讀/寫錯

2 用戶通過ctrl-c結束拷貝操作

3 因致命的處理錯誤使盤拷貝中止

4 預置錯誤阻止拷貝操作

format

0 格式化成功

3 用戶通過ctrl-c中止格式化處理

4 因致命的處理錯誤使格式化中止

5 在提示“proceed with format(y/n)?”下用戶鍵入n結束

xcopy

0 成功拷貝文件

1 未找到拷貝文件

2 用戶通過ctrl-c中止拷貝操作

4 預置錯誤阻止文件拷貝操作

5 拷貝過程中寫盤錯誤

 

=============================================================

@echo off //不顯示shell的命令。

Setlocal //環境改變只適用於這個文件。

%OS% //為當前的操作系統。

Rem //注釋一行文本。

Goto 標簽 //改變執行順序,去標簽位置.

:標簽 //定義一個標簽。

Set 變量名=值 //定義變量

Not //取反

Netstat –na //顯示當前被點用的端口.

%0 %1 %2 //用於表示批處理文件的參數0為命令,共1-9個參數。

Shift //用於向前一個參數,原1變0,原2變1.每調用一次shift向前一移動一位。

Call //調用其他批處理文件或命令。

Start 命令 參數 //指示出在另一個窗口中開始運行命令。

=============================================================

:: 這段批處理程序可以自動設置Java環境變量

 

@echo off

IF EXIST %1\bin\java.exe (

rem 如輸入正確的 Java2SDK 安裝目錄,開始設置環境變量

@setx JAVA_HOME %1

@setx path %path%;%JAVA_HOME%\bin

@setx classpath %classpath%;.

@setx classpath %classpath%;%JAVA_HOME%\lib\tools.jar

@setx classpath %classpath%;%JAVA_HOME%\lib\dt.jar

@setx classpath %classpath%;%JAVA_HOME%\jre\lib\rt.jar

@echo on

@echo Java 2 SDK 環境參數設置完畢,正常退出。

) ELSE (

IF "%1"=="" (

rem 如沒有提供安裝目錄,提示之后退出

@echo on

@echo 沒有提供 Java2SDK 的安裝目錄,不做任何設置,現在退出環境變量設置。

) ELSE (

rem 如果提供非空的安裝目錄但沒有bin\java.exe,則指定的目錄為錯誤的目錄

@echo on

@echo 非法的 Java2SDK 的安裝目錄,不做任何設置,現在退出環境變量設置。

)

)

 

可能遇到問題

中文亂碼

把bat文件的編碼改為ANSI,UTF-8在win10我這兒會中文顯示亂碼。

說明

本文部分內容轉載自:http://m18333611647.blog.163.com/blog/static/225533041201422111365439/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM