如何在目录中查找和选择最新文件并使用SQLRestore进行恢复?

时间:2018-05-27 15:35:51

标签: batch-file for-loop command

我想创建一个批处理文件或cmd文件,以自动选择目录D:\Romexis_Bilder\romexis_SQL_Backup中的最新文件。这些是ZIP SQL备份文件,每天以yymmddhhmm.zip格式生成两次,例如运行Windows 2016 Server的服务器上的Romexis_db201805271200.zip

然后,应在SQL RESTORE(备份和ftp程序Windows)中使用最新添加到目录的文件(FOR /F的结果)。

想法是使用 FOR 命令

我的选秀:

  • 进入目录:

    pushd "D:\Romexis_Bilder\romexis_SQL_Backup"
    
  • 找到最新的文件。 (我真的不知道如何在这里设置参数。)

    for /f "tokens=*" %% in ('dir /D:\Romexis_Bilder\romexis_SQL_Backup /od') do set newest=%%D:\Romexis_Bilder\romexis_SQL_Backup
    
  • FOR 的结果应在* .zip

    中使用
    cd C:\Program Files (x86)\Pranas.NET\SQLBackupAndFTP\
    SqlRestore D:\Romexis_Bilder\romexis_SQL_Backup\*.zip -db Romexis_db -srv .\ROMEXIS -pwd password disconnect Romexis_db
    

我坚持 FOR ,但不知道是否还有其他可能性。

3 个答案:

答案 0 :(得分:0)

我不知道最后一个命令行是否真的正确。我有一些疑问输出这一行。

但是这段代码可用于根据上次修改日期获取最新* .zip文件的名称而不用路径。

@echo off
set "BackupFolder=D:\Romexis_Bilder\romexis_SQL_Backup"
for /F "eol=| delims=" %%I in ('dir "%BackupFolder%\Romexis_db*.zip" /A-D-H /B /O-D /TW 2^>nul') do set "NewestFile=%%I" & goto DatabaseRestore
echo ERROR: Could not find any *.zip backup file in folder:
echo        "%BackupFolder%"
echo/
pause
goto :EOF

:DatabaseRestore
cd /D "%ProgramFiles(x86)%\Pranas.NET\SQLBackupAndFTP"
SqlRestore.exe "%BackupFolder%\%NewestFile%" -db Romexis_db -srv .\ROMEXIS -pwd password disconnect Romexis_db
echo/
pause

FOR 在一个单独的命令进程中执行,该进程以cmd.exe /C为后台命令行开始执行:

dir "D:\Romexis_Bilder\romexis_SQL_Backup\*.zip" /A-D-H /B /O-D /TW 2>nul

DIR 输出以处理后台命令进程的 STDOUT

  • 由于/A-D-H(属性不是目录而非隐藏)
  • ,仅显示非隐藏文件的名称
  • 为裸格式,因为/B只有文件扩展名,但没有文件路径
  • 由于/O-D
  • 按日期排序反向(最新的第一个)
  • /TW
  • 而使用写入时间(上次修改时间) 目录D:\Romexis_Bilder\romexis_SQL_Backup中的
  • 与模式Romexis_db*.zip匹配。

我建议在命令提示符窗口中运行此命令行,以查看至少一次 DIR 输出。

如果找不到* .zip文件或者目录根本不存在,

DIR 会输出错误消息以处理 STDERR 。通过将其重定向到设备 NUL 来抑制此错误消息。

另请阅读有关Using Command Redirection Operators的Microsoft文章,了解2>nul的说明。重定向运算符>必须使用 FOR 命令行上的插入符^进行转义,以便在执行命令之前Windows命令解释程序处理此命令行时将其解释为文字字符FOR ,它在后台启动的单独命令进程中执行嵌入式dir命令行。

FOR 捕获写入 STDOUT 的输出并逐行处理输出,忽略由于 DIR 而未在此处出现的空行选项/B不会输出空行。

选项/F

FOR 会忽略默认以分号开头的行。因此,使用eol=|;重新定义行尾字符到文件名不能包含的垂直条。在这种情况下不需要eol=|,因为文件名模式Romexis_dbYYYMMDDhhmm.zip使得文件名不太可能以分号开头。

使用选项/F

FOR 会使用空格/制表符作为分隔符将行拆分为子字符串,并为每行仅分配第一个空格/制表符分隔的字符串到指定的循环变量{{ 1}}。通过使用I指定空分隔符列表,可以禁用此行分割行为。由于文件名模式delims=使文件名不太可能包含空格字符,因此在这种情况下不需要delims=

首先通过 DIR 输出的文件名称(指定目录中的最新ZIP文件)将分配给环境变量Romexis_dbYYYMMDDhhmm.zip。接下来退出 FOR 循环,跳转到标签NewestFile,因为 DIR 输出的所有其他文件名对此任务不感兴趣。

仅当指定目录中没有* .zip文件报告此意外错误情况时,才会执行 FOR 命令行下面的命令行。

由于文件名模式DatabaseRestore,也可以在批处理文件中使用下面的 DIR 命令行:

Romexis_dbYYYMMDDhhmm.zip

在命令提示符窗口中执行相同的命令行:

dir "%BackupFolder%\Romexis_db*.zip" /A-D-H /B /O-N 2^>nul

输出中文件名的顺序在此处按名称相反,由于日期/时间格式dir "D:\Romexis_Bilder\romexis_SQL_Backup\*.zip" /A-D-H /B /O-N 2>nul ,导致首先打印文件名中最新日期/时间的Romexis_db*.zip

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • YYYMMDDhhmm
  • cd /?
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • pause /?

另见:

答案 1 :(得分:0)

@Mofi 感谢您的所有工作,它帮助了很多! 如您所知,我首先在命令提示符中使用每个命令来查看输出(适应批次%% I到cmd%I,反之亦然)
我现在能够在D:\Romexis_Bilder\romexis_SQL_Backup中找到最新的文件,将结果作为变量处理到数据库的还原中,这是通过一键式SQL还原https://sqlbackupandftp.com/restore完成的。 我对您的命令O:D的语法进行了一些修改,因为“ - ”排除了删除属性/TW,因为它只列出了2017年的备份。

@echo off
set "BackupFolder=D:\Romexis_Bilder\romexis_SQL_Backup"
for /F "eol=| delims=" %I in ('dir "%BackupFolder%\Romexis_db*.zip" /A-D-H /B /O:D 2^>nul') do set "NewestFile=%I" & goto DatabaseRestore
echo ERROR: Could not find any *.zip backup file in folder:
echo        "%BackupFolder%"
echo/
pause
goto :EOF

:DatabaseRestore
cd /D "%ProgramFiles(x86)%\Pranas.NET\SQLBackupAndFTP"
SqlRestore.exe "%BackupFolder%\%NewestFile%" -db Romexis_db -srv .\ROMEXIS -pwd password 
echo/
pause

可能^中的'dir "%BackupFolder%\Romexis_db*.zip" /A-D-H /B /O:D 2^>nul'在CMD中不正确,但似乎没有影响结果。

真是前进了!现在,One-Click SQL Restore的GUI将以最新的* zip打开。我仍然需要解决的唯一问题是恢复的命令提示符中的语法,现在我仍然需要单击GUI的恢复按钮。或者通过Microsoft Visual Studio SQL或命令行工具进行尝试。

答案 2 :(得分:0)

@MOFI未对2017年或其他文件的文件进行任何修改,以后不会覆盖或修改文件,备份程序总是每天创建一个新文件,命名为romexis_dbYYYMMDDhhmm.zip一天两次。会尝试/O-N 非常感谢你输入