天天看點

window批處理腳本學習使用:.bat .cmd檔案編寫

背景:由于之前用python寫的資料庫導資料的程式略慢,而cups要導入的資料又很多很多,考慮到時效的要求,準備用oracle自帶的sql loader把海量資料導入,編寫好sql loader的控制檔案(一種導入規則檔案)之後,在cmd下執行指令:

sqlldr ora_name/ora_passwd@ora_ip/orcl control=bsa.ctl
           

就能按規則調用sql loader工具,把海量的資料導進去了,是以打算寫個bat/cmd腳本,可以根據輸入參數,以很快的速度把指定日期内的檔案導進去。

下面進入本篇正題,windows下腳本檔案的編寫。

1.常用指令舉例

建立檔案夾:

md D:\mybat //将在D盤下建立一個名為 mybat的檔案夾

删除檔案夾:

rd D:\mybat //将删除D盤中的mybat檔案夾删除

删除檔案夾中的檔案:

del D:\mybat\sheepmu.txt //删除檔案sheepmu.txt

del D:\mybat\sheepmu.txt /q //安靜模式删除,即删除時不彈出是否删除的提示框

複制檔案 :

xcopy D:\mybat\sheepmu.txt D:\mybat1 //若D中無mybat1這個檔案夾則會建立檔案夾再複制

向檔案中寫入内容:

echo sheepmu >> D:\mybat\sheepmu.txt //如果這個檔案不存在就建立檔案并輸入。

如果是檔案夾不存在就不會成功! >>與>的差別是>是覆寫掉原來 的;>>是直接輸入到原來的尾部

顯示檔案中内容:

type D:\mybat\sheepmu.txt

更改檔案名字尾:

ren D:\mybat*.txt *.html

Goto 指令

指定跳轉到标簽,找到标簽後,程式将處理從下一行開始的指令。

文法:

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

Sample:

if {%1}=={} goto noparms 
if {%2}=={} goto noparms
@Rem check parameters if null show usage 
:noparms 
echo Usage: monitor.bat ServerIP PortNumber 
goto end 
           

标簽的名字可以随便起,但是最好是有意義的字母啦,字母前加個:用來表示這個字母是标簽,goto指令就是根據這個:來尋找下一步跳到到那裡。最好有一些說明這樣你别人看起來才會了解你的意圖啊。

Rem 指令

注釋指令,在C語言中相當與/——–/,它并不會被執行,隻是起一個注釋的作用,便于别人閱讀和你 自己日後修改。

Rem Message 
Sample:@Rem Here is the description. 
           

pause:

運作 Pause 指令時,将顯示下面的消息:

Press any key to continue …

@echo off
:begin
echo hello world!
pause
goto begin
@Rem 這裡是注釋!
           

Call 指令

從一個批處理程式調用另一個批處理程式,并且不終止父批處理程式。call 指令接受用作調用目标的标簽

。如果在腳本或批處理檔案外使用 Call,它将不會在指令行起作用。

文法:

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

參數:

[Drive:}[Path] FileName

指定要調用的批處理程式的位置和名稱。filename 參數必須具有 .bat 或 .cmd 擴充名。

start 指令

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

常用參數:

MIN 開始時視窗最小化

SEPARATE 在分開的空間内開始 16 位 Windows 程式

HIGH 在 HIGH 優先級類别開始應用程式

REALTIME 在 REALTIME 優先級類别開始應用程式

WAIT 啟動應用程式并等候它結束

parameters 這些為傳送到指令/程式的參數

執行的應用程式是 32-位 GUI 應用程式時,CMD.EXE不等應用程式終止就傳回指令提示。如果在指令腳本内執行,該新行為則不會發生。

choice 指令

choice 使用此指令可以讓使用者輸入一個字元,進而運作不同的指令。使用時應該加/c:參數,c:後應寫提

示可輸入的字元,之間無空格。它的傳回碼為1234……

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

将顯示

defrag,mem,end[D,M,E]?

Sample:

@echo off 
choice /c:dme defrag,mem,end 
if errorlevel  goto defrag (應先判斷數值最高的錯誤碼) 
if errorlevel  goto mem 
if errotlevel  goto end 

:defrag 
c:\dos\defrag 
goto end 
:mem 
mem 
goto end 
:end 
echo good bye 
           

此檔案運作後,将顯示 defrag,mem,end[D,M,E]? 使用者可選擇d m e ,然後if語句将作出判斷,d表示執行

标号為defrag的程式段,m表示執行标号為mem的程式段,e表示執行标号為end的程式段,每個程式段最後

都以goto end将程式跳到end标号處,然後程式将顯示good bye,檔案結束。

If 指令

if 表示将判斷是否符合規定的條件,進而決定執行不同的指令。

有三種格式:

1)、if “參數” == “字元串” 待執行的指令

參數如果等于指定的字元串,則條件成立,運作指令,否則運作下一句。(注意是兩個等号)

如if “%1”==”a” format a:

if {%1}=={} goto noparms

if {%2}=={} goto noparms

2)、if exist 檔案名 待執行的指令

如果有指定的檔案,則條件成立,運作指令,否則運作下一句。

如if exist config.sys edit config.sys

3)、if errorlevel / if not errorlevel 數字 待執行的指令

如果傳回碼等于指定的數字,則條件成立,運作指令,否則運作下一句。

如if errorlevel 2 goto x2

DOS程式運作時都會傳回一個數字給DOS,稱為錯誤碼errorlevel或稱傳回碼,常見的傳回碼為0、1。

2.批處理小例子

a.檢查是否中 冰河

@echo off
netstat  -a  -n  >  D:\mybat\sheepmu.txt
type  D:\mybat\sheepmu.txt | find  "7626"  && echo 遭了,中了!
pause & exit 
           

解析:

第一行:echo off 表示關閉顯示,@表示不顯示 echo off本身

第二行:netstat 顯示協定及目前tcp/ip連接配接, -a表示顯示所有連接配接和偵聽端口;-n表示以數字的形式顯示位址和;并把這些資訊寫入到檔案D:\mybat\sheepmu.txt中。

第三行: type 表示顯示檔案D:\mybat\sheepmu.txt中内容;

| 表示把|前面的輸出到|後面的;

&& 表示如果前面成功才執行後面的;

第四行: & 表示且,即暫停且退出。

b.清理系統垃圾

@echo off

if exist C:\windows\temp*.* del C:\windows\temp*.*

if exist C:\windows\History*.* del C:\windows\History*.*

if exist C:\windows\recent*.* del C:\windows\recent*.*

exist

解析:如果存在該檔案就删除該檔案。注意:删除檔案夾用 rd ;删除檔案用 del

3.注意事項

a.批處理腳本編寫時最好的老師就是小黑老師啦,打開指令行視窗,輸入指令加上/?就會有詳細的說明,比如: netstat /?

b.pause 指令可以友善我們檢視指令執行到了那一步,因為在bat腳本運作時若出現腳本錯誤視窗會一閃而過。

c.批處理執行過程中可以按 Ctrl+C退出,這對于出現死循環時非常有用。

..

.

.

.

經認真計劃了一番,現技術方案有變,現在準備用python直接處理界面,使用者,建表,該ctl檔案等等内容,python使用system接口去調用sqlldr工具,也就是說不用寫bat檔案了,關于windows腳本就先學習到這裡吧,下次再繼續,88