Exclude Dir with Powershell

Advertisement

jtelling325
Guest

Exclude Dir with Powershell

I have the built-in extension "KeepLocalUpToDate.ps1" working to sync my remote dir to my local, but I was wondering how to exclude a few dirs that I do not want sync'd. This is what I have now:

# @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      5
# @homepage     https://winscp.net/eng/docs/library_example_keep_local_directory_up_to_date
# @require      WinSCP 5.12
# @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 = "*MY-SESSION-URL*",
    $localPath = "D:\Source",
    $remotePath = "/downloads",
    [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-ChildItem -Recurse -Path $localPath
    }
 
    try
    {
        $session.SessionLogPath = $sessionLogPath
 
        Write-Host "Connecting..."
        $session.Open($sessionOptions)
 
        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-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

Reply with quote

Advertisement

Advertisement

You can post new topics in this forum