2016-11-28 11 views
5

का उपयोग कर एफ़टीपी से सबसे हालिया फ़ाइल डाउनलोड करें मैं पावरशेल स्क्रिप्ट पर काम कर रहा हूं, जो एक एफ़टीपी साइट से फ़ाइलों को खींच देगा। फ़ाइलों को हर घंटे एफ़टीपी साइट पर अपलोड किया जाता है, इसलिए मुझे सबसे हालिया डाउनलोड करने की आवश्यकता है। कोड जो मैंने वर्तमान में केवल एक फ़ाइल के बजाय आज से सभी फाइलों को डाउनलोड किया है। मैं इसे केवल नवीनतम फ़ाइल डाउनलोड कैसे करूं?PowerShell

यहाँ कोड है कि मैं वर्तमान में

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

उत्तर

8

यह FtpWebRequest साथ आसान नहीं है का उपयोग कर रहा है। अपने काम के लिए, आपको फाइल टाइमस्टैम्प जानना होगा।

दुर्भाग्यवश, FtpWebRequest /.NET फ्रेमवर्क/पावरशेल द्वारा प्रदान की जाने वाली सुविधाओं का उपयोग करके टाइमस्टैम्प को पुनर्प्राप्त करने के लिए वास्तव में विश्वसनीय और प्रभावी तरीका नहीं है क्योंकि वे एफ़टीपी MLSD कमांड का समर्थन नहीं करते हैं। MLSD कमांड एक मानक मशीन-पठनीय प्रारूप में दूरस्थ निर्देशिका की सूची प्रदान करता है। आदेश और प्रारूप को RFC 3659 द्वारा मानकीकृत किया गया है।

विकल्प है जो आप उपयोग कर सकते हैं, जो .NET ढांचे द्वारा समर्थित हैं:

  • ListDirectoryDetails विधि (एक FTP LIST आदेश) एक निर्देशिका में सभी फ़ाइलों के विवरण प्राप्त करने के लिए और फिर आप FTP सर्वर विशिष्ट प्रारूप के साथ सौदा विवरण (* ls के समान निक्स प्रारूप * निक्स कमांड सबसे आम है, दोष यह है कि प्रारूप समय के साथ बदल सकता है, क्योंकि नई फाइलों के लिए "8 मई 17:48" प्रारूप का उपयोग किया जाता है और पुरानी फाइलों के लिए "18 अक्टूबर 200 9 "प्रारूप का उपयोग किया जाता है)
  • GetDateTimestamp विधि (एक एफ़टीपी MDTM कमांड) व्यक्तिगत रूप से ret प्रत्येक फ़ाइल के लिए rieve timestamps। लाभ यह है कि प्रतिक्रिया RFC 3659 से YYYYMMDDHHMMSS[.sss] द्वारा मानकीकृत है। नुकसान यह है कि आपको प्रत्येक फ़ाइल के लिए एक अलग अनुरोध भेजना होगा, जो काफी अक्षम हो सकता है।

कुछ संदर्भों:


वैकल्पिक रूप से, एक 3 पार्टी एफ़टीपी पुस्तकालय MLSD आदेश का समर्थन करता है कि का उपयोग करें, एक nd/या मालिकाना लिस्टिंग प्रारूप की पार्सिंग का समर्थन करता है।

उदाहरण के लिए 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) देखते हैं।

+2

WinSCP एक महान उपयोगिता और बहुत विश्वसनीय :) – Jimbo

+1

WinSCP चट्टानों है (मैं WinSCP के लेखक हूँ)। PowerShell के साथ एफ़टीपी स्थानांतरण के लिए यह काफी कुशल है। – sodawillow