標籤:並且 成功 去掉 清空 全域變數 作用 單詞 調用 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自動備份還原指令碼