I have this script to collect logs file between two dates. Normally I have logs created for everyday on remote machine but is there any possibility to show what file exist or not?
For example If I try to download file between two dates 25.06 - 30.06 and on remote machine doesn't exist log from 28.06 print in console.
25.06,26.06,27.06,29.06,30.06 log downloaded successfully
[!] warning 28.06 log doesn't exist on remote machine!
# 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.
You can analyze the list of transferred files returned by Session.GetFilesToDirectory
to find out if there any download for all days in the range (you know that already).
But imo, way easier would be to go day-by-day, downloading respective day logs separately and simply checking, if any log was downloaded at all.
$d = $date
while ($d -le $date1)
{
$f = "yyyy-MM-dd"
$start = $d.ToString($f)
$end = $d.AddDays(1).ToString($f)
$mask = "*.log>=$start<$end"
Write-Host "Downloading logs for $start..."
$transferResult = $session.GetFilesToDirectory($remotePath, $localPath, $mask)
$transferResult.Check()
$c = $transferResult.Transfers.Count
if ($c -gt 0)
{
Write-Host "$c logs for $start were downloaded"
}
else
{
Write-Host "NO logs for $start were downloaded"
}
$d = $d.AddDays(1)
}
The code assumes that $date
and $date1
are actual DateTime
objects, not strings. So you need to remove the -Format "yyyy-MM-dd"
from the Get-Date
calls.