使用鲁本的帮助,我使用了中建议的代码CryptoLocker - 使用 Google Apps 脚本恢复云端硬盘文件版本 https://stackoverflow.com/q/42402713/1595451(小改动 - 我的代码运行该文件夹中的所有文件,包括子文件夹)以删除病毒攻击当天创建的所有文件版本。现在每个文件的版本都是病毒攻击之前的版本。
/** A function that delete all version of files in folder and subfolders that were made at the day of the virus attack and afterwards*/
function fixAllFilesInFolder(){
var sh = SpreadsheetApp.getActiveSheet();
var folderId = #enter folder Id here
var folder = DriveApp.getFolderById(folderId); // I change the folder ID here
handleFolder(folder, 0)
}
/** A recursive function - delete all 'bad' versions of files in folder and calls itself with each of the subfolders to do the same*/
function handleFolder(folder, treeRank){
Logger.log(String(treeRank) + ': ' + folder.getName());
fixFolderFiles(folder)
var subFolders = folder.getFolders();
while (subFolders.hasNext()){
subFolder = subFolders.next();
handleFolder(subFolder, treeRank + 1)
}
}
/** Delete all 'bad' versions of files in folder*/
function fixFolderFiles(folder){
var files = folder.getFiles();
while (files.hasNext()){
file = files.next();
deleteRevisions(file)
}
}
/** Delete 'bad' version of a file*/
function deleteRevisions(file){
var fileId = file.getId();
var revisions = Drive.Revisions.list(fileId);
var virusDate = new Date(2021, 3, 30) /** Put your attack date here!*/
if (revisions.items && revisions.items.length > 1)
{
for (var i = 0; i < revisions.items.length; i++)
{
if (i > 0){
var revision = revisions.items[i];
var date = new Date(revision.modifiedDate);
if(date.getTime() > virusDate.getTime()){
return Drive.Revisions.remove(fileId, revision.id);
}
}
}
}
}
两个注意事项:
- 不幸的是,Apps 脚本一次只能运行约 5 分钟,因此我必须从不同的文件夹运行代码多次(数十次)才能访问所有文件。
- 即使您将文件恢复到以前的版本,我的文件的名称仍然以加密格式“.wrui”结尾。为了解决这个问题,我下载了所有文件并运行了一个 python 脚本(可能可以在 Apps 脚本中完成,但我觉得使用 python 更舒服)来更改所有名称。
from os import rename, listdir, walk
from os.path import join, isfile
ENCRYPTION = 'wrui' #Here should be the encryption format
#A function to rename a file without the encryption format - it makes sure that no file is named with the same name exactly. In that case, it adds '2' to the files name
def renameFile(address, origin_name, new_name):
final_name = new_name
if isfile(join(address, new_name)):
name_list = new_name.split('.')
name_list[-2] += '2'
final_name = '.'.join(name_list)
rename(join(address, origin_name), join(address, final_name))
#A function to rename all files in a specific folder
def purifyFolderFiles(folder_address):
for file in listdir(folder_address):
f_list = file.split('.')
if len(f_list) > 1:
if f_list[-1] == ENCRYPTION:
renameFile(folder_address, file, '.'.join(f_list[:-1]))
elif f_list[-2] == ENCRYPTION:
if f_list[-3] == f_list[-1]:
renameFile(folder_address, file, '.'.join(f_list[:-2]))
else:
del f_list[-2]
renameFile(folder_address, file, '.'.join(f_list))
#This next few lines iterate through all the subfolders of the specific folder you put and use purifyFolderFiles to rename every file there
folder = #enter you folder address here
for path, subdirs, files in walk(folder):
for name in subdirs:
subdir_address = join(path, name)
purifyFolderFiles(subdir_address)