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

一次,惨痛教训,windows,定期,备份文件,脚本 · 浏览次数 : 335

小编点评

## 咸鱼的备份脚本写作指南 **前言** 咸鱼在写这篇文章的时候,想起了那件男默女泪的往事,并对笔记的备份过程产生了兴趣。于是,他决定写一个定期自动备份文件的 Windows 脚本,以确保笔记的完整性。 **脚本编写** 1. **学习命令** 咸鱼先查看 xcopy 的官方文档,学习如何使用该命令复制文件和目录,以及如何设置目标文件的属性等。 2. **脚本编写** 以下是咸鱼最终写的脚本,使用 PowerShell 语言: ```powershell # 设置目标目录 $targetPath = "D:\studynote" # 获取笔记图片的路径 $imagePath = Join-Path -Path $targetPath -ChildItem "*.jpg" # 创建目标目录 New-Item -Path $targetPath -ItemType Directory -Force # 遍历笔记图片,并复制它们 Get-ChildItem -Path $imagePath -Recurse | ForEach-Object { # 获取文件名 $fileName = $_.Name # 创建目标文件名 $targetFileName = Join-Path -Path $targetPath -ChildItem "$fileName.jpg" # 设置目标文件属性 Set-ItemProperty -Path $targetFileName -Name "Source" -Value $_.FullName # 开始复制文件 Copy-Item -Path $_.FullName -Destination $targetFileName -Force -ErrorAction SilentlyContinue } # 打印复制完成的通知 Write-Host "笔记备份成功! completed!" ``` **脚本功能** 1. 首先,脚本设置了目标目录,即 D:\studynote 路径下的笔记图片文件夹。 2. 然后,脚本获取笔记图片的路径,并将其保存在 $imagePath 中。 3. 接着,脚本创建目标目录,如果存在同名目录,会提示用户进行覆盖操作。 4. 然后,脚本开始遍历笔记图片,并对每个图片执行以下步骤: * 获取文件名 * 创建目标文件名,将扩展名为 .jpg * 设置目标文件属性,将 Source 属性指向目标文件名 * 开始复制文件 * 打印复制完成的通知 5. 最后,脚本打印备份完成的通知,并退出。 **注意事项** 1. 脚本需要在运行之前运行一次,以设置目标目录。 2. 脚本中的 `%date:~0,4%%date:~5,2%%date:~8,2%` 等式用于生成当前日期,具体原理见脚本注释。 3. 脚本中的 `Copy-Item` 命令会递归地复制文件,请确保目标目录足够大可以容纳所有文件。 **结语** 咸鱼的备份脚本,可以确保笔记的完整性,并为需要时进行恢复。相信这个脚本能帮助您轻松实现笔记的备份操作。

正文

前言

说实话在写这篇文章的时候,咸鱼不禁又想起了那件男默女泪的往事
 
我喜欢做笔记,我觉得好记性不如烂笔头,所以在我的学生以及职业生涯阶段,我用过四款笔记应用——Onenote、语雀、印象笔记、Typora
 
