Bat脚本学习-5:Oracle自动备份还原脚本

搜了一下,原来是网上的脚本。。。

http://www.tomcatapache.cn/arch/backup/30296915548053298606.html

还是一段段去写注释和理解

::进入管理程序
REM goto直接跳转
REM %1表示bat的第一个参数,如xx.bat abc,其中abc就是%1
if "%1"=="" goto init

::检查exp命令是否可用
REM 冒号后面的,表示程序跳转点,配合goto用的
:checkexp

REM %XX%这种都是全局变量
set resultFile=%temp%\%random%.txt

REM 如果存在就删除,且不提示
del %resultFile% /q>nul 2>nul

REM 调用exp进行Oracle的备份,语法:exp 用户名/密码@数据库,并把结果写到resultFile
exp a/a@a%random% file=%temp%\%random%.dmp >nul 2>%resultFile%

REM 如果有提示无此命令,则显示相应错误提示并退出
if exist %resultFile% (
  type %resultFile%|find "'exp' 不是内部或外部命令">nul
  if !errorlevel!==0 (
    del %resultFile%>nul
    echo exp命令不可用!程序即将退出!
    
    REM ping -n 10表示ping 10次,127.1表示127.0.0.1的缩写。
    REM 此处ping本机又不显示结果,其作用貌似是为了延迟几秒,便于显示文本?
    ping -n 10 127.1 >nul 2>nul
    exit
  )
  del %resultFile%>nul
)

::1.数据库备份
REM title是bat程序的标题栏,echo.表示换行
title 备份进程
echo.
echo.
echo 一、正在进行备份……
for %%i in (1,2,3,4,5,6,7,8,9) do (
    set ora[%%i]>nul 2>nul&& (
        set ora_cur=
        
        REM 如果for in后面的是命令,则需要用英文后引号(即`这个符号)将其括起来
        for /f "usebackq delims==. tokens=1-3" %%a in (`set ora[%%i]`) do set ora_cur=%%b
        
        set ora_usr=
        set ora_net=
        for /f "delims=/" %%a in ('echo !ora_cur!') do set ora_usr=%%a
        for /f "delims=@ tokens=2" %%a in ('echo !ora_cur!') do set ora_net=%%a
        
        echo.
        echo.
        echo     %%i.正在备份 !ora_usr!/******@!ora_net!……
        md !bak_dir!!ora_net!__!ora_usr! >nul 2>nul
        
        REM %time: =0%可获取当前时间,格式:时:分:秒:毫秒,均为2位,不足补0
        set ftmr=!time: =0!
        set bak_cur_dir=!bak_dir!!ora_net!__!ora_usr!
        for /f "tokens=*" %%x in ("!bak_cur_dir!") do set bak_cur_dir=%%~fx
        
        REM 取年份:echo %date:~0,4% 
        REM 取月份:echo %date:~5,2% 
        REM 取日期:echo %date:~8,2% 
        REM 取星期:echo %date:~10,6% 
        REM 取小时:echo %time:~0,2% 
        REM 取分钟:echo %time:~3,2% 
        REM 取秒:echo %time:~6,2% 
        REM 取毫秒:echo %time:~9,2%
        
        REM %x:~m,n%  从第m个字符到第n个字符之间的字串,不包含第n个字符 m~n字符
        set bak_cur_fnm=!ora_net!__!ora_usr!__!date:~0,4!!date:~5,2!!date:~8,2!-!ftmr:~0,2!!ftmr:~3,2!
        set bakfile=!bak_cur_dir!!bak_cur_fnm!.dmp
        set logfile=!bak_cur_dir!!bak_cur_fnm!.log
        exp !ora_cur! file="!bakfile!" log="!logfile!"
        
        REM 使用>nul不在屏幕上输出,如果只是为了注释代码,此处echo改为REM比较好
        echo 如果备份成功的话,就进行压缩>nul
        if exist "!bakfile!" (
            REM pushd:保存当前目录以供 POPD 命令使用,然后改到指定的目录
            REM pushd c:就是记录下c盘,当你转去E盘后用popd就可以转回c盘
            pushd !bak_cur_dir!
            
            set zipfile=
            if exist "%ProgramFiles%winrarwinrar.exe" (
                echo 使用WinRAR进行压缩>nul
                set zipfile=!bak_cur_fnm!.rar
                "%programfiles%winrarwinrar" a -r "!zipfile!" "!bak_cur_fnm!.dmp" "!bak_cur_fnm!.log"
            ) else (
                echo 使用ZIP指令进行压缩>nul
                set zipfile=!bak_cur_fnm!.zip
                zip "!zipfile!" "!bak_cur_fnm!.dmp" "!bak_cur_fnm!.log">nul
            )
            if exist "!zipfile!" (
                REM del 删除  
                REM /P 删除每一个文件之前提示确认。  
                REM /F 强制删除只读文件。  
                REM /S 从所有子目录删除指定文件。  
                REM /Q 安静模式。删除全局通配符时,不要求确认。  
                REM /A 根据属性选择要删除的文件
                del /q "!bakfile!"
                del /q "!logfile!"
            )
            
            REM 与前面的pushd对应
            popd
        ) else (
            echo 如果不存在备份文件,但有日志文件,则删除日志文件>nul
            if exist "!logfile!" del /q "!logfile!"
        )
    )
)
原文地址:https://www.cnblogs.com/liuyouying/p/7144061.html