Я скопировал папку, созданную с помощью истории файлов Windows 8, с диска на компьютер под управлением Windows 7. Поскольку я не мог использовать функцию восстановления, все файлы имеют метки времени, такие как 01 Disappearing World (2015_01_09 04_57_38 UTC).mp3
. Есть ли простой способ удалить эти отметки времени?
4 ответа
Вот сценарий RainingChain, немного подправленный и преобразованный в полноценное консольное приложение на C #. Просто скомпилируйте и наслаждайтесь, протестировано в моей собственной системе.
Добавленные функции:
Сканирование подкаталога и исключение проглатывают, когда доступ запрещен.
Работает только с временными файлами, это позволяет избежать влияния на другие данные.
Если у файла с меткой времени есть другая копия без метки времени в той же папке, он удаляет метку с меткой времени. Это, например, когда программа была переустановлена и снова создала файл без отметки времени.
-
using System.Text.RegularExpressions;
using System;
using System.IO;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("FileHistory timestamp remover V1.0 - HamCode 2018");
Console.WriteLine("Based on a simple C# script by user RainingChain @ Superuser.com");
Console.WriteLine("--------------------------------------------------------------------");
Console.WriteLine();
ReRun:;
Console.WriteLine("Please enter files path, subdirectories will be scanned: ");
string input = Console.ReadLine();
try
{
foreach (string SubDir in Directory.GetDirectories(input))
{
try
{
string[] files = Directory.GetFiles(@SubDir, "*(????_??_?? ??_??_?? UTC).*", SearchOption.TopDirectoryOnly);
Console.WriteLine();
Console.Write("Current directory: ");
Console.Write(@SubDir);
Console.WriteLine(" The following files have been identified as containing a FileHistory timestamp:");
foreach (var value in files)
{
Console.Write(value);
}
Console.WriteLine();
Console.WriteLine();
for (int i = 0; i < files.Length; i++)
{
string newName = Regex.Replace(files[i], @" ?\(\d\d\d\d_\d\d_\d\d \d\d_\d\d_\d\d UTC\)", "");
//System.Diagnostics.Debug.WriteLine(files[i], newName);
File.SetAttributes(files[i], File.GetAttributes(files[i]) & ~FileAttributes.ReadOnly);
if (File.Exists(newName))
{
File.Delete(files[i]);
Console.Write("File deleted: ");
Console.Write(files[i]);
Console.WriteLine();
goto DoNothing;
}
System.IO.File.Move(files[i], newName);
Console.Write("Backup file renamed: ");
Console.Write(newName);
Console.WriteLine();
DoNothing:;
}
}
catch (Exception ds)
{
Console.WriteLine(ds);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
goto ReRun;
}
Console.WriteLine("Completed, press any key to exit.");
Console.Read();
}
}
}
Вам нужно будет
- Запустите PowerShell ISE от имени администратора
Set-ExecutionPolicy unrestricted
Set-Location <your current path>
- Бежать
Вот скрипт C #. Получает список всех файлов. Затем для каждого из них удалите подстроку, соответствующую чему-то похожему на «(2016_04_19 21_26_33 UTC)».
string[] files = Directory.GetFiles(@"C:\Users\Sam\NODEJS\node_modules", "*.*", SearchOption.AllDirectories);
for (int i = 0; i < files.Length; i++) {
string newName = Regex.Replace(files[i], @" ?\(\d\d\d\d_\d\d_\d\d \d\d_\d\d_\d\d UTC\)", "");
//System.Diagnostics.Debug.WriteLine(files[i], newName);
//File.SetAttributes(files[i], File.GetAttributes(files[i]) & ~FileAttributes.ReadOnly);
System.IO.File.Move(files[i], newName);
}
System.Diagnostics.Debug.WriteLine("Completed");
Вот версия Powershell
Get-ChildItem -Recurse | Where-Object { $_.Name -match " ?\(\d\d\d\d_\d\d_\d\d \d\d_\d\d_\d\d UTC\)" } | Rename-Item -NewName { $_.Name -replace " ?\(\d\d\d\d_\d\d_\d\d \d\d_\d\d_\d\d UTC\)", ""}