Post a reply

Add an Attachment

If you do not want to add an Attachment to your Post, please leave the Fields blank.

(maximum 10 MB; please compress large files; only common media, archive, text and programming file formats are allowed)


Topic review


Re: Not all synced files in $synchronizationResult.Uploads (powershell) if remote subdir not exist

You've done a great job! Problem solved, many thanks!!

I like WinSCP and the powershell library very much.

Not all synced files in $synchronizationResult.Uploads (powershell) if remote subdir not exist

I am new to WinSCP, but found the following (bug?):
I have modified this script: Deleting remote files after successful remote to local synchronization
to do it the other way around(upload).
It is working OK IF the destination directories already exists, but if not, ONE file in each directory (except in the latest directory) is missing in $synchronizationResult.Uploads, so that file will not be deleted from source directory. The synchronisation was OK, all files done. What's wrong?
My test source directory is C:\...\Postbus UIT\Test1\Test2\Test3
files in Postbus UIT: Test0.txt; Thimo 2015 Postvak_LUIT - Copy.jpg; Thimo 2015 Postvak_LUIT.jpg
files in Test1: Test1.txt; Thimo 2015 Postvak_LUIT_TEST2 - Copy.jpg; Thimo 2015 Postvak_LUIT_TEST2.jpg
files in Test2: Test2.txt; Thimo 2015 Postvak_LUIT_TEST_TEST - Copy.jpg; Thimo 2015 Postvak_LUIT_TEST_TEST.jpg
files in Test3: Test3.txt; Thimo 2015 Postvak_LUIT_TEST_TEST - Copy.jpg; Thimo 2015 Postvak_LUIT_TEST_TEST.jpg
After running the script: Test0.txt, Test1.txt, Test2.txt still exist in source directory.

It looks to be, that if the sync operation have to create a remote-directory, one file is missing/skipped in $synchronizationResult.Uploads????
Running latest version 5.13.6.

Any idea?

param (
    $localPath = "C:\TEMP\WinSCP_Test\Data\Postvak UIT\",
    $remotePath = "/Postvak IN/",
    $LogFile_Session = "C:\TEMP\SessionLogX.log"
    # Load WinSCP .NET assembly
    Add-Type -Path "C:\TEMP\WinSCP_Test\WinSCPnet.dll"
    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::Sftp
        HostName = ""
        UserName = ""
        Password = ""
        SshHostKeyFingerprint = ""
    $session = New-Object WinSCP.Session
    $session.SessionLogPath = $LogFile_Session
        # Connect
        # Synchronize files to local directory, collect results
        $synchronizationResult = $session.SynchronizeDirectories(
            [WinSCP.SynchronizationMode]::Remote, $localPath, $remotePath, $false,[WinSCP.SynchronizationCriteria]::Time)
        # Deliberately not calling $synchronizationResult.Check
        # as that would abort our script on any error.
        # We will find any error in the loop below
        # (note that $synchronizationResult.Uploads is the only operation
        # collection of SynchronizationResult that can contain any items,
        # as we are not removing nor uploading anything)
        # Iterate over every Upload
        foreach ($Upload in $synchronizationResult.Uploads)
            # Success or error?
            Write-Host "==== Upload of $($Upload.FileName) ==="
            if ($Upload.Error -eq $Null)
                Write-Host "Download of $($Upload.FileName) succeeded, removing from source"
                # Download succeeded, remove file from source
                $filename = [WinSCP.RemotePath]::EscapeFileMask($Upload.FileName)
                if( -not $? )
                    Write-Host "Removing of file $($Upload.FileName) failed"
                    Write-Host "Removing of file $($Upload.FileName) succeeded"
                Write-Host (
                    "Upload of $($Upload.FileName) failed: $($Upload.Error.Message)")
        # Disconnect, clean up
    exit 0
    Write-Host "Error: $($_.Exception.Message)"
    exit 1