如何通过批处理脚本按星期条件将DMP备份文件保存至不同文件夹?
完善你的批处理备份脚本
嘿,作为批处理新手能写出这样的雏形已经很棒了!咱们来把按星期几分流备份的功能补上,还要解决批处理里容易踩的变量延迟扩展坑,直接上修改后的完整代码:
@echo off setlocal enabledelayedexpansion echo Taking backup of Kenduguri Database :: 创建目标文件夹(如果不存在的话,忽略已存在的错误提示) md "C:\backupdb" 2>nul md "C:\backupdb1" 2>nul for /F "tokens=1-4 delims=/ " %%i in ('date /t') do ( set "DayOfWeek=%%i" set "Month=%%j" set "Day=%%k" set "Year=%%l" :: 根据星期几设置备份路径 if "!DayOfWeek!"=="Monday" ( set "FileName=C:\backupdb\kgote_%%k_%%j_%%i" ) else if "!DayOfWeek!"=="Tuesday" ( set "FileName=C:\backupdb\kgote_%%k_%%j_%%i" ) else if "!DayOfWeek!"=="Wednesday" ( set "FileName=C:\backupdb1\kgote_%%k_%%j_%%i" ) else if "!DayOfWeek!"=="Thursday" ( set "FileName=C:\backupdb1\kgote_%%k_%%j_%%i" ) else ( :: 处理其他星期的情况,你可以改成自己需要的默认路径或提示 echo 今天是!DayOfWeek!,不在备份规则范围内,跳过备份 goto :end ) :: 执行Oracle导出命令 exp kgote/kgote@ltcdb file=!FileName!.dmp log=!FileName!.log full=y ) :end endlocal
关键细节解释:
- 变量延迟扩展:批处理的
for循环是一个代码块,默认情况下代码块里的变量会在循环执行前就解析完毕,所以我们需要用setlocal enabledelayedexpansion开启延迟扩展,然后用!变量名!来读取实时更新的变量值(比如!DayOfWeek!),不然你会发现判断逻辑根本不生效。 - 文件夹预处理:用
md 路径 2>nul提前创建备份文件夹,避免因为文件夹不存在导致exp命令失败,2>nul是用来屏蔽“文件夹已存在”的错误提示,让脚本更干净。 - 分支判断:用多分支
if/else if精准匹配星期几,给不同的星期分配对应的备份路径,还加了else分支处理周五到周日的情况,你可以根据自己的需求调整这部分逻辑(比如改成默认存到某个文件夹)。 - 引号包裹:给变量赋值和判断条件都加了双引号,避免因为路径或变量值里有空格导致脚本出错,这是批处理里的好习惯哦!
如果运行时遇到问题,比如星期几的格式不匹配(不同系统的date /t输出格式可能不一样),可以先执行date /t看看你的系统输出的星期几是全称还是缩写,然后调整判断里的字符串就行~
内容的提问来源于stack exchange,提问作者XXAXX
相关产品推荐
相关产品推荐

