首页 > 系统相关 >使用Windows Task Scheduler进行OneDrive强制同步

使用Windows Task Scheduler进行OneDrive强制同步

时间:2023-09-11 21:00:45浏览次数:45  
标签:文件 同步 Windows OneDrive 用户 2% Task

前言

OneDrive的同步策略非常反人类:它允许用户同步文件,但仅限于其划定范围的特定文件夹/文件类型。这意味着用户不能对任意文件夹进行同步,简直是难以想象!

图1 OneDrive对备份文件的选项仅限于几个文件夹内,体现了老牌科技企业在教育用户如何使用计算机上的良苦用心

Strawman Solution

我们可以使用链接(在Windows的语境下似乎被称为junction)实现同步任意文件夹,即在OneDrive中创建指向本地文件的链接,以实现文件的同步。
具体地,使用如下命令:

mklink /j C:\Users\username\Onedrive\folder C:\path\to\any\folder

但遗憾的是,在使用这种方法时,OneDrive已经不能正确地实现对文件变更的及时同步了,详见这个链接
简单来说,这是因为文件系统没有通知OneDrive,所以本地磁盘上做出的更改不会被OneDrive及时发现,也并不会即时同步到云端。这些更改可能需要等上很久才能被OneDrive发现,而这显然与使用云盘备份文件的初衷不符:如果下一秒我的电脑就坏了呢?
(注:用户表示重启能够触发OneDrive的同步检查,但笔者的电脑基本上从不关机,也很少重启,所以这也不是一个令人满意的选择)

为了让OneDrive及时与文件系统同步,一个可能的解决方法是手动进行同步。可惜的是OneDrive仍然没有给出这样的接口,因为它的设计哲学是“用户把文件直接存入云端,在本地创建指向它的链接”。这可真是太厉害了,用户完全不会遇到没网而访问不了云盘的情况呢!用户永远不会遇到版本冲突而心惊胆战地不知道覆盖哪个版本的情况呢!
然而聪明的用户发现,如果OneDrive的根目录发生了文件修改,它就会自动对所有OneDrive内的文件进行一次检查,如果有未同步的更改,就会将这些修改进行同步。
基于此,出现了OneDrive Bully这样的工具,通过周期性地对一个冗余文件重命名,实现对文件系统更改的定期检查。

更干净的解决方案

然而笔者并不太喜欢这样的做法,因为这会让OneDrive的修改记录里全都是这样的记录,从而可能漏掉真正有意义的修改记录。
能不能想办法按需地进行强制同步呢?用户使用工作电脑时,一般不需要把文件同步到云端;而离开工作电脑时,才有把文件同步至云端,供其它计算机使用的情况(假设只有一个用户)。那么,只需在锁屏时进行强制同步就足够了
为了实现这个功能,使用Windows自带的Task Scheduler,将“用户锁屏”这个行为作为触发:

图2 “工作站锁定时”对应的就是用户的锁屏行为

触发时,执行下述脚本:

@echo off

set timestamp=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%

set odpath=C:\Users\%username%\OneDrive\

set syncprefix=SleepSync

set newfilename=%odpath%%syncprefix%_%timestamp%

if exist %odpath%%syncprefix%* (
	rem the syntax of batch script is so weird:
	rem `ren C:\path\to\oldfile ren C:\path\to\newfile` is illegal...
	rem I will have to do `ren absolute_path new_name`, how ugly!  
	ren %odpath%%syncprefix%* %syncprefix%_%timestamp%
) else (
	type NUL > %newfilename%
)

其实就是实现了OneDrive Bully的最小化功能。

总结

  1. 保证单向同步是防止出现数据版本冲突的关键。但是,当数据的原始版本存储在云端时,用户为了离线/低延迟访问,就不得不在本地做拷贝,从而违背这个原则。因此,我不认为把原始拷贝放在云端是一个明智的选择。
  2. Windows批处理脚本的语法很奇怪。
  3. Task Scheduler中的“用户会话断开连接”在使用Win+L进行锁屏时并不会触发。

标签:文件,同步,Windows,OneDrive,用户,2%,Task
From: https://www.cnblogs.com/orange-snow/p/17694496.html

相关文章

  • Windows bat脚本的for语句差异
    在cmd窗口中,for之后的形式变量I必须使用单百分号引用,即%I;而在批处理文件中,引用形式变量I必须使用双百分号,即%%I。在cmd窗口中:for%Iin(command1)docommand2在批处理文件中:for%%Iin(command1)docommand2......
  • windows 编译openssl
    1、downloadthelatestsourceofopensslfromgithub2、downloadnasm,settheenviromentviariable3、enterintodir C:\ProgramFiles(x86)\MicrosoftVisualStudio\2019\Enterprise\VC\Auxiliary\Buildvcvars64.bat4、enterintothedirof openssl,runtheco......
  • windows docker desktop安装mysql
    原文:https://www.jianshu.com/p/fd5d388dbf7d1.拉去mysql镜像dockerpullmysql:5.72.查看并启动镜像#列出已下载的镜像dockerimages#启动容器,挂载配置文件和数据dockerrun--namemysql-vD:/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf-vD:/docker/mysql/logs......
  • windows shutdown
     shutdown用法:shutdown[/i|/l|/s|/sg|/r|/g|/a|/p|/h|/e|/o][/hybrid][/soft][/fw][/f][/m\\computer][/txxx][/d[p|u:]xx:yy[/c"comment"]]没有参数显示帮助。这与键入/?是一样的。/?显示帮助。这与不键入任何选项......
  • Windows 禁用笔记本键盘
    背景笔记本键盘+机械键盘组合如下图:由此产生一个问题:笔记本键盘现在的用处是什么?没什么用,那我们何不把桌面的位置利用起来?......
  • Jenkins windows 下 'pytest' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    问题现象: 解决:     ......
  • 不使用vmtools和共享文件夹将虚拟机外文件导入虚拟机内(windows版)
    不使用vmtools和共享文件夹将虚拟机外文件导入虚拟机内(windows版)前言在某种情况下,例如经过一些设置使得虚拟机上不了网,你无法通过网络下载vmtools安装;然后虚拟机ip网段和本机的网段不同,你不能利用共享文件夹;或者要搭建蜜罐虚拟机,要清除虚拟机里的"虚拟机痕迹"。利用U......
  • Windows安装MySQL Community Server 8.1.0 Innovation
    检查是否安装按win+r打开运行,输入services.msc回车在服务列表中查找mysql服务,如果存在mysql服务,说明已经安装mysql。反之,则说明没有安装了mysql服务。下载并安装下载链接:https://dev.mysql.com/downloads/mysql/MySQLCommunityServer8.1.0Innovation有msi版本......
  • 使用Gitee极速下载Nacos项目制作windows启动
    步骤一使用国内链接下载nacos项目:https://gitee.com/mirrors/Nacos 步骤二进入下载好的nacos主目录下执行maven打包命令,在此之前需要配置好Maven mvn-Prelease-nacos-Dmaven.test.skip=truecleaninstall-U 打包成功的结果图步骤三打包好的启动项存在:E:\Nacos......
  • Windows安装Maven教程
    一、Maven介绍Maven是一种流行的构建工具,用于管理Java项目的构建过程、依赖项和项目生命周期。它提供了一种简单而灵活的方式来构建、测试和部署Java应用程序。Maven使用一个XML配置文件来定义项目的结构和构建过程。通过这个配置文件,你可以指定项目的依赖项,定义构建阶段,配置插件......