bat批量處理腳本 筆記整理


 

一、為什么要學習?

1、寫作背景

  在windows條下有時候需要批量執行一些內容,比如開機后常用軟件的批量打開等,使用bat能夠方便快捷的解決類似問題。所以,今天下決心來了解下bat腳本語法及邏輯,希望能用到更多的場景中去,目的是:能用工具解決的,盡量不用人工處理。  

簡單的說,批處理的作用就是自動的連續執行多條命令。

2、這里先講一個最簡單的應用:在啟動wps軟件時,每次都必須執行(>前面內容表示DOS提示符):

C:\>cd wps
C:\WPS>spdos
C:\WPS>py
C:\WPS>wbx
C:\WPS>wps
如果每次用WPS之前都這樣執行一遍,您是不是覺得很麻煩呢?
好了,用批處理,就可以實現將這些麻煩的操作簡單化,首先我們編寫一個runwps.bat批處理文件,內容如下:
@echo off
c:
cd\wps
spdos
py
wbx
wps
cd\
以后,我們每次進入wps,只需要運行runwps這個批處理文件即可。

 

二、bat簡介 

  bat (批處理文件類型):批處理文件,在DOS和Windows(任意)系統中使用,.bat文件是可執行文件,由一系列命令構成,其中可以包含對其他程序的調用。

  這個文件的每一行都是一條DOS命令(大部分時候就好像我們在DOS提示符下執行的命令行一樣),你可以使用DOS下的Edit或者Windows的記事本(notepad)等任何文本文件編輯工具創建和修改批處理文件。

  批處理(Batch),也稱為批處理腳本。顧名思義,批處理就是對某對象進行批量的處理,通常被認為是一種簡化的腳本語言,它應用於DOS和Windows系統中。批處理文件的擴展名為bat 或cmd。目前比較常見的批處理包含兩類:DOS批處理和PS批處理。PS批處理是基於強大的圖片編輯軟件Photoshop的,用來批量處理圖片的腳本;而DOS批處理則是基於DOS命令的,用來自動地批量地執行DOS命令以實現特定操作的腳本。更復雜的情況,需要使用if、for、goto等命令控制程式的運行過程,如同C、Basic等高級語言一樣。如果需要實現更復雜的應用,利用外部程式是必要的,這包括系統本身提供的外部命令和第三方提供的工具或者軟件。批處理程序雖然是在命令行環境中運行,但不僅僅能使用命令行軟件,任何當前系統下可運行的程序都可以放在批處理文件中運行。

 

三、變量

1、變量的類型

  批處理中的變量基本上是萬能的,可以儲存各種各樣的數據,不過用來計算時你會發現變量類型轉為了int,數值的極端范圍為[-2147483648,2147483647],如果不拿來計算的話,似乎數萬位也是可以的

2、變量的命名

  批處理的變量命名沒有什么限制,不過建議命名還是遵守標准的命名方法,不然像這樣的代碼是很蛋疼的。
@Echo Off
Set IF=Set
%IF% lF=Goto
:IF
IF %IF%==IF %lF% IF
  正是因為變量的名稱是可以自由調配的:數字、字母、甚至漢字都可以變成變量名樣。

3、變量的擴展(使用變量)

  擴展,你可以理解為顯示出這個的值,如果你想要使用這個變量的值一般情況下都要擴展

  擴展方式:%變量%或!變量!

  其中!變量!是延遲擴展,需要加上SetLocal EnableDelayedExpansion語句才能夠實現,延遲擴展對於新手來說是一個很難理解的東西,就這么說吧,當你的變量在一個語句的內部受到了改變,而在這個改變之后又要輸出,那么你必須要延遲擴展,這個牽扯到了奇奇怪怪的預處理機制,不詳解了。

  用連接符號連起來的語句,if,for和它們后面括號內的內容都是屬於一個語句

例:

@echo off
set num=10
set num=100 & echo %num%
echo %num%
echo 雖然已經將num的值更改為100,但由於沒有延遲擴展,所以值仍為10,不過在下一個語句num的值就改變了
pause>nul
例:
@echo off
SetLocal EnableDelayedExpansion
set num=10
set num=100&echo !num!
echo 現在兩個num的值一樣了
echo %num%
pause>nul
變量在擴展過程中還可以做一點手腳
例:
set str=1234567890
echo %str:~0,5%
echo %str:~1,5%
echo %str:~-5%
  echo %str:~5,-2%
