powershellsftpwinscpwinscp-net

Get info on files transferred with WinSCP in PowerShell


I use this script to get file between two dates via WinSCP. How is it possible to print in the console which files were found on the remote computer and which were not because at the moment I am not sure that all the files have been downloaded because it is possible that between the 2 times files are missing. (something like : If I enter date from 05.07.2023 to 07.07.2023 ; and script didn't find on remote computer one or more files return this message in console "File *.log from date x missing on remote computer ; same like "folder $remotefolder exist or not)

# Set up session options
$options = @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = $entry.IP
    UserName = $User
    Password = $Password
    GiveUpSecurityAndAcceptAnySshHostKey = $true
}

try {
    # Set up session options using first password
    $sessionOptions = New-Object WinSCP.SessionOptions -Property $options
    $session = New-Object WinSCP.Session
    # Try Connect
    $session.Open($sessionOptions)
} 
catch {
    # Set up session options using second settings
    $options['HostName'] = $vpnIP
    $options['UserName'] = $User
    $options['Password'] = $Password
    try {
        $sessionOptions = New-Object WinSCP.SessionOptions -Property $options
        $session = New-Object WinSCP.Session
        # Try Connect
        $session.Open($sessionOptions)
    }
    catch {
        Write-Error "Could not open WinSCP session: $($_.Exception.Message)"
        throw
    }
}

# Date 1 START
do {
    $date = $null
    $today = Read-Host -Prompt ('Enter START date (inclusive) (e.g. {0}) [yyyy.MM.dd]' -f (Get-Date -Format "yyyy.MM.dd"))

    try {
        $date = Get-Date -Date $today -Format "yyyy-MM-dd" -ErrorAction Stop
        '[OK] {0} Valid date - OK!' -f $date
    }
    catch {
        '[X] {0} Invalid date!' -f $today
    }
}
until ($date)

# Date 2 STOP

do {
    $date1 = $null
    Write-Host "Add +1 day" -ForegroundColor Red
    $today1 = Read-Host -Prompt ('Enter END date (exclusive) (e.g. {0}) [yyyy.MM.dd]' -f (Get-Date -Format "yyyy.MM.dd"))

    try {
        $date1 = Get-Date -Date $today1 -Format "yyyy-MM-dd" -ErrorAction Stop
        '[OK] {0} Valid date - OK!' -f $date1
    }
    catch {
        '[X] {0} Invalid date!' -f $today1
    }
}
until ($date1)

# ----- Date END

$session = New-Object WinSCP.Session

$file = "*.log"
$localPath = "\temp_files" 
$remotePath = "/C:/log", "/C:/Back_up"

try {
    # Connect
    $session.Open($sessionOptions)

    # Check exists folder
    foreach ($remotePath in $remotePath)
{
    if ($session.FileExists($remotePath))
    {
        Write-Host "[OK] Folder '$remotePath' exist" -ForegroundColor Green

            # Transfer file
        Write-Host "[i] '$date' - '$date1' > '$inputID' downloading..." -ForegroundColor Cyan

    $session.GetFilesToDirectory($remotePath, $localPath, "*.log>=$date<=$date1").Check();

    }
    else
    {
        Write-Host "[X] INFO: Folder: '$remotePath' doesn't exist" -ForegroundColor Red
        }
    }
}
finally {
    $session.Dispose()
}

Thank you,


Solution

  • Use the code from the basic WinSCP PowerShell download example:

    $transferResult =
        $session.GetFilesToDirectory($remotePath, $localPath, "*.log>=$date<=$date1")
    
    # Throw on any error
    $transferResult.Check()
    
    # Print results
    foreach ($transfer in $transferResult.Transfers)
    {
        Write-Host "Download of $($transfer.FileName) succeeded"
    }
    

    Your follow-up question:
    Check if WinSCP downloaded files for every day between two dates