当单个文件上载失败时,使用 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 未上传。

不确定我是否忽略了什么,即使它不能对 file3 做任何事情,脚本也不应该继续吗?我不确定是否有另一种方法可以使单个文件的上传失败。

如果你想要一个自定义的错误处理,可以自己循环文件。

$localPath = "C:localpath"
$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)")
    }    
}
<小时 />

另一种选择是处理Session.QueryReceived事件。

<小时 />

这两个选项在:
使用自定义错误处理递归下载目录树

最新更新