如何通过SFTP按文件最后修改日期从远程服务器获取对应文件
解决方案
你当前使用的Get-SCPFolder命令不支持直接按文件修改日期筛选,需要调整逻辑为「先枚举远程文件->按修改时间过滤->仅下载符合条件的文件」,基于Posh-SSH模块即可实现需求。
前置要求
首先确保已安装Posh-SSH模块,执行以下命令安装:
Install-Module -Name Posh-SSH -Scope CurrentUser
修改后的完整脚本
# 提前配置基础参数 $ComputerName = "远程服务器地址" $RemoteLogFolder = "远程文件目录路径" $LocalLogFolder = "本地保存目录路径" $credentials = Get-Credential -Message "输入远程服务器登录账号密码" $TodaysDate = Get-Date -UFormat "%d.%m.%Y %R" function Read-Date { param( [String] $prompt ) $result = $null do { $s = Read-Host $prompt if ( $s ) { try { $result = Get-Date $s break } catch [Management.Automation.PSInvalidCastException] { Write-Host "日期格式无效,请重新输入" } } else { break } } while ( $true ) $result } Write-Host "当前日期: $TodaysDate" $startDate = Read-Date "请输入开始日期(留空则不限制开始时间)" $endDate = Read-Date "请输入结束日期(留空则不限制结束时间)" # 建立SFTP会话 $sftpSession = New-SFTPSession -ComputerName $ComputerName -Credential $credentials # 获取远程目录下所有文件,需要递归子目录则添加 -Recurse 参数 $remoteFiles = Get-SFTPChildItem -SessionId $sftpSession.SessionId -Path $RemoteLogFolder -File # 按最后修改日期筛选文件 $filteredFiles = $remoteFiles | Where-Object { ($null -eq $startDate -or $_.LastWriteTime -ge $startDate) -and ($null -eq $endDate -or $_.LastWriteTime -le $endDate) } Write-Host "找到符合条件的文件共$($filteredFiles.Count)个,开始下载..." # 批量下载筛选后的文件 foreach ($file in $filteredFiles) { $localSavePath = Join-Path -Path $LocalLogFolder -ChildPath $file.Name Get-SFTPItem -SessionId $sftpSession.SessionId -Path $file.FullName -Destination $localSavePath -Force Write-Host "已完成下载:$($file.Name)" } # 释放SFTP连接 Remove-SFTPSession -SessionId $sftpSession.SessionId Write-Host "全部符合条件的文件下载完成"
注意事项
- 如果远程服务器时区和本地时区不一致,需要先将获取到的
LastWriteTime属性转换为本地时区后再做日期对比,避免筛选误差 - 如果需要保留远程目录的层级结构下载,可以在筛选文件后,对应创建本地子目录再保存文件
- 如果远程文件数量较多,可以给
Get-SFTPChildItem加上筛选参数减少枚举量
内容的提问来源于stack exchange,提问作者user12428212
相关产品推荐
相关产品推荐

