Пакетная загрузка файла с помощью сборки WinSCP .NET останавливается, если загрузка одного файла не удалась.

Я использую WinSCP для подключения к FTP и загрузки нескольких файлов, но у меня возникают проблемы, когда файл не загружается, когда это происходит, сценарий останавливается, и следующие файлы не загружаются. В основном я использую код из документации WinSCP

# Conectar
$session.Open($sessionOptions)

#Upload files
$transferResult = $session.PutFiles($origenSubida, $destinoSubida)

# Resultados de cada archivo
foreach ($transfer in $transferResult.Transfers)
{
    #looks if upload is correct
    if ($transfer.Error -eq $Null)
    {
        LogWrite ("$(Get-Date) upload complete {0} , changing folder" -f $transfer.FileName) 
        Move-Item $transfer.FileName $rutaArchivos
    }
    else
    {
        LogWrite ("$(Get-Date) Upload of {0} has failed: {1}" -f $transfer.Filename, $transfer.Error.Message)
    }
}

Неожиданное поведение следующее:

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

Я не уверен, что я что-то упускаю из виду, разве сценарий не должен продолжаться, даже если он ничего не может сделать с файлом3? Я не уверен, есть ли другой способ сделать загрузку одного файла неудачной.


person Nth    schedule 25.05.2017    source источник


Ответы (1)


Если вам нужна настраиваемая обработка ошибок, вам нужно зациклить файлы самостоятельно.

$localPath = "C:\local\path"
$remotePath = "/remote/path/"

$localFiles = Get-ChildItem -Path $localPath

foreach ($localFile in $localFiles)
{
    Write-Host "Uploading $($localFile.FullName)..."
    $sourcePath = [WinSCP.RemotePath]::EscapeFileMask($localFile.FullName)
    $transferResult = $session.PutFiles($sourcePath, $remotePath)

    if (!$transferResult.IsSuccess)
    {
        # Print error (but continue with other files)
        Write-Host ("Error upload file $($localFile.FullName): " +
            "$($transferResult.Failures[0].Message)")
    }    
}

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

person Martin Prikryl    schedule 25.05.2017