【轉貼】bat腳本基礎教程


bat腳本基礎教程

https://www.cnblogs.com/linyfeng/p/8072002.html

自己動手太少了。

 

    bat腳本就是DOS批處理腳本,就是將一系列DOS命令按照一定順序排列而形成的集合,運行在windows命令行環境上。本文主要介紹bat腳本基礎語法,希望完成本文內容學習之后具備基礎的bat腳本開發能力,提高工作效率。

為什么學習bat腳本?

    在開始學習bat腳本前可能大家會有一個就是為什么要學習bat腳本,特別是擁有Python、Java、Shell等各種語言可以滿足自己開發小工具完成工作提高效率的情況下。在大家去搜索或者想了解bat腳本的時候或許已經給自己找到了一些理由。我學習bat腳本的原因很簡單,是因為我在用Notepad++編輯器寫完代碼后總是要跑到cmd命令行下執行Python myScript.py才能運行程序,多了很多操作步驟,很繁瑣(開始我還不知道Notepad++可以直接運行Python,配置參考Notepad++好用的功能和插件)。可以編寫一個myScript.bat腳本直接雙擊執行python腳本,myScript.bat腳本內容如下:

@echo off
python myScript.py
pause

   如果你的Windows環境上同時裝有Python2.X和Python3.X,但是腳本必須使用Python2.X程序運行,可以使用Python2.X軟件絕對路徑,如下:

@echo off
C:\Python27\python.exe myScript.py
pause

  大家可以自己測試感受下,從我個人總結來說學習bat的理由有以下2點:

(1)bat腳本作為Python的配套使用工具確實可以提高的編碼效率和工作效率。

(2)學習bat腳本基礎語法不會占用太多時間。

    下面開始學習bat腳本基礎語法。

閱讀說明&建議

(1)本文描述內容為bat腳本最基礎內容,僅適合bat初學者。如果想完整學習,建議下載DOS批處理高級教程學習。

(2)常用"help command"或"command /?"查看命令的使用方法,如color /?。對於命令的基本語法和使用技巧列舉的很詳細。

基本概念

   bat腳本就是DOS批處理腳本,就是將一些列DOS命令按照一定順序排列而形成的集合,運行在windows命令行環境上。

變量設置和讀取

(1)常用系統變量

%CD%  獲取當前目錄
%PATH%  獲取命令搜索路徑
%DATE%  獲取當前日期。
%TIME%  獲取當前時間。
%RANDOM% 獲取 0 和 32767 之間的任意十進制數字。
%ERRORLEVEL% 獲取上一命令執行結果碼

(2)變量讀取。使用%variable%可以獲取變量值,舉例如下

D:\>echo %RANDOM%
157

(3) 變量設置。使用set命令顯示、設置或刪除 windows環境變量。set命令用法可以在cmd下執行"set /?" 或"help set"查看。

SET [variable=[string]] #variable表示變量名,string表示變量值。

  舉例如下:

D:\>set VAR1="I Love BAT Script"
D:\>echo %VAR1%
"I Love BAT Script"

字符串基本操作

(1)字符串截取。使用命令 echo %var:~n,k%,其中"%var",表示待截取字符的字符串,"~"取字符標志符,"n”表示字符截取起始位置,"k" 表示截取結束位置(不包含該字符)。舉例如下

復制代碼
@echo off 
set str=superhero
echo str=%str% 
echo str:~0,5=%str:~0,5%
echo str:~3=%str:~3%
echo str:~-3=%str:~-3% 
echo str:~0,-3=%str:~0,-3% 
pause 
復制代碼

輸出結果如下:

str=superhero
str:~0,5=super
str:~3=erhero
str:~-3=ero
str:~0,-3=superh
請按任意鍵繼續. . .

(2)字符串替換。使用命令%var:old_str=new_str% ,舉例如下

@echo off 
set str=hello world!
set temp=%str:hello=good% 
echo %temp% 
pause 

輸出結果如下:

good world!
請按任意鍵繼續. . .

DOS基本命令介紹

(1)rem 注釋符,也可以用兩個冒號代替(::)

REM [comment]

(2)echo  顯示信息,或啟用或關閉命令回顯。@字符放在命令前將關閉該命令回顯,無論此時echo是否為打開狀態。

復制代碼
echo on 批處理命令在執行時顯示自身命令行
echo off 批處理命令在執行時不顯示自身命令行
@echo off 關閉echo off命令行自身的顯示
echo Hello World 打印Hello World
echo. 輸出空行,"."可以用,:;”/[\]+等任一符號替代
echo test > file.txt 創建包含字符test的file.txt文件
echo y | del d:\temp\*.txt 輸入y確認刪除
復制代碼

(3)pause 暫停並輸出“請按任意鍵繼續. . .”

pause 等待並提示"請按任意鍵繼續. . ."
pause > nul 等待但不出現提示語
echo wait a moment.. & pause > nul 輸出指定輸出語"wait a moment.."並等待操作

(4)errorlevel。程序執行結果返回碼,執行成功返回0,失敗返回為1

(5)start 啟動一個單獨的窗口以運行指定的程序或命令,程序繼續向下執行。

START [command/program] [parameters]

(6)exit 退出CMD.EXE程序或當前批處理腳本

EXIT [/B] [exitCode]
參數說明:
/B:指定要退出當前批處理腳本而不是 CMD.EXE。如果從一個批處理腳本外執行,則會退出 CMD.EXE
exitCode:指定一個數字號碼。如果指定了 /B,將 ERRORLEVEL設成那個數字。如果退出 CMD.EXE,則用那個數字設置過程退出代碼

(7)cls 清除屏幕內容

(8)help 提供 Windows 命令的幫助信息

HELP [command]

 文件操作命令

(1)copy 文件復制命令

copy d:\temp1\file1.txt d:\temp2 將文件file1.txt復制到temp2目錄,有相同文件提示
copy d:\temp1\file1.txt d:\temp2 /y 將文件file1.txt復制到temp2目錄,有相同文件覆蓋原文件,不提示
copy d:\temp1\* d:\temp2 /y 將temp1目錄下的所有文件復制到temp2目錄,有相同文件覆蓋原文件,不提示

(2)xcopy 目錄復制命令

xcopy temp1 d:\temp2 /y 將temp1目錄下的文件復制到temp2目錄,不包括temp1子目錄下的文件。
xcopy temp1 d:\temp2 /s /e /y 將temp1目錄下的文件復制到temp2目錄,包括temp1子目錄下的文件

(3)type 顯示文件內容命令

type file1.txt 查看file1文件內容
type file1.txt file2.txt  #查看file1和file2文件內容
type file1.txt > file2.txt  #將file1.txt文件內容重定向到file2.txt
type nul > file1.txt #創建文件

(4)ren 重命名文件命令

ren d:\temp1\file1.txt file2.txt 修改temp目錄下的file1.txt文件名為file2.txt

(5)del 刪除文件命令

del d:\temp1\file1.txt 刪除temp目錄下的file1.txt文件
del d:\temp\*.txt  刪除temp目錄下的后綴為.txt的文件

目錄操作命令 

(1) cd 顯示當前目錄或切換目錄

cd d:\temp1 切換到temp1目錄,當前目錄是d盤
cd /d d:\temp1 切換到temp1目錄,當前目錄非d盤
cd .. 切換到上一級目錄

(2)mkdir 創建目錄

mkdir test 在當前目錄下創建test目錄
mkdir d:\temp1\test 在temp1目錄下創建test目錄,如果temp1目錄不存在,自動創建

(3)rmdir 刪除目錄

rmdir d:\temp1 刪除空目錄temp1,非空則刪除失敗
rmdir d:\temp1 /s /q 刪除temp1目錄,包括子目錄(/s),並且刪除時不提示(/q)

(4)dir 顯示目錄下的子目錄和文件

dir d:\temp1 顯示temp1目錄下的文件和目錄信息,顯示信息包含日期、時間、文件類型和文件名
dir d:\temp1 /a:a /b 只顯示temp1目錄下(不包括子目錄)的文件的絕對路徑,不顯示日期、時間、文件類型和文件名
dir d:\temp1 /b /s /o:n /a:a  顯示temp1路徑下(包括子目錄)的所有文件的絕對路徑。輸出文件按照文件名數字順序排序
dir d:\temp1\*.txt /a:a /b /o:n 顯示.txt后綴文件,並且按照文件名順序排序(/on),其他排序方法查看help dir

 說明:

  (1)/b表示去除摘要信息,僅顯示完整路徑、/s表示循環列舉文件夾中的內容、/o:n 表示根據文件名排序、/a:a 表示只枚舉文件而不枚舉其他。

  (2)單獨dir /b與dir /s 都不會顯示完整路徑,只有這兩個組合才會顯示完整路徑。  

if/else判斷句使用

    if/else條件語句,用來判定是否符合規定的條件,從而決定執行不同的命令。 在CMD下使用“IF /?”打開 IF 的系統幫助,IF有3種基本的用法,如下

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

 說明:

  NOT:指定只有條件為 false 的情況下,Windows 才應該執行該命令。
  ERRORLEVEL number:如果最后運行的程序返回一個等於或大於指定數字的退出代碼,指定條件為 true。
  string1==string2:如果指定的文字字符串匹配,指定條件為 true。
  EXIST filename:如果指定的文件名存在,指定條件為 true。
  command:如果符合條件,指定要執行的命令。如果指定的條件為 FALSE,命令后可跟 ELSE 命令,該命令將在 ELSE 關鍵字之后執行該命令。

   ELSE 子句必須出現在同一行上的 IF 之后。例如:

    IF EXIST filename. (
        del filename.
    ) ELSE (
            echo filename. missing.
    )

 或者如果都放在同一行上,以下子句有效:

IF EXIST filename. (del filename.) ELSE echo filename. missing

  如果命令擴展被啟用,IF 會如下改變:

IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

  其中, compare-op 可以是:

EQU - 等於
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於

    而 /I 開關(如果指定)說明要進行的字符串比較不分大小寫。/I 開關可以用於 IF 的 string1==string2 的形式上。這些比較都是通用的;原因是,如果 string1 和 string2 都是由數字組成的,字符串會被

轉換成數字,進行數字比較。

for語句使用

  cmd命令行窗口下,輸入help for 或者 for /? 查看for語句的使用方法。for語句基本格式如下:

  FOR %variable IN (set) DO command [command-parameters]

  參數說明:

%variable  指定一個單一字母可替換的參數。注意:批處理腳本中使用%%variable
(set)  指定一個或一組文件。可以使用通配符。
command  指定對每個文件執行的命令。
command-parameters 為特定命令指定參數或命令行開關。

  for語句還有4個參數,分別是 /d /r /l /f ,下面分別介紹這4個參數對應的for語句命令。

(1)/D參數的fro語句格式

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

 說明:如果(set)集中包含通配符,則指定與目錄名匹配,而不與文件名匹配。

 實例:打印C盤根目錄下的目錄名

