2016-11-28 42 views
5

Bir FTP sitesinden dosyaları çekecek bir PowerShell betiği üzerinde çalışıyorum. Dosyalar her saat başı FTP sitesine yüklenir, bu yüzden en güncel olanı indirmem gerekir. Şu anda kullandığım kod şu anda sadece bir dosya yerine tüm dosyaları indiriyor. Sadece en yeni dosyayı nasıl indirebilirim? İşte En son dosyayı PowerShell kullanarak FTP'den yükleyin

Şu anda bu FtpWebRequest ile kolay değil

$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 $_)) 
     } 
} 

cevap

8

kullanıyorum kodudur. Göreviniz için dosya zaman damgalarını bilmeniz gerekir.

Ne yazık ki, bir FTP MLSD komutunu desteklemediğinden, FtpWebRequest /.NET framework/PowerShell tarafından sunulan özellikleri kullanarak zaman damgalarını almanın gerçekten güvenilir ve verimli bir yolu yoktur. MLSD komutu, standart bir makine tarafından okunabilir biçimde uzak dizinin listelenmesini sağlar. Komut ve format RFC 3659 tarafından standartlaştırılmıştır. .NET framework tarafından desteklenen kullanabileceğiniz

Alternatifler: Bir dizindeki tüm dosyaların detaylarını almak için

  • ListDirectoryDetails yöntemi (bir FTP LIST komutu) ve sonra FTP sunucusu belirli bir biçimde başa 2009 * nix komut en yaygın, dezavantajı formatı yeni dosyalar için olduğu gibi, zaman içinde değişebileceğini "8 Mayıs 17:48" dır biçimi kullanılır ve yaşlı dosyalar için ise "18 Ekim ls benzer * nix biçimi (detaylar "format kullanılır" tek tek yeniden döndürmek için
  • GetDateTimestamp yöntem (bir FTP MDTM komutu) Her dosya için zaman damgası. Avantaj, cevabın RFC 3659 ile YYYYMMDDHHMMSS[.sss] arasında standartlaştırılmasıdır. Dezavantaj, her dosya için ayrı bir istek göndermeniz gereken, ne verimsiz olabilir.

Bazı referanslar:

Alternatif

, MLSD komutu destekleyen bir 3. parti FTP kitaplığı kullanın nd/veya özel liste formatının ayrıştırılmasını destekler. Örneğin WinSCP .NET assembly için

destekler.

bir örnek kod: Tam kodu için

# 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) bakın.

+2

WinSCP büyük yarar ve – Jimbo

+1

WinSCP kayalar :) çok güvenilir olduğunu (WinSCP yazarı değilim). PowerShell ile FTP transferi için oldukça etkilidir. – sodawillow