Bat指令碼學習-4:Oracle自動備份還原指令碼

來源:互聯網
上載者:User

標籤:並且   成功   去掉   清空   全域變數   作用   單詞   調用   delay   

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

@echo offREM 在批處理中,我們可以用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>nulset configFile=%windir%\OracleAutoBackup\config.iniset i=0REM 檔案不存在的話,就建立並輸出一個分行符號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=3echo !bak_hou!|findstr "^[0-9]*$">nul || set bak_hou=3if "!bak_lot!"=="" set bak_lot=7echo !bak_lot!|findstr "^[0-9]*$">nul || set bak_lot=7REM %cd%表示當前檔案夾(執行時所在檔案夾),%~dp0表示批次檔所在檔案夾if "!bak_dir!"=="" set bak_dir=%cd%\Database BackupREM "delims=" 的含義是取消預設的分隔字元,所以會把行上的內容照搬下來REM 而 "tokens=*" 表示擷取行上的所有內容,但是會忽略行首的所有空格。REM %~fI - 將 %I 擴充到一個完全合格的路徑名,這個I其實就是我們在FOR帶入的變數,此處為xfor /f "tokens=*" %%x in ("!bak_dir!") do set bak_dir=%%~fxif not exist !bak_dir! md !val! >nul 2>nul::去掉格式錯誤的資料庫連接配置項set j=0for %%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自動備份還原指令碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.