Post a reply

Before posting, please read how to report bug or request support effectively.

Bug reports without an attached log file are usually useless.

Options
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)

Options

Topic review

martin

Thanks for your donation. And good luck to Ukraine!
maysky

Thanks for your quick replies and great product.
Pls forgive me the rudeness.
I know that the smallest donation possible is $9.
Made an even smaller for $1.98.
That's all I can do here in Ukraine.
My Best Wishes for you)
martin

Looks good.
Regarding one-liner. Well, that's a PowerShell question, not a WinSCP question.
Why do you need one-liner?
Anyway, this should do (untested):
$synchronizationResult = $session.SynchronizeDirectories([WinSCP.SynchronizationMode]::Remote, $localPath, $remotePath, $False, $False, [WinSCP.SynchronizationCriteria]::None, New-Object New-Object WinSCP.TransferOptions -Property @{ ResumeSupport = New-Object WinSCP.TransferResumeSupport -Property @{ State = [WinSCP.TransferResumeSupportState]::On } } )
maysky

Sorry for such a long delay in conversation.
Did I got it right?
$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.ResumeSupport.State = [WinSCP.TransferResumeSupportState]::On
 
$synchronizationResult = $session.SynchronizeDirectories([WinSCP.SynchronizationMode]::Remote, $localPath, $remotePath, $False, $False, [WinSCP.SynchronizationCriteria]::None, $transferOptions)

If yes, is it possible to make a one-liner instead of 3 lines of code?
maysky

Sorry. I'll try to keep it simple.
I want to upload files and
1) if the file is not on destination or not fully uploaded, then it should be uploaded
2) if the file is already on destination then it won't be touched even if we have the file with the same name but with other content on the source.
3) no files should be deleted on the destination.
martin

Re: Cryptolocker defense

Sorry, I do not understand what you ask us for.

maysky wrote:

In this case, if the file is not fully loaded due to error it is placed as *._filename which is ok.

I not see anything in your code that would rename the files. Or are you actually asking how to rename files that fail to upload?
maysky

CryptoLocker defense

Hello.

I made a script to sync local files to the remote server via scp to have a backup in case of some CryptoLocker (CL) will encode my files. My files are SQL server backups, so once they created, they will never change. Synchronization starts every 15 mins, so there is not much time to stop the process in case some become crypted.
CryptoLocker software may or may not change the file extension.
So the idea was to sync the files, but delete files older than X days on the destination as the second step.
Part of the script:
# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = $HostName
    UserName = $UserName
    Password = $Password
    SshHostKeyFingerprint = $SshHostKeyFingerprint
}
$session = New-Object WinSCP.Session
try
{
    # Connect
    $session.Timeout = New-TimeSpan -Seconds 120
    $session.Open($sessionOptions)
 
    # Syncronize
    $synchronizationResult = $session.SynchronizeDirectories(
        [WinSCP.SynchronizationMode]::Remote, $localPath, $remotePath, $False)
 
    $files = $session.EnumerateRemoteFiles($remotePath, $wildcard, [WinSCP.EnumerationOptions]::AllDirectories)
 
    # Find old files
    $limit = (Get-Date).AddDays($oldDate)
 
    $oldFiles =
        $files |
        Where-Object { -Not $_.IsDirectory } |
        Where-Object { $_.LastWriteTime -lt $limit }
 
    # Delete them
    foreach ($oldFileInfo in $oldFiles)
    {
       $session.RemoveFiles($oldFileInfo.FullName).Check()
    }
 
}
finally
{
    # Disconnect, clean up
    $session.Dispose()
}
 
exit 0

In this case, if the file is not fully loaded due to error it is placed as *._filename which is ok. It helps to retry the upload next time. But when the file is fully uploaded I don't want it to be rewritten in case it changed on the source. How can i achieve such behaviour?