Использование WinSCP из PowerShell для извлечения файлов, измененных за последний час

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

$directoryInfo = $session.ListDirectory($remotePath) 

$latest = 
    $directoryInfo.Files | 
    Where-Object { -Not $_.IsDirectory } | 
    Sort-Object LastWriteTime -Descending | 
    Select-Object -First 1 

Я считаю, что мне нужно добавить еще одно условие в предложение Where-Object, но я не знаю правильного формата. Например,

    Where-Object { -Not $_.IsDirectory and <created/modified within the last hour> } 

Как мне это сделать? Есть ли лучший/более простой способ?


person Doug    schedule 03.05.2016    source источник


Ответы (2)


Расширьте текущий where-блок, чтобы проверить, является ли LastWriteTime больше (новее), чем datetime-объект, представляющий предыдущий час. Бывший:

$lasthour = (Get-Date).AddHours(-1)

$directoryInfo = $session.ListDirectory($remotePath) 

$latest = $directoryInfo.Files | 
Where-Object { (-Not $_.IsDirectory) -and ($_.LastWriteTime -gt $lasthour) } | 
Sort-Object LastWriteTime -Descending |
Select-Object -First 1 
person Frode F.    schedule 03.05.2016
comment
+1, хотя не уверен, действительно ли ОП хочет части Sort-Object LastWriteTime -Descending | Select-Object -First 1. Я могу представить, что цель состоит в том, чтобы загрузить все последние файлы, а не только самый последний файл. - person Martin Prikryl; 03.05.2016
comment
Да, но вопрос был не в этом. Сначала я удалил их, но поскольку я не знаю, что он хочет сделать, я добавил их обратно только для того, чтобы исправить то, что ему не хватало. :-) - person Frode F.; 03.05.2016
comment
В заголовке указано получить файлы, измененные за последний час. - person Martin Prikryl; 03.05.2016
comment
Вопрос не в заголовке... Вопрос в том, как он может отфильтровать старые элементы, используя оператор where, который он частично написал. В любом случае, ему требуется 2 секунды, чтобы удалить линии. :-) - person Frode F.; 03.05.2016
comment
Кроме того, сам вопрос на самом деле говорит, что он хочет только получить файл. Вы, наверное, правы, но поскольку вопрос/название неясно (несоответствие), я решил ответить тем, чем хотел помочь и не более того. Мы стараемся избегать написания полных решений для других, поскольку предполагается, что они могут быть повторно использованы другими, которые могут не захотеть загружать файлы, а просто находить новые элементы. :-) - person Frode F.; 03.05.2016

Если вы хотите загрузить все файлы, созданные/измененные за последний час, используйте:

$directoryInfo = $session.ListDirectory($remotePath) 

$limit = (Get-Date).AddHours(-1)

$recentFiles = 
    $directoryInfo.Files | 
    Where-Object { (-Not $_.IsDirectory) -And ($_.LastWriteTime -Gt $limit) }

foreach ($fileInfo in $recentFiles)
{
    $sourcePath = [WinSCP.RemotePath]::EscapeFileMask($fileInfo.FullName)
    $session.GetFiles($sourcePath, $localPath + "\*").Check()
}

Некоторые официальные примеры сборки WinSCP .NET, используемые для создания кода:

person Martin Prikryl    schedule 03.05.2016
comment
Теперь я вижу, что мой вопрос и тема несколько расходятся друг с другом. Мои извинения за путаницу. Вот еще предыстория: - person Doug; 03.05.2016
comment
Справочная информация. У нас есть процесс, который помещает один файл в исходную папку каждый будний день около 17:20. Мне нужно получить этот файл, переименовать его и поместить на другой сервер. Скрипт планируется запускать по будням. Мой исходный код работал нормально, за исключением федеральных праздников, когда файл не создается. В результате файл предыдущих дней будет повторно обработан. Таким образом, я переключился на получение только файлов, измененных в течение последнего часа, а не на получение самого последнего файла. - person Doug; 03.05.2016
comment
Решение Frode F. сработало, как хотелось бы. Спасибо за помощь! - person Doug; 03.05.2016