Код для захвата файловых данных в PSOObject и сортировки по LastWriteTime - PullRequest
0 голосов
/ 07 января 2019

Я хочу рекурсивно получить список недавно измененных файлов на двух сетевых дисках, отсортировать их в порядке убывания даты и внести некоторые изменения в файл CSV, чтобы привести в порядок список для Excel

Я использовал приведенный ниже код из ряда источников (я начинающий PowerShell), и теперь он делает то, что мне нужно (т.е. создает список).

Мне нужна помощь в дальнейшем продвижении, я не могу отсортировать полученный CSV-файл по дате последней записи файла, это потому, что мой массив ожидает текст, а не числовое поле?

Я также возвращаю имя домена и владельца файла с ((Get-ACL $_.FullName).Owner). Я попытался использовать Replace, чтобы сократить строку, но мне не повезло с таким подходом.

$arr = @()
$days_to_check=$(Get-Date).AddDays(-28)
$items  = @(Get-ChildItem '\\ND\dir 1\*.*' -Recurse -ErrorAction SilentlyContinue | where { $_.LastWriteTime -gt $days_to_check})
$items += @(Get-ChildItem '\\ND\dir 1\*.*' -Recurse -ErrorAction SilentlyContinue | 
where { $_.LastWriteTime -gt $days_to_check})
$items | Foreach {
$obj = New-Object PSObject -prop $hash
$obj | Add-Member NoteProperty FullName $_.FullName
$obj | Add-Member NoteProperty Directory $_.Directory
$obj | Add-Member NoteProperty Name $_.Name
$obj | Add-Member NoteProperty LastTime $_.LastWriteTime
$obj | Add-Member NoteProperty Owner ((Get-ACL $_.FullName).Owner)
$arr += $obj
}
$arr | Format-List
$arr | Sort-Object -Property LastTime -Descending
$arr | Export-CSV -notypeinformation C:\temp\filenamesFO.csv 

CSV-файл, отсортированный по полю даты

1 Ответ

0 голосов
/ 07 января 2019

Вы отсортировали массив в выводе, но это все, что вы сделали. Если вы действительно хотите экспортировать его таким образом, вам нужно присвоить сортировку $arr

Заменить $arr | Sort-Object -Property LastTime -Descending

с

$arr = $arr | Sort-Object -Property LastTime -Descending

Вы можете удалить домен владельца, используя следующую команду: -replace '(.*\\)(.*)','$2'

Вот полный пример реализации изменений, упомянутых выше.

$arr = new-object -TypeName 'System.Collections.Generic.List[PSObject]'
$days_to_check=$(Get-Date).AddDays(-28)
$items  = @(Get-ChildItem '\\ND\dir 1\*.*' -Recurse -ErrorAction SilentlyContinue | where { $_.LastWriteTime -gt $days_to_check})
$items += @(Get-ChildItem '\\ND\dir 1\*.*' -Recurse -ErrorAction SilentlyContinue | 
where { $_.LastWriteTime -gt $days_to_check})


Foreach ($item in $items) {
$obj = [PSCustomObject]@{
    FullName = $item.FullName
    Directory = $item.Directory
    Name = $item.Name
    LastTime = $item.LastWriteTime
    Owner  = (Get-ACL $item.FullName).Owner -replace '(.*\\)(.*)','$2'
}

$arr.add($obj)
}

$arr = $arr | Sort-Object -Property LastTime -Descending
#$arr | Format-List
$arr | Export-CSV -notypeinformation C:\temp\filenamesFO.csv 

Я сделал несколько дополнительных изменений:

  • Вместо использования массива я использовал список PSObject. Если у вас много файлов, время обработки будет улучшено по сравнению с массивом.

  • Я использовал объявление PSCustomObject, чтобы показать альтернативу всем этим Add-member. Я нахожу это чище, но это зависит от вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...