У меня есть дерево общих каталогов на файловом сервере Windows 2003, в котором хранится около 100 ГБ данных. Мне нужно найти все каталоги верхнего уровня в этой папке, где указано время последней модификации для каждый файл в каждой подпапке не был изменен синус 1/1/11. По сути, я ищу брошенные акции.
Структура каталогов выглядит примерно так:
-a
--a1
--a2
--a3
----a3_1
-b
--b1
--b2
-c
--c1
----c1_1
etc
Что я хочу сделать, так это узнать, если все это не скрытый файл под a, b или c, имеет дату модификации до или после 01.01.11.
Пока что я могу найти время модификации каждого файла через год:
get-childitem "\\server\h$\shared" -recurse | where-object {$_.mode -notmatch "d"} |
where-object {$_.lastwritetime -lt [datetime]::parse("01/01/2011")}
Я не знаю, как это сделать, так это проверить каждый каталог верхнего уровня по отдельности, чтобы убедиться, что все файлы, содержащиеся в нем, старше года. Любые идеи?
Я думаю, ты просишь посмотреть только на файл время модификации. Не уверен, что вы хотите делать с папками, которые содержат только подпапки, которые не менялись в течение года. Я также не уверен, что "каждый каталог верхнего уровня", ты имеешь в виду a
, b
, c
или a
, a1
, a2
...
Следующее смотрит на все каталоги, и отображать их только в том случае, если они не содержат файлов, написанных за последний год. Сообщите мне, даст ли это результат, который вы ищете:
$shareName = "\\server\share"
$directories = Get-ChildItem -Recurse -Path $path | Where-Object { $_.psIsContainer -eq $true }
ForEach ( $d in $directories ) {
# Any children written in the past year?
$recentWrites = Get-ChildItem $d.FullName | Where-Object { $_.LastWriteTime -gt $(Get-Date).AddYears(-1) }
If ( -not $recentWrites ) {
$d.FullName
}
}
Отредактируйте согласно вашему комментарию. Если вы хотите получить только каталоги верхнего уровня, которые не содержат файлов, измененных за последний год, попробуйте следующее. Обратите внимание, что на очень глубоких / больших общих ресурсах это может занять некоторое время.
$shareName = "\\server\share"
# Don't -recurse, just grab top-level directories
$directories = Get-ChildItem -Path $shareName | Where-Object { $_.psIsContainer -eq $true }
ForEach ( $d in $directories ) {
# Get any non-container children written in the past year
$recentWrites = Get-ChildItem $d.FullName -recurse | Where-Object { $_.psIsContainer -eq $false -and $_.LastWriteTime -gt $(Get-Date).AddYears(-1) }
If ( -not $recentWrites ) {
$d.FullName
}
}