Відповіді:
Це можна зробити в PowerShell. Щось подібне до оновлення поточної папки на основі файлів, які вона безпосередньо містить:
$lastModified = (dir . | ?{!$_.PSIsContainer} | sort LastWriteTime | select -last 1).LastWriteTime
$folder = get-item .
$folder.LastWriteTime = $lastModified
(Це не вдасться, якщо в папці немає файлів або якщо у користувача немає відповідних дозволів.)
РЕДАКТУВАТИ: Переконайтесь, що знайдено лише один файл (останній), щоб сортувати трубопровід має єдиний результат.
$fileList = (dir . | ?{!$_.PSIsContainer} | sort LastWriteTime)а далі $lastModified = $fileList[0].LastWriteTime. Все ще не працює, якщо встановити час останнього мода, Exception setting "LastWriteTime": "The process cannot access the file 'D:\bugs' because it is being used by another process."але за життя мого я не можу зрозуміти, що може бути цим процесом (і я спробував багато різних папок.) Я думаю, що ображаючий процес - це сам!
Handlesпроцесором Explorer (обидва Sysinternals), щоб визначити, що відкрита папка.
Я щойно робив простий тест - якщо ви створюєте порожній файл у каталозі, він змінює дату зміненої папки на той час. Коли ви видаляєте файл, він все ще вважається модифікацією, тому він залишається модифікованим на той час.
Щоб зробити це рекурсивно, вам доведеться створити порожній файл у кожній папці, в якій потрібно змінити дату. Це все ще досить просте рішення, якщо ви готові виконати просте програмування.
Якщо ви хочете змінити дату на щось інше, ніж поточний час, це рішення явно не вийде.
Ви можете використовувати обмін масових файлів .
BulkFileChanger - це невелика утиліта, яка дозволяє створити список файлів з декількох папок, а потім зробити деякі дії над ними - Змініть створений / модифікований / доступний час, змініть їх атрибут файлу (лише для читання, приховано, система), запустіть виконуваний файл із ці файли як параметр, і скопіюйте / виріжте пасту в Провідник.

Ось модифікована версія відповіді Річарда. Це також сценарій PowerShell. Замість встановлення зміненого часу поточного каталогу він встановлює модифікований час для всіх підкаталогів першого рівня поточного каталогу. Ще одна відмінність полягає в тому, що він виглядає рекурсивно за останній модифікований час. Сподіваюся, це корисно для когось іншого.
$parentPath = Get-Location
Get-ChildItem | where {$_.PsIsContainer} | foreach {
cd -LiteralPath $_.FullName
$files = dir -Recurse . | where {-Not $_.PsIsContainer}
if ($files.Count -eq 0) {
echo "note: $($_.Name) contains no files"
} else {
$_.LastWriteTime = ($files | sort LastWriteTime | select -last 1).LastWriteTime
}
}
cd -LiteralPath $parentPath
Остання зміна дати папки - це завжди дата останнього зміненого файлу в ній.
Дійсно хороший вибір для програми без сценарію. Окрім того, що не налаштовується автоматично (у графічному інтерфейсі), його функціональність є саме такою, що бажана:
FolderTimeUpdate - це простий інструмент для Windows, який сканує всі файли та папки у вибраній базовій папці та оновлює "Змінений час" кожної папки відповідно до останнього зміненого часу збережених у ній файлів .
Більшість цього може бути виконана і в командному рядку, тому, можливо, ви можете автоматизувати його, встановивши його для запуску з інтервалом або, можливо, навіть контролювати певні папки .
Графічний інтерфейс дозволяє контролювати глибину підпапки для повторного включення, включення та виключення підстановних знаків і навіть, чи змінювати також час створення файлу (такий же, як модифікований час, чи відповідати найдавнішому створенню чи модифікованому часу).
Програма відмінного та плодотворного Ніра Софера (той самий автор « Масового обміну файлами» у менш відповідній відповіді ).
Exception setting "LastWriteTime": "Cannot convert null to type "System.DateTime"."при запуску цього. Це має відношення до першого рядка,.LastWriteTimeсуфікс вирішується на нульове. Видалення його створює значення для$lastmodified, але не того, якого ми хочемо.