一次惨痛教训让我写了个Windows定期备份脚本

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 一次惨痛教训让我写了个Windows定期备份脚本

前言

说实话在写这篇文章的时候,咸鱼不禁又想起了那件男默女泪的往事

我喜欢做笔记,我觉得好记性不如烂笔头,所以在我的学习生涯以及职业生涯阶段,我用过四款笔记应用——Onenote、语雀、印象笔记、Typora

其中我个人觉得体验最好的非 Typora 莫属了

image-20230307021141411.png
在 2022 年的时候,由于 Typora 收费,我就寻思网上找个破解版的用用(白嫖这一块嗷

没想到一顿操作下来,我误删了现在的软件,更加可恨的是,我当时 Typora 文件是存放在程序的目录之下!!!

如下图所示:
image-20230307021657166.png
于是当我意识到我辛辛苦苦写下的笔记全部都没有了的时候,那一瞬间我崩溃了

赶紧上某鱼看看有没有帮忙恢复数据的服务,尽管到最后数据是恢复了,但内容全是乱码(再度崩溃)

image-20230307021923965.png
image-20230307021930285.png
经过这么一件惨案,咸鱼痛定思痛,于是决定写一个定期自动备份文件的 Windows 脚本

在写这个脚本之前,我们先来学习一下脚本当中用到的命令

xcopy

微软官方介绍:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/xcopy

Copies files and directories, including subdirectories

可以看到,xcopy 用于复制文件和目录,包括子目录

#语法
Xcopy <Source> [<Destination>] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d [:MM-DD-YYYY]] [/u] [/i] [/s [/e]] [/t] [/k] [/r] [/h] [{/a | /m}] [/n] [/o] [/x] [/exclude:FileName1[+[FileName2]][+[FileName3]]] [{/y | /-y}] [/z] [/b] [/j] [/compress]

#<Source>: 指定要复制的文件的位置和名称,这个参数必须包含驱动器或路径
#<Destination>:指定要复制的文件的目标,这个参数可以包含驱动器号和冒号、目录名称、文件名或它们的组合

参数如下:

参数 说明
/W 显示以下消息,并在开始复制文件之前等待响应: 按任意键开始复制文件 ()
/p 提示确认是否要创建每个目标文件。
/c 忽略错误。
/v 在写入目标文件时验证每个文件,以确保目标文件与源文件相同。
/q 禁止显示 xcopy 消息。
/f 复制时显示源和目标文件名。
/l 生成要复制的文件列表,但不主动复制文件。
/G 目标 不支持加密时,创建解密的目标文件。
/d
[:MM-DD-YYYY]
仅复制指定日期或之后更改的源文件。 <br/>如果未包含 MM-DD-YYYY 值,xcopy则 复制比现有目标文件更新的所有源文件。 此命令行选项允许更新已更改的文件。
/U 从仅存在于目标上的复制文件。
/i 如果 source 为目录或包含通配符且目标不存在, xcopy 则假定 destination 指定目录名称并创建新目录。<br/>然后, xcopy 将所有指定的文件复制到新目录中。 <br/>默认情况下, xcopy 会提示指定目标是文件还是目录。
/s 复制目录和子目录,除非它们为空。 <br/>如果省略 /s,可在 xcopy 单个目录中工作。
/e 复制所有子目录,即使它们为空。 <br/>将 /e/s/t 命令行选项一起使用。
/t 复制子目录结构 (,即树) ,而不复制文件。 <br/>若要复制空目录,必须包含 /e 命令行选项。
/k 复制文件并保留 目标 文件上的只读属性(如果 源文件 上存在)。 <br/>默认情况下, xcopy 删除只读属性。
/r 复制只读文件。
/h 复制具有隐藏和系统文件属性的文件。 <br/>默认情况下, xcopy 不会复制隐藏的文件或系统文件
/a 仅复制设置了存档文件属性的 源文件/a 不会修改源文件的存档文件属性。
/m 复制设置了存档文件属性的 源文件 。 <br/>与 /a 不同, /m 关闭源中指定的文件中的存档文件属性。
/n 使用 NTFS 短文件或目录名称创建副本。<br/> 将文件或目录从 NTFS 卷复制到 FAT 卷时,或者当 FAT 文件系统命名约定 (目标文件系统上需要 8.3 个字符) 时,需要 /n。 destinatio*文件系统可以是 FAT 或 NTFS。
/o 复制文件所有权和自由访问控制列表 (DACL) 信息。
/x 复制文件审核设置和系统访问控制列表 (SACL) 信息 (暗示 /o) 。
/Y 取消提示,确认是否要覆盖现有目标文件。
/-Y 提示确认是否要覆盖现有目标文件。
/z 在可重启模式下通过网络复制。
/b 复制符号链接而不是文件。 此参数是在 Windows Vista® 中引入的。
/j 在不缓冲的情况下复制文件。 建议用于非常大的文件。 此参数已添加到 Windows Server 2008 R2 中。
/compress 在文件传输过程中请求网络压缩。
/? 在命令提示符下显示帮助。

关于 xcopy 的一些使用指南

  • 使用 /z

