背景:由于之前用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