echo %str:7890=54321%
pause>nul
很神奇吧?這就是對字符串的處理,這個是批處理的特性,叫“變量延遲”

 

四、關於參數

參數在批處理的表達是%0,%1,%2....%9 ,以及全部參數%*(不包括%0)
%0的初始量是批處理本身路徑,類似%~f0
一般你只能取前九個參數,除非你使用%*
shift命令允許你獲取后面的參數
格式:shift [/n]
n為1~8的數

shift 會使%0變成%1,%1變成%2……%9變成原來的第10個參數(不推薦)
一般使用shift /1,將會從%1開始替換,保留原%0
注意:call標簽時參數也是可用的,而且當返回時參數將變回原來的
例子:
@echo off

call :標簽 arg1 arg2
echo %1
::會顯示回顯已打開
echo %2
exit
:標簽
echo %1
::這時會顯示arg1
echo %2
::這時會顯示arg2
exit /b

 

五、常用命令

1、ECHO,顯示及關閉回顯,輸出信息及空行。

@echo on :打開回顯,顯示執行腳本的命令內容。

@echo off :關閉回顯

echo message:輸出消息message

echo:后面不接內容,表示輸出空行。

2、PAUSE,暫停批處理程序,並顯示以下消息:請按任意鍵繼續. . .

此命令不再做描述,如標題所示。 

3、CLS清除屏幕。

此命令不再做描述,如標題所示。 

4、REM

在批處理文件或 CONFIG.SYS 里加上注解或說明。

REM [comment]
這個命令同樣沒什么好說的,用法就是rem 注釋
PS:其實可以用"::"代替"REM",可以提高執行速度,不過REM的兼容性更好,我還是建議大家用rem注釋

5、SET

  1)給變量賦值(撤銷)

例1:
@echo off
set str=My name is Xiao
rem 批處理腳本中用%或!來表示擴展
echo %str%
rem pause默認輸出信息為"請按任意鍵繼續",也可以自定義輸出,例如pause>nul
pause>nul

例2.
@echo off
set str=ABCDEFGHIJKLMN
echo %str%
set str=
rem 還記得加";",這里的分號";"必須跟echo不能有空格,作用是打開前面已經關閉的回顯,並且輸出變量;否則不輸出變量且輸出提示“ECHO 處於關閉狀態。”
echo;%str%
pause>nul

上面的例子中,一個是給變量賦值,一個是撤銷變量的值

  2)等待用戶輸入數據(開關/P)

例:  
@echo off
set /p name=請輸入你的姓名:
set /p age=請輸入你的年齡(純數字):
echo 所以,%name%今年%age%歲咯?
pause>nul

  3)計算(開關/A)

set /a支持多行表達式並列,比如set /a num1=1+1,num2=1+2,num3=1+3
並且set /a不需要擴展變量,比如set /a num=%num2%+%num3%與set /a num=num2+num3等價

例1:
@echo off
set /a num=(12*2)+(13*4)
echo (12x2)+(13x4)=%num%
pause>nul
例2:
@echo off
set /p num=請輸入一個數字(不要超過2147483647):
REM 批處理能處理的數字不能超過32位(二進制)
set /a num*=2
echo 這個數字的兩倍是%num%
pause>nul
附:Set /a num*=2與set /a num=num*2等價


() - 分組
! ~ - - 一元運算符
* / % - 算數運算符
+ - - 算數運算符
<< >> - 邏輯移位
- 按位“與”
^ - 按位“異”
| - 按位“或”
= *= /= %= += -= - 賦值
&= ^= |= <<= >>=
, - 表達式分隔符

  4)顯示當前已定義變量

例:
@set
@pause>nul
是不是很簡單?其實它還有更高級的用法呢

@set a
@pause>nul
@set s
@pause>nul
你們發現什么了嗎??它的用法就是這些,不用多說了

6、IF

  1)IF的第一種用法,比較字符串

