【问题标题】:I Have erratic file transfers with Powershell, FileSytemWatcher and WinSCP我使用 Powershell、FileSytemWatcher 和 WinSCP 进行了不稳定的文件传输
【发布时间】:2019-12-16 12:17:00
【问题描述】:

我的 PowerShell 脚本将文件放入 ESB 时遇到问题。 通常它会起作用,但并非总是如此,尤其是在大文件时会出错。有没有人看到我的脚本中的错误或解决/解决我的问题的方法?

注意:

  • 恢复支持不是一个选项,因为我没有更改权限。
  • 使用“WinSCP GUI”我成功地上传了大文件。 (恢复支持关闭)
  • 监视包含要上传文件的目录以创建文件,然后将文件复制到单独的文件夹以进行上传。上传成功后,文件被删除(从第二个文件夹)。
  • 我是 PowerShell 的初学者,所以可能有错误的原因。英语也不是我的母语,如有错误请见谅。

脚本在TaskScheduler中启动:

    Powershell.exe -NoExit -File "script.ps1"

这是脚本:

    $folder = 'Original_Folder'
    $filter = '*.xml'                             
    $destination = 'CopyTo_Folder'
    $fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
    IncludeSubdirectories = $false              
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    }
    $onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
    $path = $Event.SourceEventArgs.FullPath
    $name = $Event.SourceEventArgs.Name
    $changeType = $Event.SourceEventArgs.ChangeType
    $timeStamp = $Event.TimeGenerated
    Write-Host "$timeStamp The file '$name' was $changeType and copied for SFTP to $destination"
    "$timeStamp The file '$name' was $changeType and copied for SFTP to $destination" | Set-Content 'Powershell_Script.log'
    Copy-Item $path -Destination $destination -Force -Verbose

    # Load WinSCP .NET assembly
    Add-Type -Path "C:\Program Files (x86)\WinSCP_5_11_3\WinSCPnet.dll"

    # Set up session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = "ftp-server"
    UserName = "User account"
    Password = "User password"
    SshHostKeyFingerprint = "ssh-rsa bla bla"
    }

    $sessionOptions.AddRawSettings("FSProtocol", "2")

    $session = New-Object WinSCP.Session
    $Session.SessionLogPath="WinSCP.log"
    try
    {
        # Connect
        $session.Open($sessionOptions)

        # Upload files

            # Set up transfer options
            $transferOptions = New-Object WinSCP.TransferOptions -Property @{
            ResumeSupport = New-Object WinSCP.TransferResumeSupport -Property @{ State = [WinSCP.TransferResumeSupportState]::Off }
            }

            # Upload with transferoptions and delete original when succesfull    
            $transferResult=$session.PutFiles("CopyTo_Folder\*", "/Upload_Folder on ftp-server/", $True, $transferOptions)

            # Throw on any error
            $transferResult.Check()

            # Print results
            foreach ($transfer in $transferResult.Transfers)
            {
                Write-Host "Upload of $($transfer.FileName) succeeded"
                "$timeStamp The file $($transfer.FileName) was successfully uploaded" | Add-Content 'Powershell_Script.log'
            }

    }
    finally
    {
        $session.Dispose()
    }
    }

【问题讨论】:

  • 出现错误怎么办?部分文件传输?文件完全坏了?什么都没发生?
  • 感谢您回答 vonPryz。有时会传输部分文件并且缺少部分内容。屏幕输出什么也没说,就好像它仍在监视一样。顺便说一下,脚本的启动方式是:Powershell.exe -NoExit -File "script.ps1"
  • 向我们显示有问题的会话的 WinSCP 会话日志文件 (Session.SessionLogPath)。
  • 我很想,但是当文件没有完成时,没有日志。我想脚本挂起。
  • 是否有日志文件,何时上传有效?如果有,那么在上传文件的一部分时,还必须有一个日志文件。 -- 没有日志的唯一情况是脚本甚至没有到达Open 调用 - 或者日志永远无法正常工作。

标签: powershell upload filesystemwatcher winscp


【解决方案1】:

我似乎已经解决了这个问题。

在暂停之间进行复制操作时,它可以正常工作

所以:

    Start-Sleep -s 30
    Copy-Item $path -Destination $destination -Force -Verbose
    Start-Sleep -s 30

FileSystemWatcher 会像预期的那样立即行动吗?因此,文件在未完全创建时被复制。在复制命令之后,上传将立即开始,所以我也在那里暂停,以便复制操作可以在上传开始之前完成。

最好也监控这些动作,并在动作完成后让脚本恢复。虽然我不知道是否可以使用 FSW 创建文件...

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2019-11-01
    • 2021-02-11
    • 2012-03-05
    • 2016-03-12
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多