Як автоматично оновлювати дату зміненої папки в Windows


3

Чи існує в Windows спосіб автоматичного оновлення (або за допомогою простого сценарію) дати папки з останньою зміненою датою будь-якого з її файлів (рекурсивний)?

Відповіді:


4

Це можна зробити в PowerShell. Щось подібне до оновлення поточної папки на основі файлів, які вона безпосередньо містить:

$lastModified = (dir . | ?{!$_.PSIsContainer} | sort LastWriteTime | select -last 1).LastWriteTime
$folder = get-item .
$folder.LastWriteTime = $lastModified

(Це не вдасться, якщо в папці немає файлів або якщо у користувача немає відповідних дозволів.)

РЕДАКТУВАТИ: Переконайтесь, що знайдено лише один файл (останній), щоб сортувати трубопровід має єдиний результат.


на Win7 я отримую помилку Exception setting "LastWriteTime": "Cannot convert null to type "System.DateTime"."при запуску цього. Це має відношення до першого рядка, .LastWriteTimeсуфікс вирішується на нульове. Видалення його створює значення для $lastmodified, але не того, якого ми хочемо.
matt wilkie

вирішено перший рядок, потрібно схопити перший елемент зі списку, а не сам список:, $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."але за життя мого я не можу зрозуміти, що може бути цим процесом (і я спробував багато різних папок.) Я думаю, що ображаючий процес - це сам!
matt wilkie

@Matt: виправили свою першу проблему (забули повернути лише один елемент, щоб отримати дату). По-друге: можливо, PSH утримує папку відкритою, я б скористався Handlesпроцесором Explorer (обидва Sysinternals), щоб визначити, що відкрита папка.
Річард

2

Я щойно робив простий тест - якщо ви створюєте порожній файл у каталозі, він змінює дату зміненої папки на той час. Коли ви видаляєте файл, він все ще вважається модифікацією, тому він залишається модифікованим на той час.

Щоб зробити це рекурсивно, вам доведеться створити порожній файл у кожній папці, в якій потрібно змінити дату. Це все ще досить просте рішення, якщо ви готові виконати просте програмування.

Якщо ви хочете змінити дату на щось інше, ніж поточний час, це рішення явно не вийде.


1

Ви можете використовувати обмін масових файлів .

BulkFileChanger - це невелика утиліта, яка дозволяє створити список файлів з декількох папок, а потім зробити деякі дії над ними - Змініть створений / модифікований / доступний час, змініть їх атрибут файлу (лише для читання, приховано, система), запустіть виконуваний файл із ці файли як параметр, і скопіюйте / виріжте пасту в Провідник.

alt текст


це потребує ручного втручання, окрім запуску, звичайно?
Notitze

1
+1 для виділення корисної утиліти, яка може змінювати дати файлу та папки. -1, що його не можна використовувати так, як
вимагається

Дійсно, це хороша програма Ніра Софера, але модифікацію папки / дату створення папки можна встановити лише вручну. Nir написав ще одну програму, яка робить це набагато елегантніше, дивіться мою відповідь на FolderTimeUpdate .
хронометричний

0

Не красива, але функціональна. Вчинено в баш / цигун

==================
find -maxdepth 1 -type d | grep -v "^\.$" | while read D ; do
  cd "$D"
  F=`ls -1tr | tail -1`
  cd ..
  touch -r "$D/$F" "$D"
done
==================

Брайан


0

Ось модифікована версія відповіді Річарда. Це також сценарій 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

0

Нічого не робити! Місію виконано!

Остання зміна дати папки - це завжди дата останнього зміненого файлу в ній.


Якщо останній змінений файл був видалений / переміщений, дата не повертається назад, тому в деяких випадках це не працює, якщо ви хочете мати в папці дату останнього зміненого файла.
сатибель

ОП заявило, що "оновити", а не "відкласти".

Він також не працює рекурсивно, щонайменше, на Windows 7 зі структурою \ 1 \ 2 \ 3.exe 1 і 2 - з 2016 р. Я вставив 3.exe, що є результатом 2003 року: 1 все ще в 2016 році 2 знаходиться в 2017 3.exe є в 2003 р.
satibel

0

FolderTimeUpdate

Дійсно хороший вибір для програми без сценарію. Окрім того, що не налаштовується автоматично (у графічному інтерфейсі), його функціональність є саме такою, що бажана:

FolderTimeUpdate - це простий інструмент для Windows, який сканує всі файли та папки у вибраній базовій папці та оновлює "Змінений час" кожної папки відповідно до останнього зміненого часу збережених у ній файлів .

введіть тут опис зображення

Більшість цього може бути виконана і в командному рядку, тому, можливо, ви можете автоматизувати його, встановивши його для запуску з інтервалом або, можливо, навіть контролювати певні папки .

Графічний інтерфейс дозволяє контролювати глибину підпапки для повторного включення, включення та виключення підстановних знаків і навіть, чи змінювати також час створення файлу (такий же, як модифікований час, чи відповідати найдавнішому створенню чи модифікованому часу).

Програма відмінного та плодотворного Ніра Софера (той самий автор « Масового обміну файлами» у менш відповідній відповіді ).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.