例:
set /p PW=請輸入密碼:
if %PW%==bat (
echo YES! 
) ELSE (
Rem [else] 為可選參數,表示否則,即如果變量PW等於bat則輸出YES!否則輸出NO! 
echo NO! 
)
pause>nul
通過set /p和if可以實現一個簡單的密碼判斷,當然這個密碼判斷可以很輕易地被破解,仔細動腦筋想一想,該怎么破解呢.
不過這個密碼判斷尚有不足之處,假如我們什么都不輸入直接回車,便會提示錯誤,那該怎么辦呢?很簡單,只要加上雙引號(其它的符號也行)就行了=>if "%PW%"=="bat"

  2)IF的第二種用法,比較數字

例:
set /p num1=請第一個輸入數字:
set /p num2=請第二個輸入數字:
if not %num1% LSS %num2% (
rem lss表示小於  
rem [not]為可選參數,表示非,即如果變量num1不小於變量num2就輸出第一個數字大,否則輸出第二個數字大
echo 第一個數字大
) ELSE (
echo 第二個數字大  
)
pause>nul


這段代碼可以實現一個簡單的判斷,不過尚有不足之處-----如果這兩個數字相等呢,這就要請出我們的else if啦(當然你也可以用幾個if來判斷)
set /p num1=請第一個輸入數字:
set /p num2=請第二個輸入數字:
if "%num1%" gtr "%num2%" (
echo 第一個數字大
) ELSE if "%num1%" EQU "%num2%" (
echo 一樣大  
) ELSE (
echo 第二個數字大 
)
pause>nul


------比較運算符-----
EQU - 等於
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於

  3)IF的第三種用法,檢測文件(夾)是否存在

例:
@echo off
if exist C:\windows (
echo 你的C盤有windows文件(夾^)
  
) else (
echo 你的C盤沒有windows文件(夾^)
  
)
pause>nul
"^"為轉義符號,在特殊符號一節再作講解

 4)IF的第四種用法,檢測變量是否被定義

例:
@echo off
set var=aiwozhonghua
if defined var (
echo 變量var已被定義,它的值為%var%  
) else (
echo 變量var沒有被定義  
)
pause>nul
去掉第一行的set看看執行結果有什么不同,你明白它的用法了嗎?

  5)IF的第五種用法,判斷返回值(ERRORLEVEL)

要判斷返回值,首先要理解返回值是個什么概念,批處理中的返回值一般表示了上個命令的執行結果(成功/失敗/等)
每個命令執行完畢后返回值都會做相應的更改,一般返回值為0表示成功,1表示失敗,有一些第三方的返回值比較特殊(如Choice.exe,Tmos.exe,Cmos.exe),在這里就不講解了
例:
@echo off
echo;>>%systemroot%\test.txt
if errorlevel 0 ( echo 寫入成功! ) else echo 寫入失敗
pause>nul
這段代碼嘗試向%systemroot%\system32\寫入數據,如果權限不夠或殺毒軟件攔截就會寫入失敗,這時就會顯示"寫入失敗".不知道%systemroot%表示了什么?單獨鍵入set自己仔細看一下結果.
  
不過看到后面你會發現這段代碼還有更簡便的寫法
注:用 if errorlevel判斷返回值時要將返回值從大到小排列
例:
@echo off
choice /C:ABC /n "A/B/C"
if errorlevel 3 echo You choose the C
if errorlevel 2 echo You choose the B
if errorlevel 1 echo You choose the A
pause>nul
GOTO
將 cmd.exe 導向到批處理程序中帶標簽的行。
GOTO label
label 指定批處理程序中用作標簽的文字字符串。

  

  6)goto及lable

標簽必須單獨一行,並且以冒號打頭。

如果命令擴展名被啟用,GOTO 會如下改變:
GOTO 命令現在接受目標標簽 :EOF,這個標簽將控制轉移到當前批腳本文件的結尾。不定義就退出批腳本文件,這是一個容易的辦法。有關能使該功能有用的 CALL 命令的擴展名描述,請鍵入CALL /?。label是什么?這可不是命令label,它指的是標簽,標簽是啥?見例子。

例:
@echo off
set /p pw=請輸入密碼:
if "%pw%"=="bathome" goto yes
goto :eof
rem 未定義的:eof會退出腳本文件
:yes
echo 密碼正確!
pause>nul

這是一個更加完整的密碼判斷,仔細閱讀並執行這行代碼,現在你知道標簽是什么了嗎,沒錯,那個:yes就是標簽了!

標簽的格式
:標簽名