其中我个人觉得体验最好的非 Typora 莫属了
 
 
 
 
在 2022 年的时候,由于 Typora 收费,我就寻思网上找个破解版的用用(白嫖这一块嗷
 
没想到一顿操作下来,我误删了现在的软件,更加令人崩溃的是,我当时 Typora 文件是存放在程序的目录之下!!!
 
如下图所示:
 
 
 
 
我是完全无视掉下面那个 DO NOT ADD FILES HERE
 
于是当我意识到我辛辛苦苦写下的笔记全部都没有了的时候,那一瞬间我崩溃了
 
赶紧上某鱼看看有没有帮忙恢复数据的服务,尽管到最后数据是恢复了,但内容全是乱码(再度崩溃)
 
 
 
 
 
 
 
经过这么一件惨案,咸鱼痛定思痛,于是决定写一个定期自动备份文件的 Windows 脚本
 
在写这个脚本之前,我们先来学习一下脚本当中用到的命令
 
xcopy
 
微软官方介绍:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/xcopy
 
Copies files and directories, including subdirectories
 
可以看到,xcopy 用于复制文件和目录,包括子目录
 
 
 
参数如下:
 
参数
说明
/W
显示以下消息,并在开始复制文件之前等待响应:按任意键开始复制文件 ()
/p
提示确认是否要创建每个目标文件。
/c
忽略错误。
/v
在写入目标文件时验证每个文件,以确保目标文件与源文件相同。
/q
禁止显示 xcopy 消息。
/f
复制时显示源和目标文件名。
/l
生成要复制的文件列表,但不主动复制文件。
/G
当 目标 不支持加密时,创建解密的目标文件。
/d [:MM-DD-YYYY]
仅复制指定日期或之后更改的源文件。如果未包含 MM-DD-YYYY 值,xcopy则 复制比现有目标文件更新的所有源文件。此命令行选项允许更新已更改的文件。
/U
从仅存在于目标上的源复制文件。
/i
如果 source 为目录或包含通配符且目标不存在, xcopy 则假定 destination 指定目录名称并创建新目录。然后, xcopy 将所有指定的文件复制到新目录中。默认情况下, xcopy 会提示指定目标是文件还是目录。
/s
复制目录和子目录,除非它们为空。如果省略 /s,可在 xcopy 单个目录中工作。
/e
复制所有子目录,即使它们为空。将 /e 与 /s 和 /t 命令行选项一起使用。
/t
复制子目录结构 (,即树) ,而不复制文件。若要复制空目录,必须包含 /e 命令行选项。
/k
复制文件并保留 目标 文件上的只读属性(如果 源文件 上存在)。默认情况下, xcopy 删除只读属性。
/r
复制只读文件。
/h
复制具有隐藏和系统文件属性的文件。默认情况下, xcopy 不会复制隐藏的文件或系统文件
/a
仅复制设置了存档文件属性的 源文件 。/a 不会修改源文件的存档文件属性。
/m
复制设置了存档文件属性的 源文件 。与 /a 不同, /m 关闭源中指定的文件中的存档文件属性。
/n
使用 NTFS 短文件或目录名称创建副本。 将文件或目录从 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 不包含现有的目录,而且没有以反斜杠结尾,系统就会提示你
 
 
 
 
 
 
如果希望将一个或多个文件复制到某个文件,请按 F;如果希望将一个或多个文件复制到目录,请按 D
 
如果你不想这条提示出现,可以加上 /i 参数禁止显示此消息
 
如果 source 是多个文件或目录,则会导致 xcopy 假定目标为目录
 

正文

 

 
在了解了 xcopy 之后,就正式开始脚本的编写吧! 首先我们需要知道你笔记的路径 我笔记的路径是存放在D:\studynote下 而我笔记上面的图片的存放路径却是在C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images下 其次定义变量
 
 
其中%date:~0,4%%date:~5,2%%date:~8,2%表示加上当前日期 具体原理如下: 在 Windows cmd 命令行窗口执行date命令后这个环境变量的值为
 
 
%date:~0,4% 表示从左向右指针向右偏0位,然后从指针偏移到的位置开始提取4位字符(结果是 2023,即年份) %date:~5,2% 表示指针从左向右偏移5位,然后从偏移处开始提取2位字符(结果是03,月份) %date:~8,2% 表示指针从左向右偏移8位,然后从偏移处开始提取2位字符(结果是07,日份) 接下来我们使用 xcopy 命令
 
 
点击保存,后缀名改成 bat,然后执行,就可以看到备份成功了!
 
 
那有小伙伴可能会说,现在只是实现了备份功能,定期备份怎么实现呢 这里我们用 Windows 的任务计划来实现 打开任务计划程序,选择右上角的创建基本任务
 
 
 
 
 
设置备份时间为每个月的周一早上九点
 
 
 
 
 
选择执行脚本
 
 
 
 
 
这样一个定时备份的程序就完成了!

感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力
 
 

与一次惨痛教训让我写了个Windows定期备份文件脚本相似的内容:

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

前言 说实话在写这篇文章的时候,咸鱼不禁又想起了那件男默女泪的往事 我喜欢做笔记,我觉得好记性不如烂笔头,所以在我的学生以及职业生涯阶段,我用过四款笔记应用——Onenote、语雀、印象笔记、Typora 其中我个人觉得体验最好的非 Typora 莫属了 ​ 在 2022 年的时候,由于 Typor

一次惨痛的面试:“网易提前批,我被虚拟线程问倒了”

一、写在开头 昨晚收到一个粉丝在私信的留言如下: build哥,今天参加了网易的提前批,可以说是一次惨痛的面试体验,直接被虚拟线程问倒了,无论是在校学习的时候还是在公司实习的时候,都使用的是Java8更多,或者Java11,比较点子背的是面试我的这一个面试官,他们团队刚好在做Java21的切换,

一次nginx文件打开数的问题排查处理

现象:nginx域名配置合并之后,发现consul-template无法完成nginx重载,然后发现需要重启nginx,才能让配置生效。 注意:下次哪个服务有报错,就看重启时所有日志输出,各种情况日志输出。不要忽略细节。很多时候其实已经看到了问题,却没有深入查看问题。 查看进程最大打开文件个数 #c

一次glide内存泄漏排查分析

glide是一款非常优秀的图片加载框架,目前很多项目在使用。提供了非常方法,在此,笔者就不一一列举了,可以到官网查找。 目前项目在做内存排查,因为是车机项目,之前开发的时候没有注意内存方面的问题(车机项目你懂的),现在ota期间系统提出让我们优化内存,说出现过应用内存一直增加的情况。 一脸懵逼,第一

记一次栈溢出异常问题的排查

刚修改的服务,推到开发环境之后,总是时不时的崩溃,但是不知道为什么。尝试找到他的最后一次调用,也没有复现。 没有办法,只能抓dump了。 开启崩溃自动dump,网络上很多,不赘述了。 拿到dump之后,首先看看是什么类型的异常 如图所示,是个栈溢出的异常。 打印一下堆栈,发现密密麻麻的全是这个代码。

记一次字符串末尾空白丢失的排查 → MySQL 是会玩的!

开心一刻 今天答应准时回家和老婆一起吃晚饭,但临时有事加了会班,回家晚了点 回到家,本以为老婆会很生气,但老婆却立即从厨房端出了热着的饭菜 老婆:还没吃饭吧,去洗下,来吃饭吧 我洗好,坐下吃饭,内心感动十分;老婆坐旁边深情的看着我 老婆:你知道谁最爱你吗 我毫不犹豫道:你 老婆:谁最关心你? 我:你

记一次线上问题 → Deadlock 的分析与优化

开心一刻 今天女朋友很生气 女朋友:我发现你们男的,都挺单纯的 我:这话怎么说 女朋友:脑袋里就只想三件事,搞钱,跟谁喝点,还有这娘们真好看 我:你错了,其实我们男人吧,每天只合计一件事 女朋友:啥事呀? 我:这娘们真好看,得搞钱跟她喝点 问题复现 需求背景 MySQL8.0.30 ,隔离级别是默认

记一次 Redisson 线上问题 → ERR unknown command 'WAIT' 的排查与分析

开心一刻 昨晚和一个朋友聊天 我:处对象吗,咱俩试试? 朋友:我有对象 我:我不信,有对象不公开? 朋友:不好公开,我当的小三 问题背景 程序在生产环境稳定的跑着 直到有一天,公司执行组件漏洞扫描,有漏洞的 jar 要进行升级修复 然后我就按着扫描报告将有漏洞的 jar 修复到指定的版本 自己在开发

一次Java服务内存过高的分析过程

现象 年前,收到了短信报警,显示A服务的某台机器内存过高,超过80% 如上图所示,内存会阶段性增加。奇怪的是,十多台机器中只有这一台有这个问题 堆内内存分析 最先怀疑是内存泄漏的问题,所以首先使用jmap命令把堆dump下来 jmap -dump:format=b,file=service.hpro

一次OOM事故的学习过程

事故过程 周二下午得到消息, 希望帮忙分析dump文件. 告知dump大小为42G大小. 一般机器没这么大的内存进行处理. 建议现场上传到百度云盘, 然后我这边进行下载. 时间进度为: 11.57创建的dump 现场打包压缩, 拉取上传百度云盘. 速度大概只有500KB/S. 压缩后文件6G, 时间