将错误处理添加到现有Windows批处理脚本 - >从目录中复制最新文件

时间:2014-07-06 00:02:04

标签: sql-server windows batch-file

我在这里发现了一个很好的帖子,查询最新的sql server备份,然后将其复制到远程服务器以准备还原。这是一个批处理文件,它是通过sql还原作业中的sql代理步骤使用cmd执行的。我正在寻找帮助,为下面的现有脚本添加额外的逻辑:

:Variables
SET DatabaseBackupPath=\\virtualserver1\Database Backups
echo.
echo Restore WebServer Database
FOR /F "delims=|" %%I IN ('DIR "%DatabaseBackupPath%\WebServer\*.bak" /B /O:D') DO SET            NewestFile=%%I
copy "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\"

我想补充的是两件额外的东西。首先在现有脚本中添加一些错误处理,首先检查最新备份,但在最近24小时内确保它。如果它继续运行。如果超过24小时,则在备份文件超过24小时时生成通知警报(即单独的批处理文件)。其次是生成类似的通知,如果出现问题,例如无法访问持有备份的远程共享。

感谢回复。

1 个答案:

答案 0 :(得分:0)

在24小时内检查文件是否已创建或上次修改并不容易。如果没有将日期/时间字符串转换为自纪元以来的秒数,日期/时间计算不是一项简单的任务,这将使得可以使用简单的整数比较。

有文件日期比较的解决方案,请参阅

您可以使用其中一种解决方案。

更容易检查复制过程是否有效:

copy /V "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\"
if errorlevel 1 goto CopyFail
goto :EOF

:CopyFail
echo.
echo Copying file "%DatabaseBackupPath%\WebServer\%NewestFile%" failed!
pause

使用WinRAR的解决方案

我的解决方案基于Rar.exe WinRAR 的控制台版本)的使用,因为此压缩工具具有根据文件日期仅压缩文件的功能。因此,只有安装了 WinRAR 并购买了许可证,此解决方案才对您有所帮助。

WinRAR 程序文件文件夹的路径必须设置在以下批处理文件的顶部。

@echo off
SET DatabaseBackupPath=\\virtualserver1\Database Backups
SET WinRarFolder=C:\Program Files\WinRAR
cls
echo.
echo Restore WebServer Database
echo.
rem Find newest *.bak file in backup directory on server.
FOR /F "delims=" %%I IN ('DIR /B /O-D "%DatabaseBackupPath%\WebServer\*.bak"') DO (
   SET NewestFile=%%I
   goto BackupFound
)
cls
echo.
echo Restore WebServer Database
echo.
echo There is no *.bak file in "%DatabaseBackupPath%\WebServer\"
echo or the backup directory on server cannot be reached at all.
goto EndBatch

:BackupFound
echo Newest backup in "%DatabaseBackupPath%\WebServer"
echo is the file "%NewestFile%".
echo.
if exist "%TEMP%\ServerBackup.rar" del "%TEMP%\ServerBackup.rar"
"%WinRarFolder%\Rar.exe" a -cfg- -ep -inul -m0 -tn24h -y "%TEMP%\ServerBackup.rar" "%DatabaseBackupPath%\WebServer\%NewestFile%"
if errorlevel 1 goto OldBackup

"%WinRarFolder%\Rar.exe" e -cfg- -inul -y "%TEMP%\ServerBackup.rar" F:\Temp
if errorlevel 1 goto ExtractFailed

del "%TEMP%\ServerBackup.rar"
echo File "%NewestFile%" copied to D:\
goto EndBatch

:ExtractFailed
del "%TEMP%\ServerBackup.rar"
echo "Copying file "%NewestFile%" to D:\ failed.
goto EndBatch

:OldBackup
echo File "%NewestFile%" is older than 24 hours.

:EndBatch
set WinRarFolder=
SET DatabaseBackupPath=
SET NewestFile=
echo.
pause

<强>解释

批处理文件首先使用命令 DIR 来获取指定目录中的* .bak文件列表,这些文件按照从最新到最旧的最后修改文件日期排序。

使用 FOR 循环,列表顶部(=最新文件)的文件名称将分配给环境变量 NewestFile

如果在指定目录中找不到* .bak文件,批处理文件将输出错误消息,例如,如果此时使用所用用户帐户的权限无法访问服务器。

但是在成功找到指定目录中的* .bak文件后,批处理文件会通知批处理文件用户在哪个目录中找到了哪个文件。

确保临时文件的目录中不存在要创建的RAR存档后,Rar.exe用于在目录中为临时文件创建RAR存档,其中只存储找到的文件而不进行压缩,但仅当此文件由于切换-tn24h而在24小时内有最后修改日期。

有关Rar.exe上使用的开关的详细信息,请参阅 WinRAR 程序文件目录中的文本文件 Rar.txt

如果在创建RAR存档时出现任何问题,则

Rar.exe退出并返回值大于0。在这种情况下,原因很可能是指定的文件超过24小时,这导致现在写入控制台窗口的相应消息。

Rar.exe成功创建RAR存档而不再使用压缩将文件解压缩到目标目录。

在不太可能的情况下显示适当的错误消息。否则批处理文件输出成功消息并完成清理环境表(如果下一个命令提示符窗口关闭,则不需要)。

在任何情况下都会删除临时使用的RAR存档。