關掉回顯以后你有沒有發現什么?沒錯,標簽所在的那一行沒有被執行,這就是為什么::比rem更快的原因了,但是標簽不能被使用在一個語句的內部,主要就是被括號括起來的語句(是的,被括號括起來的語句被看作一個整體),因此::的兼容性沒有rem那么好
附:"::"其實就是不規范的標簽名...

 

7、FOR

  1)FOR

對一組文件中的每一個文件執行某個特定命令。
FOR%variableIN (set) DO command [command-parameters]
%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件。可以使用通配符。
command 指定對每個文件執行的命令。
command-parameters
為特定命令指定參數或命令行開關。
例:

@echo off
E:
cd 工 作\003 腳本命令
for %%i in (*.sql) do echo %%i
pause>nul

這段代碼會顯示當前文件夾下所有的sql文件

@echo off
for %%i in (菜 芽 小 公 公) do echo %%i
pause>nul
  這段代碼會顯示





注:%%i為for輸出專用變量格式,其中i可以是a/A/0-z/Z/9和一些符號什么的(如! # 不過不建議使用),在cmd中只能用一個%

  2)FOR /L 

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)。
例:
@echo off
for /L %%a in (1 2 1000) do echo %%a
  pause>nul
輸出1到1000之間的整數,間隔為2.

 

  3)FOR /R

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的。
FOR 語句。如果在 /R 后沒有指定目錄,則使用當前目錄。

如果集僅為一個單點(.)字符,則枚舉該目錄樹。

例:

@echo off
for /r F:\Store\工作 %%i in (*) do echo %%i
pause>nul

枚舉顯示F:\Store\工作 目錄下的所有目錄及文件夾,包括子文件夾里的。

 

  4)FOR /D

FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,則指定與目錄名匹配,而不與文件名匹配。

  5、FOR /F 