加上 /z 参数表示可以在重启的模式下通过网络进行复制

如果你在复制阶段,网络断开了,则连接会在重新建立连接之后恢复,加了/z 参数还能够显示每个文件完成复制操作的百分比

  • 复制加密文件

如果在复制加密文件过程中碰到不支持 EFS 的 volume,会报错

你需要先将文件解密,然后复制,之后再重新加密;又或者可以将加密文件复制到支持 EFS 的 volume

  • 追加文件

如果想要追加文件,把 Destination 指定成单个文件,但 source 是指定多个文件(使用通配符 or file1+file2+file3 格式)

  • Destination 默认值

如果省略 Destination,xcopy 则会将文件复制到当前目录

  • 提示指定 Destination 是文件还是目录

如果你的 Destination 不包含现有的目录,而且没有以反斜杠结尾,系统就会提示你

Does <Destination> specify a file name or directory name on the target(F = file, D = directory)?

如果希望将一个或多个文件复制到某个文件,请按 F;如果希望将一个或多个文件复制到目录,请按 D

如果你不想这条提示出现,可以加上 /i 参数禁止显示此消息

如果 source 是多个文件或目录,则会导致 xcopy 假定目标为目录

正文

在了解了 xcopy 之后,就正式开始脚本的编写吧!

首先我们需要知道你笔记的路径,我笔记的路径是存放在D:\studynote下,而我笔记上面的图片的存放路径却是在C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images

其次定义变量

#源笔记路径
set src_file=D:\studynote

#源图片路径
set src_imgs=C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images

#目标笔记路径
set des_file=E:\typora_backup\typora-%date:~0,4%%date:~5,2%%date:~8,2%\studynote

#目标图片路径
set des_images=E:\typora_backup\typora-%date:~0,4%%date:~5,2%%date:~8,2%\images

其中%date:~0,4%%date:~5,2%%date:~8,2%表示加上当前日期

具体原理如下:

在 Windows cmd 命令行窗口执行date命令后这个环境变量的值为
image-20230307025215378.png

%date:~0,4% 表示从左向右指针向右偏0位,然后从指针偏移到的位置开始提取4位字符(结果是 2023,即年份)

%date:~5,2% 表示指针从左向右偏移5位,然后从偏移处开始提取2位字符(结果是03,月份)

%date:~8,2% 表示指针从左向右偏移8位,然后从偏移处开始提取2位字符(结果是07,日份)

接下来我们使用 xcopy 命令

#复制笔记
xcopy %src_file% %des_file% /e/I

#复制笔记中的图片
xcopy %src_imgs% %des_images% /e/I

点击保存,后缀名改成 bat,然后执行


image-20230307025751448.png
就可以看到备份成功了!
image-20230307025824632.png
那有小伙伴可能会说,现在只是实现了备份功能,定期备份怎么实现呢

这里我们用 Windows 的任务计划来实现

打开任务计划程序,选择右上角的创建基本任务
image-20230307030041289.png

image-20230307030120375.png
设置备份时间为每个月的周一早上九点
image-20230307030147055.png
image-20230307030228807.png
选择执行脚本
image-20230307030412984.png
image-20230307030442697.png
这样一个定时备份的程序就完成了!

相关文章
|
1月前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
39 0
|
2月前
|
Python Windows
python之windows脚本启动bat
python之windows脚本启动bat
|
2月前
|
存储 安全 开发工具
windows开发环境备份,再也不怕重装系统了
【9月更文挑战第2天】在Windows系统中备份开发环境可大幅提升重装系统后的效率。本文详细介绍五个关键步骤:备份开发工具及软件包;保存配置文件;备份数据库与数据文件;确保代码仓库的安全;记录安装步骤与注意事项。遵循这些建议,重装系统时可迅速恢复开发环境,避免重复劳动。
|
3月前
|
安全 Shell Windows
记windows自定义bat脚本自启动
【8月更文挑战第27天】在Windows系统中,可让自定义bat脚本自启动的方法有两种:一是利用“启动”文件夹,通过创建bat脚本的快捷方式并将其放置于该文件夹;二是使用任务计划程序,创建一个启动时触发的任务来运行bat脚本。需确保脚本正确安全,避免对系统产生不良影响。
207 0
|
5月前
|
关系型数据库 MySQL 数据安全/隐私保护
windows系统bat批处理 mysql 脚本启动关闭
windows系统bat批处理 mysql 脚本启动关闭
219 3
|
5月前
|
Windows
windows系统vbs脚本 恶搞关不掉的窗口 以及解决办法
windows系统vbs脚本 恶搞关不掉的窗口 以及解决办法
127 2
|
5月前
|
Windows
windows系统vbs脚本 恶搞将系统搞崩 死机 以及解决
windows系统vbs脚本 恶搞将系统搞崩 死机 以及解决
54 1
|
5月前
|
Windows
windows系统vbs脚本 提取文件夹中的所有文件名
windows系统vbs脚本 提取文件夹中的所有文件名
44 0
|
安全 Windows 数据安全/隐私保护
|
5天前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
下一篇
无影云桌面