@echo off
for /d %%i in (c:/*) do (
  echo %%i
)
pause

(2)/R參數的fro語句格式

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

  說明:遞歸查詢指定目錄下的匹配文件。默認使用當前目錄。

  實例:打印D盤目錄及子目錄下的后綴為.txt和.py的文件

@echo off
for /r d:/temp %%i in ( *.txt *.py ) do (
  echo %%i
)
pause

(3)/L參數的fro語句格式

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)

實例:打印10以內的奇數

@echo off
for /l %%i in (1,2,10) do (
  echo %%i
)
pause

(4)FOR語句的/F參數包含如下3種命令格式:

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

  說明:包含/F的參數可以處理文件內容(file-set)、字符串("string")以及執行指定命令('command')返回回的值。可以通過設置["options"]值實現相關需求。["options"]值包含關鍵字說明如下:

eol=c 處理時跳過起始為c字符的行,通常用於跳過注釋行。
skip=n  跳過文件開始的n行
delims=xxx  指定分隔符集。這個替換了空格和制表符的默認分隔符集。
tokens=x,y,m-n  被分隔各字段的處理。
usebackq   需使用雙引號包含文件名時考慮,具體使用執行help for查看

  上面的描述有些地方可能不好裂解,學習並執行完如下幾個實例觀察輸出結果,再去理解效果會更快。

  實例:操作temp.txt文件內容。

復制代碼
@echo off

type nul > temp.txt
echo ;Test for /f parameter >> temp.txt
echo line1 1 2 3 >> temp.txt
echo line2 1 2 3 >> temp.txt
echo line3 1 2 3 >> temp.txt
echo 11 12 13 14 15 16 >> temp.txt
echo 21,22,23,24,25,26 >> temp.txt
echo 31-32-33-34-35-36 >> temp.txt
for /F "skip=4 eol=;  tokens=1,3* delims=,- " %%i in (temp.txt) do (
  echo  i=%%i, j=%%j, k=%%k
)
pause
del temp.txt
復制代碼

 輸出結果如下:

 i=11 , j=13 ,k=14 15 16
 i=21 , j=23 ,k=24,25,26
 i=31 , j=33 ,k=34-35-36

  程序關鍵代碼簡單說明:

skip=4:跳過temp.txt文件的前4行。
eol=;: 忽略冒號打頭的行,直接跳過不處理
delims=,- :指定分隔符為逗號(,)、減號(-)、和空格,空格必須放在最后
tokens=1,3*:將按照指定分隔符號分隔到的第1個字段賦給變量i,第二個字段賦值給變量j,剩余字段賦值給變量k。注意:變量i在 for 語句中顯式聲明,變量j和變量k是通過tokens= 選項隱式聲明的。

 建議:如果還是不太理解的可以將上述skip、eol、delims、tokens進行修改並執行觀察輸出,

bat腳本常用實例

(1)根據輸入選項操作

復制代碼
@echo off

set /p var="Please input the number(1,2,3):"

if %var% == 1 (
  echo "the number equal to 1"
) else if %var% == 2 (
  echo "the number equal to 2"
) else if %var% == 3 (
  echo "the number equal to 3"
) else (
  echo "input wrong number,exit program."
)

pause
復制代碼

(2)文件和目錄相關操作

復制代碼
@echo off

rem "About operate directory&file bat script"

title Test bat

set CURRENTDIR=D:\worktset TEMPDIR=%CURRENTDIR%\temp
set TEMPFILE=%TEMPDIR%\temp.txt

if not exist %TEMPDIR% (
  echo "Create temp directory"
  mkdir %TEMPDIR%
) else (
  echo The directory of %TEMPDIR% existed,recreate directory
)


if not exist %TEMPFILE% (
  echo Create temp file
  type nul > %TEMPFILE%
) else (
  echo 
  echo "=========%DATE% %TIME%================" >> %TEMPFILE%
)

echo Happy New Year! >> %TEMPFILE%
echo Congratulate to everyone >> %TEMPFILE%

rem copy file and directory

set TEMPDIR2=%CURRENTDIR%\temp2

md %TEMPDIR2%
xcopy /s /y %TEMPDIR% %TEMPDIR2%

type %TEMPDIR2%\temp.txt

pause
復制代碼

(3)將指定目錄下的文件輸出並移動到指定目錄下

復制代碼
@echo off

rem 如果路徑中包含空格,變量值需帶雙引號
rem WORK_DIR表示要操作的文件夾,DEST_DIR表示文件要保存的目標文件夾 SET WORK_DIR="c:\Program Files" SET DEST_DIR="D:\temp" if not exist %DEST_DIR% ( mkdir %DEST_DIR% ) for /f "delims=" %%i in ('dir /b /s /o:n /a:a %WORK_DIR%') do ( echo %%i copy "%%i" %DEST_DIR% )
pause
復制代碼

(4)將指定目錄下的文件按照文件名排序輸出。

復制代碼
@echo off

SET WORK_DIR=D:\temp\work
for /f "delims=" %%i in ('dir /a /b /on %WORK_DIR%\*.txt') do ( echo %%i )
pause
復制代碼

FAQ

1、DOS命令下如何實現自動交互?

   利用重定向方式可以實現自動交互輸入。假設需要交互的腳本為A.exe,腳本需要依次輸入12、13、15。則可以采用如下形式:

del c.txt
echo 12 > c.txt
echo 13 >> c.txt
echo 15 >> c.txt
A.exe < c.txt

參考資料

(1)cmd詳解 目錄類命令

(2)cmd下文件類操作命令

 
分類:  編程語言
標簽:  bat批處理腳本教程語法實例DOSWindows


免責聲明!

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



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