如何让WinSCP脚本显示两日期间每日日志文件的存在状态
实现WinSCP脚本逐个日期检查并下载日志,同时反馈缺失情况
以下是修改后的脚本,会遍历指定日期区间内的每一天,检查远程机器上对应日期的日志文件是否存在,下载存在的日志,并在控制台输出成功下载的日期列表和缺失日期的警告:
# Set up session options $options = @{ Protocol = [WinSCP.Protocol]::Sftp HostName = $entry.IP UserName = $User Password = $Password GiveUpSecurityAndAcceptAnySshHostKey = $true } $session = $null try { # Set up session options using first connection settings $sessionOptions = New-Object WinSCP.SessionOptions -Property $options $session = New-Object WinSCP.Session $session.Open($sessionOptions) } catch { # Fallback to VPN connection settings $options['HostName'] = $vpnIP $sessionOptions = New-Object WinSCP.SessionOptions -Property $options $session = New-Object WinSCP.Session try { $session.Open($sessionOptions) } catch { Write-Error "无法打开WinSCP会话: $($_.Exception.Message)" throw } } # 获取起始日期(包含) do { $startDate = $null $inputStart = Read-Host -Prompt "请输入起始日期(包含),格式如 $(Get-Date -Format "yyyy.MM.dd") [yyyy.MM.dd]" try { $startDate = Get-Date -Date $inputStart -ErrorAction Stop "[OK] 日期 $($startDate.ToString("yyyy.MM.dd")) 有效!" } catch { "[X] 输入的日期 '$inputStart' 无效,请重新输入!" } } until ($startDate) # 获取结束日期(不包含) do { $endDate = $null Write-Host "注意:结束日期为**不包含**,如需下载到30.06,请输入01.07" -ForegroundColor Red $inputEnd = Read-Host -Prompt "请输入结束日期(不包含),格式如 $(Get-Date -Format "yyyy.MM.dd") [yyyy.MM.dd]" try { $endDate = Get-Date -Date $inputEnd -ErrorAction Stop if ($endDate -le $startDate) { "[X] 结束日期必须晚于起始日期,请重新输入!" $endDate = $null } else { "[OK] 日期 $($endDate.ToString("yyyy.MM.dd")) 有效!" } } catch { "[X] 输入的日期 '$inputEnd' 无效,请重新输入!" } } until ($endDate) # 配置参数 $localPath = "\temp_files" $remotePaths = "/C:/log", "/C:/Back_up" # 请根据远程日志文件名的日期格式修改此处,比如日志名为2024.06.25.log则用"yyyy.MM.dd",如果是log_20240625.log则用"yyyyMMdd" $remoteDatePattern = "yyyy.MM.dd" # 日志文件名匹配规则,比如日志是日期开头则用"$datePattern*.log",如果是包含日期则用"*$datePattern*.log" $fileMatchPattern = "*{0}*.log" # 初始化记录数组 $successDates = @() $missingDates = @() try { # 遍历日期区间内的每一天 $currentDate = $startDate while ($currentDate -lt $endDate) { $dateStr = $currentDate.ToString($remoteDatePattern) $filePattern = $fileMatchPattern -f $dateStr $fileFound = $false # 遍历所有远程路径查找日志 foreach ($remotePath in $remotePaths) { if ($session.FileExists($remotePath)) { $remoteFilePath = Join-Path $remotePath $filePattern # 检查路径下是否存在匹配的日志文件 $files = $session.EnumerateFiles($remotePath, $filePattern) if ($files.Count -gt 0) { # 下载找到的日志文件 $transferResult = $session.GetFiles($remoteFilePath, (Join-Path $localPath "*")) $transferResult.Check() $successDates += $dateStr $fileFound = $true break # 找到后停止遍历其他路径 } } else { Write-Host "[X] 远程路径 '$remotePath' 不存在" -ForegroundColor Red } } if (-not $fileFound) { $missingDates += $dateStr } # 日期递增一天 $currentDate = $currentDate.AddDays(1) } # 输出结果 if ($successDates.Count -gt 0) { Write-Host "`n$($successDates -join ',') log downloaded successfully" -ForegroundColor Green } if ($missingDates.Count -gt 0) { foreach ($missingDate in $missingDates) { Write-Host "[!] warning $missingDate log doesn't exist on remote machine!" -ForegroundColor Yellow } } } finally { # 确保会话释放 if ($session -ne $null) { $session.Dispose() } }
关键修改说明
- 日期遍历逻辑:将原脚本的批量日期筛选改为逐个日期遍历,确保能精准检查每一天的日志存在性
- 文件匹配规则:新增
$remoteDatePattern和$fileMatchPattern两个变量,你需要根据实际远程日志文件名的格式调整这两个参数,比如:- 如果日志文件名为
2024.06.25_system.log,则$remoteDatePattern = "yyyy.MM.dd",$fileMatchPattern = "*{0}*.log" - 如果日志文件名为
log_20240625.log,则$remoteDatePattern = "yyyyMMdd",$fileMatchPattern = "*{0}*.log"
- 如果日志文件名为
- 结果记录与输出:用数组记录成功下载和缺失的日期,最后统一输出结果,符合你要求的格式
- 会话优化:修复了原脚本重复创建WinSCP会话的问题,确保会话资源正确释放
- 日期校验增强:增加了结束日期必须晚于起始日期的校验,避免无效输入
内容的提问来源于stack exchange,提问作者SySx
相关产品推荐
相关产品推荐

