使用WinSCP从SFTP服务器下载比X天更新的文件,跳过不包含任何匹配文件的文件夹
问题描述:
我仅限于PuTTY和WinSCP。使用WinSCP从SFTP服务器下载比X天更新的文件,跳过不包含任何匹配文件的文件夹
我想下载包含日志文件的日志目录。例如,我想抓取6天或更新的所有log_files
。 log_dir2
和log_dir3
包括符合条件的文件夹,而log_dir1
及其文件没有。
DIR/log_dir1/log_files % older than 6 days
DIR/log_dir2/log_files % meets criteria
DIR/log_dir3/log_files % meets criteria
我的问题是,而log_dir1
的log_files
不被下载,语法我目前使用的下载文件夹log_dir1
。通常情况下,这并不是什么大问题,但我们正在谈论数百个log_dir
文件夹(全部为空,因为文件大于6天)。由于我无法控制的原因,我无法将这些旧的日志目录与其日志文件进行移动或归档。
我的问题很简单,我该如何更改语法以忽略超过6天的文件夹以及文件。
get -filemask="*>6D" /DIR/* C:\temp
我已经试过的参数几个不同的组合,我看了一下目录口罩和面具的路径支持页面。我不能让他们中的任何人工作(版本问题?)。任何人都可以解释他们的语法比help page更好。我将在明天使用当前版本的WinSCP进行更新。
答
Time constraint in WinSCP file mask不能用于目录。
但是你可以在PowerShell script with a use of WinSCP .NET assembly轻松地实现这个自定义逻辑:
# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"
# Set up session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "example.com"
UserName = "username"
Password = "password"
SshHostKeyFingerprint = "..."
}
$remotePath = "/remote/path"
$localPath = "C:\local\path"
$limit = (Get-Date).AddDays(-6)
$session = New-Object WinSCP.Session
# Connect
$session.Open($sessionOptions)
# Enumerate files to download
$fileInfos =
$session.EnumerateRemoteFiles(
$remotePath, $Null, [WinSCP.EnumerationOptions]::AllDirectories) |
Where-Object { $_.LastWriteTime -gt $limit }
foreach ($fileInfo in $fileInfos)
{
$localFilePath =
[WinSCP.RemotePath]::TranslateRemotePathToLocal(
$fileInfo.FullName, $remotePath, $localPath)
# If the corresponding local folder does not exist yet, create it
$localFileDir = Split-Path -Parent $localFilePath
if (!(Test-Path -Path $localFileDir))
{
Write-Host "Creating local directory $localFileDir..."
New-Item $localFileDir -ItemType directory | Out-Null
}
Write-Host "Downloading file $($fileInfo.FullName)..."
# Download file
$sourcePath = [WinSCP.RemotePath]::EscapeFileMask($fileInfo.FullName)
$transferResult = $session.GetFiles($sourcePath, $localFilePath)
# Did the download succeeded?
if (!$transferResult.IsSuccess)
{
# Print error (but continue with other files)
Write-Host ("Error downloading file ${remoteFilePath}: " +
$transferResult.Failures[0].Message)
}
}
$session.Dispose()
Write-Host "Done."
运行脚本(download.ps1
),如:
powershell.exe -ExecutionPolicy Unrestricted -File download.ps1
在WinSCP赋予文件屏蔽时间限制,不能用于目录 - 你究竟想要什么?你真的想根据他们的时间戳选择文件夹吗?这可靠吗?或者你想跳过不包含任何新文件的文件夹? –
嗯。至少我想跳过不包含比6天更新的文件的文件夹。上面的语法给我正确的文件,但也是所有的文件夹(也是空的)。 – James
是的。我提出了你的答案,但由于新的帐户,它不反映马丁。谢谢! – James