gpt4 book ai didi

powershell - 使用 PowerShell 从 FTP 下载最新文件

转载 作者:行者123 更新时间:2023-12-03 07:14:06 26 4
gpt4 key购买 nike

我正在编写一个 PowerShell 脚本,该脚本将从 FTP 站点提取文件。文件每小时上传到 FTP 站点,因此我需要下载最新的文件。我当前拥有的代码会下载今天的所有文件,而不是仅下载一个文件。如何让它只下载最新的文件?

这是我当前正在使用的代码

$ftpPath = 'ftp://***.***.*.*'
$ftpUser = '******'
$ftpPass = '******'
$localPath = 'C:\Temp'
$Date = get-date -Format "ddMMyyyy"
$Files = 'File1', 'File2'

function Get-FtpDir ($url, $credentials)
{
$request = [Net.FtpWebRequest]::Create($url)
if ($credentials) { $request.Credentials = $credentials }
$request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory
(New-Object IO.StreamReader $request.GetResponse().GetResponseStream()) -split "`r`n"

}

$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($ftpUser,$ftpPass)
$webclient.BaseAddress = $ftpPath

Foreach ( $item in $Files )
{
Get-FTPDir $ftpPath $webclient.Credentials |
? { $_ -Like $item+$Date+'*' } |
% {

$webClient.DownloadFile($_, (Join-Path $localPath $_))
}
}

最佳答案

FtpWebRequest 并不容易。对于您的任务,您需要知道文件时间戳。

不幸的是,没有真正可靠且有效的方法来使用 FtpWebRequest/.NET Framework/PowerShell 提供的功能检索时间戳,因为它们不支持 FTP MLSD 命令。 MLSD 命令以标准化机器可读格式提供远程目录列表。命令和格式由RFC 3659标准化。 .

.NET 框架支持的您可以使用的替代方案:

  • ListDirectoryDe​​tails 方法(FTP LIST 命令)检索目录中所有文件的详细信息,然后处理详细信息的 FTP 服务器特定格式(*nix 格式)类似于 ls *nix 命令是最常见的,缺点是格式可能会随着时间的推移而改变,对于较新的文件使用“May 8 17:48”格式,而对于较旧的文件使用“Oct 18 2009” "使用格式)
  • GetDateTimestamp 方法(FTP MDTM 命令),用于单独检索每个文件的时间戳。优点是响应被标准化为 RFC 3659YYYYMMDDHHMMSS[.sss]。缺点是您必须为每个文件发送单独的请求,效率非常低。

一些引用:

<小时/>

或者,使用支持 MLSD 命令和/或支持解析专有列表格式的第三方 FTP 库。

例如WinSCP .NET assembly两者都支持。

示例代码:

# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Ftp
HostName = "example.com"
UserName = "user"
Password = "mypassword"
}

$session = New-Object WinSCP.Session

# Connect
$session.Open($sessionOptions)

# Get list of files in the directory
$directoryInfo = $session.ListDirectory($remotePath)

# Select the most recent file
$latest =
$directoryInfo.Files |
Where-Object { -Not $_.IsDirectory } |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1

# Any file at all?
if ($latest -eq $Null)
{
Write-Host "No file found"
exit 1
}

# Download the selected file
$sourcePath = [WinSCP.RemotePath]::EscapeFileMask($remotePath + $latest.Name)
$session.GetFiles($sourcePath, $localPath).Check()

有关完整代码,请参阅 Downloading the most recent file (PowerShell) .

(我是 WinSCP 的作者)

关于powershell - 使用 PowerShell 从 FTP 下载最新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40845688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com