-download all files from folder in REMOTE folder, and EXCLUDE subfolders to LOCAL and delete on remote after success transfer
See
https://winscp.net/eng/docs/faq_delete_synchronized_files
https://winscp.net/eng/docs/faq_script_non_recursive
So i took your Extension "Keep Local Drectory Up to Date and modified it by adding
-delete after the Get in the code, is the below correct ???
# @name &Keep Local Directory up to Date...
# @command powershell.exe -ExecutionPolicy Bypass -File "%EXTENSION_PATH%" -sessionUrl "!S" -localPath "%LocalPath%" -remotePath "%RemotePath%" %Delete% %Beep% %ContinueOnError% -interval "%Interval%" -pause -sessionLogPath "%SessionLogPath%"
# @description Periodically scans for changes in a remote directory and reflects them on a local directory
# @version 4
# @homepage
https://winscp.net/eng/docs/library_example_keep_local_directory_up_to_date
# @require WinSCP 5.9.2
# @option - -run group "Directories"
# @option RemotePath -run textbox "&Watch for changes in the remote directory:" "!/"
# @option LocalPath -run textbox "... &and automatically reflect them on the local directory:" "!\"
# @option - -config -run group "Options"
# @option Delete -config -run checkbox "&Delete files" "" -delete
# @option Beep -config -run checkbox "&Beep on change" "" -beep
# @option ContinueOnError -config -run checkbox "Continue on &error" "" -continueOnError
# @option Interval -config -run textbox "&Interval (in seconds):" "30"
# @option - -config group "Logging"
# @option SessionLogPath -config sessionlogfile
# @optionspage
https://winscp.net/eng/docs/library_example_keep_local_directory_up_to_date#options
param (
# Use Generate Session URL function to obtain a value for -sessionUrl parameter.
$sessionUrl = "sftp://user:mypassword;fingerprint=ssh-rsa-xx-xx-xx@example.com/",
[Parameter(Mandatory = $True)]
$localPath,
[Parameter(Mandatory = $True)]
$remotePath,
[Switch]
$delete,
[Switch]
$beep,
[Switch]
$continueOnError,
$sessionLogPath = $Null,
$interval = 30,
[Switch]
$pause
)
try
{
# Load WinSCP .NET assembly
$assemblyPath = if ($env:WINSCP_PATH) { $env:WINSCP_PATH } else { $PSScriptRoot }
Add-Type -Path (Join-Path $assemblyPath "WinSCPnet.dll")
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.ParseUrl($sessionUrl)
$session = New-Object WinSCP.Session
# Optimization
# (do not waste time enumerating files, if you do not need to scan for deleted files)
if ($delete)
{
$localFiles = Get-delete-ChildItem -Recurse -Path $localPath
}
try
{
$session.SessionLogPath = $sessionLogPath
Write-Host "Connecting..."
$session.Open($sessionOptions)
TransferOptions transferOptions = new TransferOptions();
transferOptions.FileMask = "|*/";
while ($True)
{
Write-Host "Synchronizing changes..."
$result =
$session.SynchronizeDirectories(
[WinSCP.SynchronizationMode]::Local, $localPath, $remotePath, $delete)
$changed = $False
if (!$result.IsSuccess)
{
if ($continueOnError)
{
Write-Host "Error: $($result.Failures[0].Message)"
$changed = $True
}
else
{
$result.Check()
}
}
# Print updated files
foreach ($download in $result.Downloads)
{
Write-Host "$($download.Destination) <= $($download.FileName)"
$changed = $True
}
if ($delete)
{
# scan for removed local files (the $result does not include them)
$localFiles2 = Get-delete-ChildItem -Recurse -Path $localPath
if ($localFiles)
{
$changes =
Compare-Object -DifferenceObject $localFiles2 `
-ReferenceObject $localFiles
$removedFiles =
$changes |
Where-Object -FilterScript { $_.SideIndicator -eq "<=" } |
Select-Object -ExpandProperty InputObject
# Print removed local files
foreach ($removedFile in $removedFiles)
{
Write-Host "$removedFile deleted"
$changed = $True
}
}
$localFiles = $localFiles2
}
if ($changed)
{
if ($beep)
{
[System.Console]::Beep()
}
}
else
{
Write-Host "No change."
}
Write-Host "Waiting for $interval seconds, press Ctrl+C to abort..."
$wait = [int]$interval
# Wait for 1 second in a loop, to make the waiting breakable
while ($wait -gt 0)
{
Start-Sleep -Seconds 1
$wait--
}
Write-Host
}
}
finally
{
Write-Host "Disconnecting..."
# Disconnect, clean up
$session.Dispose()
}
}
catch
{
Write-Host "Error: $($_.Exception.Message)"
}
# Pause if -pause switch was used
if ($pause)
{
Write-Host "Press any key to exit..."
[System.Console]::ReadKey() | Out-Null
}
# Never exits cleanly
exit 1
my only issue is that im trying to read and comprehend the code, $delete appears twice
from my understanding
if the setting delete is enabled then the function will run is this correct ?
This is found on line 52, and is the first statement after openning session.
if ($delete)
{
$localFiles = Get-delete-ChildItem -Recurse -Path $localPath
}
Also there's another $delete found on line 95, so is this where the setting is enabled it will run this function ??
im new to coding and have experience in VBA so i am able to comprehend some things.
if ($delete)
{
# scan for removed local files (the $result does not include them)
$localFiles2 = Get-delete-ChildItem -Recurse -Path $localPath
if ($localFiles)
{
$changes =
Compare-Object -DifferenceObject $localFiles2 `
-ReferenceObject $localFiles
$removedFiles =
$changes |
Where-Object -FilterScript { $_.SideIndicator -eq "<=" } |
Select-Object -ExpandProperty InputObject
# Print removed local files
foreach ($removedFile in $removedFiles)
{
Write-Host "$removedFile deleted"
$changed = $True
}
}
$localFiles = $localFiles2
}