我有一个 Windows 7 批处理文件(我编写的),它可以打开一个数据库程序,当程序退出时,在使用它们的程序终止后,将大量文件从一个文件夹复制到同一硬盘上的另一个文件夹。换句话说,备份程序数据库。最初数据库很小,我不介意坐在那里观看备份完成,然后再关闭 PC。随着时间的推移,数据库已经显著增长(对我来说),现在需要一段时间才能完成。我最近在脚本中添加了一个“关机”命令,它似乎按预期工作,但是我现在担心数据库在 PC 关机之前是否已经完全写入。这是我的批处理文件:
REM This script starts Brother Keeper and then copies all the files to the Backup
REM folder D:\Libraries\Downloads\Brothers Keeper\Data Backups when it closes.
echo normal mode
start "Brothers Keeper 7" /wait "D:\Program Files (x86)\Brother's Keeper 7\Bk7w.exe"
echo
echo
echo
@echo off
setlocal
:PROMPT
SET /P AREYOUSURE=Do you want to Back-Up the Brothers Keeper Database? (Y/[N])?
IF /I "%AREYOUSURE%" NEQ "Y" GOTO END
SET /P SHUTDOWN=Do you want to Shutdown the PC when completed? (Y/[N])?
@echo on
XXCOPY "D:\Program Files (x86)\Brother's Keeper 7" "D:\Libraries\Downloads\Brothers Keeper\Data Backups" /V2 /C /I /H /R /Y /E /oN"C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\XXCOPY_Error_Log.log" /Fo"C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\Backup_Routine_Output.log"
type "C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\XXCOPY_Error_Log.log">>"C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\Backup_Routine_Output.log"
XXCOPY "D:\Libraries\Documents\Geneology" "D:\Libraries\Downloads\Brothers Keeper\Data Backups" /V2 /C /I /H /R /Y /E /oN"C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\XXCOPY_Error_Log.log" /Fo"C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\Backup_Routine_Output_2.log"
type "C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\Backup_Routine_Output_2.log">>"C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\Backup_Routine_Output.log"
type "C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\XXCOPY_Error_Log.log">>"C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\Backup_Routine_Output.log"
del "C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\Backup_Routine_Output_2.log"
del "C:\Users\Andrew\Desktop\Brothers Keeper Backup Data\XXCOPY_Error_Log.log"
echo
IF /I "%SHUTDOWN%" EQU "Y" ( shutdown.exe /s /t 00 )
echo "Backup Completed. Press a key to end."
pause
我使用 xxcopy 是因为它应该确认文件确实写入磁盘,但当然还有所有该死的缓存。我的问题是:
Windows 和硬盘以缓存来提高性能而臭名昭著。我能确保在 PC 断电之前完成所有磁盘写入吗?
是否有类似于 Unix sync sync sync 的命令来强制 Windows 7/磁盘完成批处理 CLI 中可用的缓存写入?
答案1
任何由软件触发的关机都被视为安全的。
软件关机将调用 Windows 关机进程,该进程将关闭应用程序、根据需要保存数据、在注册表中提交相关更改,然后刷新磁盘缓存,最后调用固件功能告诉系统关闭电源。
唯一不能保证将更改写入磁盘的关机方法是按住电源按钮并强制立即关机以及通过拔掉电源线或拔出电池来物理切断电源。
如果你仍然心存疑虑,可以使用 Microsoft Sysinternals 工具同步它可以刷新磁盘缓存,但您需要以管理员身份运行它,这可能会在用户执行的脚本中造成一些问题。
答案2
sync
Mark Russinovich 编写了 一个与 Linux 等效的命令-同步:
UNIX 提供了一个名为 Sync 的标准实用程序,它可用于指示操作系统将所有文件系统数据刷新到磁盘,以确保其稳定,并且在系统发生故障时不会丢失。否则,缓存中存在的任何修改数据都将丢失。这是我编写的等效程序,称为 Sync,适用于所有版本的 Windows。每当您想知道修改的文件数据是否安全地存储在硬盘上时,都可以使用它。 不幸的是,Sync 需要管理员权限才能运行. 此版本还允许您刷新可移动驱动器,例如 ZIP 驱动器。
请注意 关机命令 说:
/f
:强制关闭正在运行的应用程序而不警告用户。注意:使用 /f 选项可能会导致未保存的数据丢失。/m \ 指定目标计算机。不能与 /l 选项一起使用。
/t <xxx>
:设置关机前的超时时间为 xxx 秒。有效范围为 0-315360000(10 年),默认值为 30。如果超时时间大于 0,则隐含 /f 参数。
这意味着正在/t 0
执行的应用程序不会被强制关闭。