目标:我试图得到所有的文件,是1天或更新的。远程目录有很多目录和根目录上的文件。
我需要查看每个目录,获取任何1天前的文件,以及根目录1天前的任何文件,并将所有这些文件传输到1个单一目录。我不想复制任何空目录,或任何目录与旧的文件超过1天。
当前代码只是继续运行,不传输任何文件。我不确定是否正确设置了foreach
以及GetFiles
部分。
为了满足上面列出的文件要求,GetFiles
部分需要说什么?
下面是它看起来的一个例子:
代码:
# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"
# Set up session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::ftp
HostName = "ftp site"
UserName = "UserName"
Password = "Password"
SshHostKeyFingerprint = "stuff"
}
$sessionOptions.AddRawSettings("FSProtocol", "2")
$session = New-Object WinSCP.Session
$session.SessionLogPath = $log
try {
# Connect
$session.Open($sessionOptions)
# Set up transfer options
$transferOptions = New-Object WinSCP.TransferOptions -Property @{
TransferMode = [WinSCP.TransferMode]::Ascii
}
$lcdPath = 'Filepath\'
$time = (Get-Date).AddDays(-1)
$files = @(Get-ChildItem -Path $lcdPath -Attributes !Directory -Recurse | Where-Object { $_.LastWriteTime -gt $time })
# Transfer files
foreach ($file in $files) {
$session.GetFiles($files, "LocalFilePath", $False, $transferOptions).Check()
}
}
finally {
$session.Dispose()
}
exit 0
catch
{
Write-Host "Error: $($_.Exception.Message)"
exit 1
}
发布于 2022-10-30 17:29:27
有一个WinSCP站点的例子实现了您想要实现的部分目标:
只需添加时间条件,就可以检查:
使用WinSCP从SFTP服务器下载比X天更新的文件,跳过不包含任何匹配文件的文件夹
将这些因素结合在一起,就可以做到:
$remotePath = "/remote/path"
$localPath = "C:\local\path"
$mask = "*.txt"
$files = $session.EnumerateRemoteFiles(
$remotePath, $mask, [WinSCP.EnumerationOptions]::AllDirectories)
$limit = (Get-Date).AddDays(-1)
$files = $files | Where-Object { $_.LastWriteTime -gt $limit }
foreach ($fileInfo in $files)
{
Write-Host "Downloading $($fileInfo.FullName) ..."
$session.GetFileToDirectory($fileInfo.FullName, $localPath)
}
发布于 2022-10-26 22:25:26
您有几个问题,您的代码将需要一些重新工作,但您的关闭。
您最大的问题是在本地文件系统的当前目录中寻找Filepath\
中的新文件,而不是在FTP服务器上:
$files = @(Get-ChildItem -Path $lcdPath -Attributes !Directory -Recurse | Where-Object { $_.LastWriteTime -gt $time })
我认为您希望使用列出FTP服务器上的远程文件并从这些数据构建$files
列表。(下面的例子取自winscp.net)
$session.Open($sessionOptions)
$directory = $session.ListDirectory("/home/martin/public_html")
foreach ($fileInfo in $directory.Files)
{
Write-Host ("$($fileInfo.Name) with size $($fileInfo.Length), " +
"permissions $($fileInfo.FilePermissions) and " +
"last modification at $($fileInfo.LastWriteTime)")
}
您可以根据远程文件的$files
来修改此代码以填充您的$fileinfo.LastWriteTime
数组,然后将其传递给您的"Transfer“foreach循环。
此外,在尝试/捕捉/最后的代码中有一些语法问题,如下所示:
catch
{
Write-Host "Error: $($_.Exception.Message)"
exit 1
}
finally {
$session.Dispose()
}
exit 0
https://stackoverflow.com/questions/74212923
复制相似问题