for /f是一個非(喪)常(心)復(病)雜(狂)的命令...
讓我們從它的第一個用法來講:
FOR /F ["options"] %variable IN (file-set) DO command [command-parame
例:
@echo off
echo 1,1 2,1 3,1 4,1>>test.txt
echo A1,2 2,2 3,2 4,2>>test.txt
echo 1,3 2,3 3,3 4,3>>test.txt
echo A1,4 2,4 3,4 4,4>>test.txt
rem 以上代碼在當前文件夾下生成了一個test.txt,打開看看?
For /F %%i In (test.txt) Do Echo %%i
pause>nul
For /F "tokens=2" %%i In (test.txt) Do Echo %%i
pause>nul
For /F "tokens=3" %%i In (test.txt) Do Echo %%i
pause>nul
For /F "tokens=4" %%i In (test.txt) Do Echo %%i
pause>nul
我想執行完這個bat,再分析一下結果和代碼,聰明的你一定了解了tokens的用處

for /f 默認以空格為分隔符,將每一行分割為幾個元素,而tokens就表示取第幾個元素.但假如我們要取的不是一個元素呢?需要全部顯示出來怎么辦?
tokens=* 表示取所有元素,用%%i輸出
tokens=1,2,3,4或tokens=1-4 然后用%%i或%%i,%%j,%%k,%%l 輸出


其實我們還有其他的方法,比如請出delims參數
例:
@echo off
rem test.txt已經有了,就不生成了
for /f "delims=*" %%i in (test.txt) do echo %%i
pause>nul

delims是個啥玩意兒?其實這就是分割符的設定,默認以空格為分隔符,你可以將分隔符設置成其他的,你的文本就不會被分割了,delims同樣支持多個分隔符,格式delims=第一個分隔符,第二個分隔符,第三個分隔符。

啊哈,還有一個skipeol,skip表示忽略前幾行,比如skip=10表示忽略這個文本的前十行,我這個文本只有4行,如果你加上skip=10的話就什么都不會輸出了
eol表示忽略以某個符號開頭的行,比如eol=A,當某一行的開頭是A的時候,這一行就不會被處理,不過支持設置一個符號


for /f同也可以處理字符串
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
字符串需要用雙引號引起來,其余用法一樣,不過這里就要講到usebackq參數了,for /f是支持處理多個文件的,文件直接用空格隔開(某些符號也可以),假如文件名中含有空格怎么辦呢?那好像只能用雙引號引起來了,但是用雙引號引起來會被識別成字符串的,這時就要請出usebackq參數了,加上這個參數,帶引號的字符串也會被識別為文件~
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

用for /f來處理命令執行的結果,命令要用單引號引起來
例:
@echo off
for /f "skip=3" %%i in ('tasklist') do echo;%%i
pause>nul

這段代碼就處理了命令ipconfig的執行結果,單獨鍵入tasklist看會出現什么?
================================================
~I - 刪除任何引號("),擴充 %I
%~fI - 將 %I 擴充到一個完全合格的路徑名
%~dI - 僅將 %I 擴充到一個驅動器號
%~pI - 僅將 %I 擴充到一個路徑
%~nI - 僅將 %I 擴充到一個文件名
%~xI - 僅將 %I 擴充到一個文件擴展名
%~sI - 擴充的路徑只含有短名
%~aI - 將 %I 擴充到文件的文件屬性
%~tI - 將 %I 擴充到文件的日期/時間
%~zI - 將 %I 擴充到文件的大小
%~$PATH:I - 查找列在路徑環境變量的目錄,並將 %I 擴充
到找到的第一個完全合格的名稱。如果環境變量名
未被定義,或者沒有找到文件,此組合鍵會擴充到
空字符串
組合修飾符來得到多重結果:
%~dpI - 僅將 %I 擴充到一個驅動器號和路徑
%~nxI - 僅將 %I 擴充到一個文件名和擴展名
%~fsI - 僅將 %I 擴充到一個帶有短名的完整路徑名
%~dp$PATH:i - 查找列在路徑環境變量的目錄,並將 %I 擴充
到找到的第一個驅動器號和路徑。
%~ftzaI - 將 %I 擴充到類似輸出線路的 DIR
===================================================
這些不多說了,自己用for /r命令輸出的時候把%%i改成%%~nxi之類的試一試就理解了。

8、其他命令

批處理的常見命令(未列舉的命令還比較多,請查閱幫助信息)
1、REM 和 ::
2、ECHO 和 @
3、PAUSE
4、ERRORLEVEL
5、TITLE
6、COLOR
7、mode 配置系統設備
8、GOTO 和 :
9、FIND
10、START
11、assoc 和 ftype
12、pushd 和 popd
13、CALL
14、shift
15、IF
16、setlocal 與 變量延遲
17、ATTRIB 顯示或更改文件屬性 

 

六、批處理示例

1、IF-EXIST

1)

首先用記事本在C:\建立一個test1.bat批處理文件,文件內容如下:
@echo off
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist
然后運行它:
C:\>TEST1.BAT
如果C:\存在AUTOEXEC.BAT文件,那么它的內容就會被顯示出來,如果不存在,批處理就會提示你該文件不存在。

2)
接着再建立一個test2.bat文件,內容如下:
@ECHO OFF
IF EXIST \%1 TYPE \%1
IF NOT EXIST \%1 ECHO \%1 does not exist
執行:
C:\>TEST2 AUTOEXEC.BAT
該命令運行結果同上。
說明:
(1) IF EXIST 是用來測試文件是否存在的,格式為
IF EXIST [路徑+文件名] 命令
(2) test2.bat文件中的%1是參數,DOS允許傳遞9個批參數信息給批處理文件,分別為%1~%9(%0表示test2命令本身) ,這有點象編程中的實參和形參的關系,%1是形參,AUTOEXEC.BAT是實參。
3) 更進一步的,建立一個名為TEST3.BAT的文件,內容如下:
@echo off
IF "%1" == "A" ECHO XIAO
IF "%2" == "B" ECHO TIAN
IF "%3" == "C" ECHO XIN
如果運行:
C:\>TEST3 A B C
屏幕上會顯示:
XIAO
TIAN
XIN
如果運行:
C:\>TEST3 A B
屏幕上會顯示
XIAO
TIAN
在這個命令執行過程中,DOS會將一個空字符串指定給參數%3。

2、IF-ERRORLEVEL

