Загрузка вчерашних файлов в PowerShell с помощью WinSCP

область разработки: используйте PowerShell и WinSCP .NET сборки для автоматизации ночные загрузки с помощью метки времени файла для идентификации файлов для загрузки. FTP-сервер, подключенный к IIS, поэтому он не поддерживает все команды, такие как MLSD, в его текущей конфигурации, и я не вижу, чтобы они вносили изменения по запросу.

проблема: файлы, которые имеют 1 или 2-значный месяц, возвращают разные длины строк, которые я не уверен, как это обойти. Мой код сейчас работает, но остановится работаем в октябре.

например, March отображает 3 / dd / YYYYY вместо 03 / dd / yyyy

другие Примечания: сначала я попытался написать сценарий с помощью WinSCP.com, но я не смог найти способ правильно указать дату.

например, вы можете указать *.zip>=1D или *.zip<=1D, а *.zip=1D или *.zip==1D в настоящее время не поддерживаются с последней версией WinSCP.

код:

$yesterday = [DateTime]::Today.AddDays(-1).ToString("M/dd/yyyy")
# OR I have to use ToString("MM/dd/yyyy") for months 10-12,
# but I need both formats to work.
#delete the temporary file
del .FTPfiles.txt
# Load WinSCP .NET assembly
Add-Type -Path "C:Program Files (x86)WinSCPWinSCPnet.dll"

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Ftp
    HostName = "server.com"
    UserName = "joe"
    Password = "smith"
}

$session = New-Object WinSCP.Session

    try
    {
        # Connect
        $session.Open($sessionOptions)

        $directory = $session.ListDirectory("/Folder")

        foreach ($fileInfo in $directory.Files)
        {
            Write-Output ("{1} {0}" -f
                $fileInfo.Name, $fileInfo.LastWriteTime) >> FTPfiles.txt
        }
        $fileList = get-content .FTPfiles.txt | findstr $yesterday
        $stripped = $fileList -creplace '^.*Z12', 'Z12'


        # Download files
        $remotePath = "/Folder/"
        $transferOptions = New-Object WinSCP.TransferOptions
        $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary

        $lines = $stripped

        foreach ($line in $lines)
        {
            Write-Host ("Downloading {0} ..." -f $line)
            $session.GetFiles($remotePath+$line, "C:Downloads").Check()
        }

    }


catch [Exception]
{
    Write-Host ("Error: {0}" -f $_.Exception.Message)
    exit 1
}
finally
{
    # Disconnect, clean up
    $session.Dispose()
} 

The $fileInfo in $directory.Files пишет время последней записи, а затем имя файла в FTPfiles.txt для всех файлов, содержащихся на FTP сервере из указанной папки. Этот текстовый файл затем считывается, а затем дополнительно сводится только к файлам, которые имеют время записи, которое произошло на вчерашнюю дату, которая в настоящее время работает только 9 месяцев в году из-за формата даты, используя 1 цифру в течение месяца вместо 2 цифр.

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

FROM:
3/14/2017 2:04:00 AM Z1234_20170314050001_1.zip
3/14/2017 3:04:00 AM Z1234_20170315060002_1.zip
3/14/2017 4:04:00 AM Z1234_20170316070001_1.zip
3/14/2017 5:04:00 AM Z1234_20170317080001_1.zip

TO:
Z1234_20170314050001_1.zip
Z1234_20170315060002_1.zip
Z1234_20170316070001_1.zip
Z1234_20170317080001_1.zip

затем скрипт использует эти имена файлов для загрузки необходимых файлов с предыдущего дня.

30
задан Brad
06.05.2023 0:47 Количество просмотров материала 2658
Распечатать страницу

2 ответа

можно использовать верхнее и нижнее ограничение по времени в одной маске файла WinSCP:*>=2017-03-15<2017-03-16

(подразумеваются полуночные времена, вот почему *=2017-03-15 это не то, что вы хотите; а также причина, по которой это не реализовано, так как это не будет никакой пользы)

в PowerShell это можно реализовать следующим образом:

$yesterday = (Get-Date).AddDays(-1)
$yesterday_timestamp = $yesterday.ToString("yyyy-MM-dd")
$today = Get-Date
$today_timestamp = $today.ToString("yyyy-MM-dd")

$transferOptions = New-Object WinSCP.TransferOptions
$file_mask = "*>=$yesterday_timestamp<$today_timestamp"
$transferOptions.FileMask = $file_mask

$session.GetFiles("/Folder/*",  "C:\Downloads\", $False, $transferOptions).Check()

посмотреть статья WinSCP по форматированию временных меток в PowerShell.


хотя вы также можете использовать WinSCP %TIMESTAMP% синтаксис для еще более простой реализации:

$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.FileMask = "*>=%TIMESTAMP-1D#yyyy-mm-dd%<%TIMESTAMP#yyyy-mm-dd%"
$session.GetFiles("/Folder/*",  "C:\Downloads\", $False, $transferOptions).Check()

см. статью WinSCP о Скачать файл.

1
отвечен Martin Prikryl 2023-05-07 08:35

попробуйте эту функцию и передать указанный диапазон дат в параметре StartDate и EndDate

Function Download-Files 
{ 
    [CmdletBinding()] 
    Param 
    ( 
        [Parameter(Mandatory=$true)][Object]$Session, 
        [Parameter(Mandatory=$true)][String]$RemotePath, 
        [Parameter(Mandatory=$true)][String]$LocalPath, 
        [Parameter(Mandatory=$false)][String]$StartDate, 
        [Parameter(Mandatory=$false)][String]$EndDate 
    ) 

    If (-Not (Test-Path -Path $LocalPath -PathType Container)) { 
        New-Item -Path $LocalPath -ItemType Directory 
    } 

    Get-WinSCPChildItem -WinSCPSession $Session -Path $RemotePath | ForEach-Object { 
        If (-not($_.IsThisDirectory) -and -not($_.IsParentDirectory) -and $_.IsDirectory) { 
            Download-Files -Session $Session -RemotePath "$RemotePath$($_.Name)\" -LocalPath "$LocalPath$($_.Name)\" -StartDate $StartDate -EndDate $EndDate 
        } 

        If (-not($_.IsDirectory)) { 
            If ($_.LastWriteTime -ge $StartDate -and $_.LastWriteTime -le $EndDate) { 
                Receive-WinSCPItem -WinSCPSession $Session -Path "$RemotePath$($_.Name)" -Destination $LocalPath 
            } 
        } 
    } 
}

вы можете скачать полный пример кода как загрузить последние файлы в PowerShell с помощью WinSCP

1
отвечен Eric 2023-05-07 10:52

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх