Как мне написать скрипт Powershell, который проверяет, когда в последний раз файл был добавлен в папку? - PullRequest
1 голос
/ 12 июня 2019

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

Я пытался использовать рекурсивный метод Poweshell, но не смогвыяснить, как правильно настроить его.Прямо сейчас скрипт успешно печатает имя каждой папки в электронную таблицу Excel, а также печатает время последней записи каждой папки, что является неверной информацией.

$row = 2

$column = 1

Get-ChildItem "C:\Users\Sylveon\Desktop\Test"| ForEach-Object {     

    #FolderName
    $sheet.Cells.Item($row,$column) = $_.Name
    $column++
    #LastBackup
    $sheet.Cells.Item($row,$column) = $_.LastWriteTime
    $column++
    #Increment to next Row and reset Column
    $row++
    $column = 1
}

Текущее состояние сценария печатает каждое имя папки в отчете, но дает дату создания папок, а не время, когда файл был записан в эту папку.

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Следующее должно работать, чтобы получить самую последнюю дату редактирования любого файла в текущем каталоге.

Get-ChildItem | Sort-Object -Property LastWriteTime -Descending | Select-Object -first 1 -ExpandProperty "LastWriteTime"

Get-ChildItem получает элементы в вашем каталоге

Sort-Object -Property LastWriteTime -Descending сортирует по времени записи, самое позднее первое

Select-Object -first 1 -ExpandProperty "LastWriteTime" получает первое в списке, затем получает время записи


Я сделал это, чтобы получить данные, которые вы пытаетесь получить.Последняя строка дает нам пустую строку, если каталог пуст, что, вероятно, является самым безопасным для Excel, но вы также можете по умолчанию использовать что-то отличное от пустой строки, например, дату создания каталога:

$ChildDirs = Get-ChildItem | Where-Object { $_ -is [System.IO.DirectoryInfo] }
$EditNames = $ChildDirs | ForEach-Object Name
$EditTimes = $EditNames | ForEach-Object { @( (Get-ChildItem $_ | Sort-Object -Property LastWriteTime -Descending | Select-Object -first 1 LastWriteTime), '' -ne $null)[0] }

for($i=0; $i -lt $ChildDirs.Length; $i++) {
    Write-Output $EditNames[$i]
    Write-Output $EditTimes[$i]
}


Чтобы реализовать это для того, что вы делаете, если я правильно понимаю ваш вопрос, попробуйте следующее:

$ChildDirs = Get-ChildItem | Where-Object { $_ -is [System.IO.DirectoryInfo] }
$EditNames = $ChildDirs | ForEach-Object Name
$EditTimes = $EditNames | ForEach-Object { @( (Get-ChildItem $_ | Sort-Object -Property LastWriteTime -Descending | Select-Object -first 1 LastWriteTime), '' -ne $null)[0] }

for($i=0; $i -lt $ChildDirs.Length; $i++) {
    #FolderName
    $sheet.Cells.Item($row, $column) = $EditNames[$i]
    $column++
    #LastBackup
    $sheet.Cells.Item($row, $column) = $EditTimes[$i]
    $row++
    $column = 1
}
0 голосов
/ 12 июня 2019

Если вы просматриваете только файлы первого уровня в каждой папке, вы можете сделать это с помощью вложенного цикла:

$row = 2
$column = 1

$folders = Get-ChildItem $directorypath
ForEach ($folder in $folders) { 

    # start off with LastEdited set to the last write time of the folder itself
    $LastEdited = $folder.LastWriteTime
    $folderPath = $directoryPath + '\' + $folder.Name
    # this 'dynamically' sets each folder's path

    $files = Get-Childitem $folderPath
    ForEach ($file in $files) {
        if ((Get-Date $file.LastWriteTime) -gt (Get-Date $LastEdited)) {
            $LastEdited = $file.LastWriteTime
        }
    }

    $sheet.Cells.Item($row,$column) = $folder.Name
    $column++
    $sheet.Cells.Item($row,$column) = $LastEdited
    $row++
    $column = 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...