You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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()
    }
}

关键修改说明

  1. 日期遍历逻辑:将原脚本的批量日期筛选改为逐个日期遍历,确保能精准检查每一天的日志存在性
  2. 文件匹配规则:新增$remoteDatePattern和$fileMatchPattern两个变量,你需要根据实际远程日志文件名的格式调整这两个参数,比如:
    • 如果日志文件名为2024.06.25_system.log,则$remoteDatePattern = "yyyy.MM.dd",$fileMatchPattern = "*{0}*.log"
    • 如果日志文件名为log_20240625.log,则$remoteDatePattern = "yyyyMMdd",$fileMatchPattern = "*{0}*.log"
  3. 结果记录与输出:用数组记录成功下载和缺失的日期,最后统一输出结果,符合你要求的格式
  4. 会话优化:修复了原脚本重复创建WinSCP会话的问题,确保会话资源正确释放
  5. 日期校验增强:增加了结束日期必须晚于起始日期的校验,避免无效输入

内容的提问来源于stack exchange,提问作者SySx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:25:06