1. 程式人生 > >Bat腳本學習-4:Oracle自動備份還原腳本

Bat腳本學習-4:Oracle自動備份還原腳本

我們 括號 div local delay != 產生 註意 路徑名

從同事那弄到一份Oracle自動備份還原的腳本,看上去很強大,苦在bat語法不熟,查了半天文檔,先弄明白了一小段

@echo off

REM 在批處理中,我們可以用setloacl ENABLEDELAYEDEXPANSION這個命令來啟用"延遲環境變量擴展"
REM 在我們啟用了"延遲環境變量擴展"後,當CMD在解釋涵有嵌套格式的命令時,他會把嵌套的命令一條一條的先執行一次,然後再進行匹配操作
REM 這樣我們的賦值操作就會完成.並且再"延遲環境變量擴展"啟用後,CMD會用!號來判斷這是不是一個變量
REM 如沒啟用來變量用%name%這樣的格式判斷,啟用後就用!name!這樣的格式判斷了,這個符號我們需要註意!
setlocal ENABLEDELAYEDEXPANSION ::讀取配置文件 echo 正在讀取配置文件... set "base64=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" REM 假如執行一個命令,但是不想在屏幕裏看到這個命令的執行情況,可以使用"[命令]>nul"就可以屏蔽命令在屏幕上的輸出 REM 但是有的命令執行會出錯,即使用了">nul"也不能屏蔽命令產生的信息,所以就在後面加" 2>nul"這個 REM 就是"[命令]>nul+空格+2>nul",這樣,不管命令是否正確的運行,都不會在屏幕看到這個命令所產生的屏幕顯示了。
REM 此處作用是在系統目錄下新建一個文件夾,如果已經存在會報錯,但被nul屏弊了,不會看到錯誤提示的輸出 md %windir%\OracleAutoBackup >nul 2>nul set configFile=%windir%\OracleAutoBackup\config.ini set i=0 REM 文件不存在的話,就新建並輸出一個換行符 REM .表示換行,>表示輸出到文件 if not exist %configFile% echo.>%configFile% REM delims=後面的字符的意識是,將文本每一行的內容以delims=後面的字符分割成若幹列.
REM delims=後面可以是多個字符,可以是空格,也可以什麽都沒有. REM 什麽都沒有代表什麽呢?就是不以任何東西為分割符,也是整行的內容了. REM 因為for默認是以,;和空格作分割符的, 所以一般要取得整行內容通常會用"delims="這樣的形式來取消for的默認分割符. for /f "delims=" %%x in (%configFile%) do ( REM i為全局變量 if !i!==0 set bak_hou=%%x if !i!==1 set bak_lot=%%x if !i!==2 set bak_dir=%%x REM gtr表示大於 REM set/a表示數字運算 REM call表示調用函數 if !i! gtr 2 ( set/a gup=!i!-2 call :base64_str "%%x" set ora[!gup!]=!val! ) set/a i+=1 ) cls ::取默認值 REM ^ 表示行首,"^step"僅匹配 "step hello world"中的第一個單詞 REM $ 表示行尾,"step$"僅匹配 "hello world step"中最後一個單詞 REM *號表示重復的次數為零次或者多次 REM ^[0-9]*$表示純數字 REM || 可同時執行多條命令,當碰到執行正確的命令時,將不再執行後面的命令。如果一直沒有正確的,則執行完畢 REM && 可同時執行多條命令,當碰到執行錯誤的命令時,將不再執行後面的命令。如果一直沒有錯誤的,則執行完畢 REM &同時執行多條命令,不管命令是否執行成功 REM 所以這兩句意思是如果是空,則賦值;如果是數字,則不賦值,保留原值 if "!bak_hou!"=="" set bak_hou=3 echo !bak_hou!|findstr "^[0-9]*$">nul || set bak_hou=3 if "!bak_lot!"=="" set bak_lot=7 echo !bak_lot!|findstr "^[0-9]*$">nul || set bak_lot=7 REM %cd%表示當前文件夾(執行時所在文件夾),%~dp0表示批處理文件所在文件夾 if "!bak_dir!"=="" set bak_dir=%cd%\數據庫備份 REM "delims=" 的含義是取消默認的分隔符,所以會把行上的內容照搬下來 REM 而 "tokens=*" 表示獲取行上的所有內容,但是會忽略行首的所有空格。 REM %~fI - 將 %I 擴充到一個完全合格的路徑名,這個I其實就是我們在FOR帶入的變量,此處為x for /f "tokens=*" %%x in ("!bak_dir!") do set bak_dir=%%~fx if not exist !bak_dir! md !val! >nul 2>nul ::去掉格式錯誤的數據庫連接配置項 set j=0 for %%i in (1,2,3,4,5,6,7,8,9) do ( REM && 可同時執行多條命令,當碰到執行錯誤的命令時,將不再執行後面的命令。如果一直沒有錯誤的,則執行完畢 set ora[%%i]>nul 2>nul&& ( REM set後面不賦值表示清空變量 set ora_cur= REM usebackq 是一個增強型參數,當使用了這個參數之後,原來的for語句中第一個括號內的寫法要做如下變動: REM 如果第一個括號裏的對象是一條命令語句的話,原來的單引號‘要改為後引號`; REM 如果第一個括號裏的對象是字符串的話,原來的雙引號"要改為單引號‘; REM 如果第一個括號裏的對象是文件名的話,要用雙引號"括起來 REM tokens=1-3”表示1至3列,後面疑是%%a,怎麽會是%%b? for /f "usebackq delims==. tokens=1-3" %%a in (`set ora[%%i]`) do set ora_cur=%%b set ora[%%i]= REM \/表示轉義的/ echo !ora_cur!|findstr "\/">nul 2>nul && echo !ora_cur!|findstr "@">nul 2>nul && ( set/a j+=1 set ora[!j!]=!ora_cur! ) ) )

寫了很多註釋,以便理解

Bat腳本學習-4:Oracle自動備份還原腳本