建立TEST4.BAT,內容如下:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷貝失敗
IF ERRORLEVEL 0 ECHO 成功拷貝文件
然后執行文件:
C:\>TEST4
如果文件拷貝成功,屏幕就會顯示“成功拷貝文件”,否則就會顯示“文件拷貝失敗”。
IF ERRORLEVEL 是用來測試它的上一個DOS命令的返回值的,注意只是上一個命令的返回值,而且返回值必須依照從大到小次序順序判斷。因此下面的批處理文件是錯誤的:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 0 ECHO 成功拷貝文件
IF ERRORLEVEL 1 ECHO 未找到拷貝文件
IF ERRORLEVEL 2 ECHO 用戶通過ctrl-c中止拷貝操作
IF ERRORLEVEL 3 ECHO 預置錯誤阻止文件拷貝操作
IF ERRORLEVEL 4 ECHO 拷貝過程中寫盤錯誤
無論拷貝是否成功,后面的:
未找到拷貝文件
用戶通過ctrl-c中止拷貝操作
預置錯誤阻止文件拷貝操作
拷貝過程中寫盤錯誤
都將顯示出來。

 

七、命令返回值

1、backup

0 備份成功
1 未找到備份文件
2 文件共享沖突阻止備份完成
3 用戶用ctrl-c中止備份
4 由於致命的錯誤使備份操作中止

2、diskcomp

0 盤比較相同
1 盤比較不同
2 用戶通過ctrl-c中止比較操作
3 由於致命的錯誤使比較操作中止
4 預置錯誤中止比較

3、diskcopy

0 盤拷貝操作成功
1 非致命盤讀/寫錯
2 用戶通過ctrl-c結束拷貝操作
3 因致命的處理錯誤使盤拷貝中止
4 預置錯誤阻止拷貝操作

4、format

0 格式化成功
3 用戶通過ctrl-c中止格式化處理
4 因致命的處理錯誤使格式化中止
5 在提示“proceed with format(y/n)?”下用戶鍵入n結束

5、xcopy

0 成功拷貝文件
1 未找到拷貝文件
2 用戶通過ctrl-c中止拷貝操作
4 預置錯誤阻止文件拷貝操作
5 拷貝過程中寫盤錯誤

 

八、特殊符號

1、@-隱藏命令

開啟了echo off能夠起到隱藏命令的效果,而@同樣能起到這個效果,只不過需要在每條命令前面都加一個...

2、&&,||-判斷

還記得用if errorlevel來判斷命令成功與否嗎?&&和||同樣能起到這個效果,&&表示前面的命令成功以后執行后面的命令,||反之
例:
@echo;>>%SystemRoot%\system32\test.txt&&echo 成功!||echo 失敗
@pause>nul

3、|-管道

將前一個命令執行的結果發送給后一個命令
例:
@echo 你好|find "你"
@tasklist|find "exe"

4、&-分行符

可以把幾個命令寫在同一行
例:
@echo 123&@echo 456
pause>nul

5、^-分行與轉義符

  1)分行

  可以把一個命令寫成多行哦
例:
@echo 1^
2^
3^
4
@pause>nul
復制上面的命令,執行結果是什么?這就是分行符的作用

  2)轉義

當我們試圖輸出一個&的時候,我們會發現輸出不了...因為它被當成分行符處理了
這時就要請出轉義符^了,它可以剝奪后面第一個符號的特殊地位,變為普通符號(這其實是一個很神奇的功能,之所以神奇...贅不詳述)
例:
@echo ^&
@pause>nul
這樣就輸出了&
另外,當存在a變量(前面set /p a=或set a=給a賦值了)想要輸出%a%,一是可以用轉義符^,還可以:
echo %%a%%
這樣既可將兩個百分號識別為一個,起到了轉義的作用
還有些特殊情況不需要轉義:
echo "0000|000"
用引號括起來可以起到一定的轉義的作用,包括set "a=a的值"等
但特別特殊的情況比如獲取%1時存在轉義符很難處理,沒辦法正常引用

  3)*,?-通配符

啥叫通配符?舉個例子吧,*.jpg表示所有的jpg,*表示所有文件.現在你明白了嗎? 那"?"有什么用,*可以為任意字符,但?只表示一個字符,比如?.jpg只表示文件名只有一個的jpg文件,比如1.jpg,比.jpg什么

  4)()-括起來

括起來的語句是一個整體

  5)>,>>,<-重定向

