我想创建一个批处理文件或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 ,但不知道是否还有其他可能性。
答案 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
非常感谢你输入