在這里請注意: 在重定向符號 ">" 以及 ">>" 前必須添加空格以防萬一,因為Batch具有不唯一性所以在很多時候不加空格也能正常使用。但是日常使用中必須添加空格否則失敗的幾率很大,要么是無法創建/輸出,要么文件是空的。
請不要使用不添加空格的不正確用法!
echo 123 >>one.txt
可以輸出123追加到one.txt中
echo 123 >one.txt
可以輸出123覆蓋one.txt中原先的內容
nul是一個系統保留字,所以>nul不會輸出到任何文件,可以起到隱藏命令執行結果的效果
2 >nul可以起到隱藏命令失敗執行結果的效果
<可以從文件中讀取數據到某個命令中,不過這個命令得等待用戶輸入
例:
@echo off
echo 123 >>00.txt
set /p num=<00.txt
echo 數字是%num%
pause>nul
有些命令不止需要一個>nul,如要連接,需要:>nul 2>nul以此類推
如果前面有數字,需要添加空格
ping >nul 2>nul
=1>nul 2>nul ping
=ping >nul 2>&1.... X>&2 X>&2 X>&3等
nul指空設備,簡單來說就是隱藏輸出。
2>&1 3>&2 可以一直接下去,&1 &2就是引用第一個、第二個等

 

> 創建一個文件
>> 追加到一個文件后面
@ 前綴字符.表示執行時本行在cmd里面不顯示, 可以使用 echo off關閉顯示
^ 對特殊符號( > < &)的前導字符. 第一個只是顯示aaa 第二個輸出文件bbb
() 包含命令
, 和空格一樣的缺省分隔符號.
; 注釋,表示后面為注釋
: 標號作用
|管道操作
& Usage:第一條命令 & 第二條命令 [& 第三條命令...] 用這種方法可以同時執行多條命令,而不管命令是否執行成功
&& Usage:第一條命令 && 第二條命令 [&& 第三條命令...]當碰到執行出錯的命令后將不執行后面的命令,如果一直沒有出錯則一直執行完所有命令;
|| Usage:第一條命令 || 第二條命令 [|| 第三條命令...]當碰到執行正確的命令后將不執行后面的命令,如果沒有出現正確的命令則一直執行完所有命令;
eol=c - 指一個行注釋字符的結尾(就一個)
skip=n - 指在文件開始時忽略的行數。
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。
== - 等於
EQU - 等於
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於
選擇開關/i則不區分字符串大小寫;選擇not項,則對判斷結果進行邏輯非。

 

九、命令幫助

###########################

ver
cmd /?
set /?
rem /?
if /?
echo /?
goto /?
for /?
shift /?
call /?
其他需要的常用命令
type /?
find /?
findstr /?
copy /?
下面將所有上面的幫助輸出到一個文件
echo ver >tmp.txt
ver >>tmp.txt
echo cmd /? >>tmp.txt
cmd /? >>tmp.txt
echo rem /? >>tmp.txt
rem /? >>tmp.txt
echo if /? >>tmp.txt
if /? >>tmp.txt
echo goto /? >>tmp.txt
goto /? >>tmp.txt
echo for /? >>tmp.txt
for /? >>tmp.txt
echo shift /? >>tmp.txt
shift /? >>tmp.txt
echo call /? >>tmp.txt
call /? >>tmp.txt
echo type /? >>tmp.txt
type /? >>tmp.txt
echo find /? >>tmp.txt
find /? >>tmp.txt
echo findstr /? >>tmp.txt
findstr /? >>tmp.txt
echo copy /? >>tmp.txt
copy /? >>tmp.txt
type tmp.txt

十、實際應用

開機后一鍵啟動程序

@echo off
::啟動QQ
start "" "D:\Program Files\Tencent\QQLite\Bin\QQScLauncher.exe" /forceuninstall

::啟動eDiary
start "" "D:\Program Files\ed253_setup\eDiary-3.2\eDiary.exe" /forceuninstall

::啟動Foxmail
start "" "D:\Program Files\Foxmail 7.0\Foxmail.exe" /forceuninstall

::啟動WeChat
start "" "D:\Program Files\Tencent\WeChat\WeChat.exe" /forceuninstall

::啟動ie瀏覽器
start "" "C:\Program Files\Internet Explorer\iexplore.exe" /forceuninstall

::啟動360瀏覽器
start "" "D:\Program Files\360\360Chrome\Chrome\Application\360chrome.exe" /forceuninstall

 


免責聲明!

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



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