2013-09-27 25 views
8
$ftpServer = "ftp.example.com" 
$username ="validUser" 
$password ="myPassword" 
$localToFTPPath = "C:\ToFTP" 
$localFromFTPPath = "C:\FromFTP" 
$remotePickupDir = "/Inbox" 
$remoteDropDir = "/Outbox" 
$SSLMode = [AlexPilotti.FTPS.Client.ESSLSupportMode]::ClearText 
$ftp = new-object "AlexPilotti.FTPS.Client.FTPSClient" 
$cred = New-Object System.Net.NetworkCredential($username,$password) 
$ftp.Connect($ftpServer,$cred,$SSLMode) #Connect 
$ftp.SetCurrentDirectory($remotePickupDir) 
$ftp.GetFiles($localFromFTPPath, $false) #Get Files 

Bu, bir FTP sunucusundan dosya almak için aldığım komut dosyasıdır.
Ancak, remotePickupDir'un ne olduğundan emin değilim ve bu komut dosyası doğru mu?PowerShell FTP sunucusuna bağlanın ve dosya alın

cevap

3

Uzaktan seçim dizin yolu .. burada .. erişmeye tryng ftp sunucusu üzerinde tam yol olmak sunucudan .. eklemek veya SSLMode ile değiştirebilirsiniz dosyaları indirmek için script gerektiğini

#ftp server 
$ftp = "ftp://example.com/" 
$user = "XX" 
$pass = "XXX" 
$SetType = "bin" 
$remotePickupDir = Get-ChildItem 'c:\test' -recurse 
$webclient = New-Object System.Net.WebClient 

$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) 
foreach($item in $remotePickupDir){ 
    $uri = New-Object System.Uri($ftp+$item.Name) 
    #$webclient.UploadFile($uri,$item.FullName) 
    $webclient.DownloadFile($uri,$item.FullName) 
} 
+10

$ remotepickupdir = get-childitem c ise: o değişkeni kurar zaman \ Test -recurse, powershell o yolda tüm öğeleri almak için çalışacağız. Bu yüzden uzak öğeleri geri alamıyor çünkü bu noktada bir giriş bile olmadı. Kodunuz yanlış görünüyor. – BSAFH

+0

Bu kabul edildi olarak işaretlenmemelidir. Bu soruya cevap vermiyor! –

1

remotePickupDir, ftp sunucusunda gitmek istediğiniz klasör olacaktır. "Bu senaryo doğru" olduğu sürece, işe yarıyor mu? Eğer çalışırsa o zaman doğrudur. Eğer işe yaramazsa, hangi hata mesajını veya beklenmedik davranışları bize bildirin ve size daha iyi yardımcı olacağız.

3

Tüm dosyaları (joker veya dosya uzantısı ile) FTP sitesinden yerel dizine indirmek için tam çalışma kodu. Değişken değerlerini ayarlayın. PowerShell üzerinden FTP dosya/klasör almak için

#FTP Server Information - SET VARIABLES 
    $ftp = "ftp://XXX.com/" 
    $user = 'UserName' 
    $pass = 'Password' 
    $folder = 'FTP_Folder' 
    $target = "C:\Folder\Folder1\" 

    #SET CREDENTIALS 
    $credentials = new-object System.Net.NetworkCredential($user, $pass) 

    function Get-FtpDir ($url,$credentials) { 
     $request = [Net.WebRequest]::Create($url) 
     $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory 
     if ($credentials) { $request.Credentials = $credentials } 
     $response = $request.GetResponse() 
     $reader = New-Object IO.StreamReader $response.GetResponseStream() 
     while(-not $reader.EndOfStream) { 
      $reader.ReadLine() 
     } 
     #$reader.ReadToEnd() 
     $reader.Close() 
     $response.Close() 
    } 

    #SET FOLDER PATH 
    $folderPath= $ftp + "/" + $folder + "/" 

    $files = Get-FTPDir -url $folderPath -credentials $credentials 

    $files 

    $webclient = New-Object System.Net.WebClient 
    $webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) 
    $counter = 0 
    foreach ($file in ($files | where {$_ -like "*.txt"})){ 
     $source=$folderPath + $file 
     $destination = $target + $file 
     $webclient.DownloadFile($source, $target+$file) 

     #PRINT FILE NAME AND COUNTER 
     $counter++ 
     $counter 
     $source 
    } 
-1

ben bile FTP bir şeyler gizli alabilirsiniz, bazı işlevler yazdı.

belirli bir klasörde gizli olmayan tüm dosyaları almak için

Örnek:

Get-FtpChildItem -ftpFolderPath "ftp://myHost.com/root/leaf/" -userName "User" -password "pw" -hidden $false -File 

Örnek belirli bir klasörde tüm klasörleri (ayrıca gizli) almak için:

Get-FtpChildItem -ftpFolderPath"ftp://myHost.com/root/leaf/" -userName "User" -password "pw" -Directory 

Sadece kopyalayabilirsiniz İhtiyaç duyulmadan aşağıdaki modülden fonksiyonlar ve 3. kütüphane kurulumu: https://github.com/AstralisSomnium/PowerShell-No-Library-Just-Functions/blob/master/FTPModule.ps1

15

Kuyrukta kullanılan AlexFTPS kütüphanesi Stion ölü gibi görünüyor (2011'den beri güncellenmedi).


Alternatif olarak, herhangi bir dış kütüphaneye olmadan bu uygulamaya deneyebilirsiniz. Ama ne yazık ki, ne .NET Framework ne de PowerShell bir dizindeki tüm dosyaları indirmek için herhangi bir açık desteğe sahip değil (sadece tekrarlayan dosya indirme izinleri).

Sen uygulamak zorunda olduğunu kendiniz:

  • Liste uzak dizin
  • Bıkmadan girişleri, dosya indirme (ve isteğe bağlı alt dizinleri içine recursing - vs. onları tekrar listelendiği)

Zor bölüm, alt dizinlerden dosyaları tanımlamaktır. Bunu, .NET çerçevesiyle (FtpWebRequest veya WebClient) taşınabilir bir şekilde yapmanın bir yolu yoktur. .NET çerçevesi, ne yazık ki, FTP protokolünde dosya öznitelikleriyle dizin listesini almak için tek taşınabilir yol olan MLSD komutunu desteklemiyor. Ayrıca bkz. Checking if object on FTP server is file or directory.

Seçenekleriniz şunlardır:

  • Eğer dizin tüm alt içermediğini biliyorsanız, ListDirectory yöntemi (NLST FTP komutu) kullanmak ve sadece dosyaları gibi tüm "isimler" indirin.
  • Dosya için başarısız olan ve dosya için başarılı olan bir dosya adı üzerinde bir işlem yapın (veya tersi). Yani "adını" indirmeyi deneyebilirsiniz.
  • LIST (Şanslı olabilir ve spesifik durumda, (alt dizinleri yok ederken yani tüm dosyalarınızı bir uzantısı olan)
  • girişini uzun dizin kullandığınız bir dosya adıyla bir dizinden dosya söyleyebilir command = ListDirectoryDetails yöntem) ve sunucuya özgü bir listeyi ayrıştırmayı deneyin. Birçok FTP sunucusu, girişin başında d tarafından bir dizin belirlediğiniz * nix stili listesini kullanır. Ancak birçok sunucu farklı bir format kullanıyor. Aşağıdaki örnek bu yaklaşımı (* nix biçimi varsayarak) kullanır
  • function DownloadFtpDirectory($url, $credentials, $localPath) 
    { 
        $listRequest = [Net.WebRequest]::Create($url) 
        $listRequest.Method = [System.Net.WebRequestMethods+FTP]::ListDirectoryDetails 
        $listRequest.Credentials = $credentials 
    
        $lines = New-Object System.Collections.ArrayList 
    
        $listResponse = $listRequest.GetResponse() 
        $listStream = $listResponse.GetResponseStream() 
        $listReader = New-Object System.IO.StreamReader($listStream) 
        while (!$listReader.EndOfStream) 
        { 
         $line = $listReader.ReadLine() 
         $lines.Add($line) | Out-Null 
        } 
        $listReader.Dispose() 
        $listStream.Dispose() 
        $listResponse.Dispose() 
    
        foreach ($line in $lines) 
        { 
         $tokens = $line.Split(" ", 9, [StringSplitOptions]::RemoveEmptyEntries) 
         $name = $tokens[8] 
         $permissions = $tokens[0] 
    
         $localFilePath = Join-Path $localPath $name 
         $fileUrl = ($url + $name) 
    
         if ($permissions[0] -eq 'd') 
         { 
          if (!(Test-Path $localFilePath -PathType container)) 
          { 
           Write-Host "Creating directory $localFilePath" 
           New-Item $localFilePath -Type directory | Out-Null 
          } 
    
          DownloadFtpDirectory ($fileUrl + "/") $credentials $localFilePath 
         } 
         else 
         { 
          Write-Host "Downloading $fileUrl to $localFilePath" 
    
          $downloadRequest = [Net.WebRequest]::Create($fileUrl) 
          $downloadRequest.Method = [System.Net.WebRequestMethods+FTP]::DownloadFile 
          $downloadRequest.Credentials = $credentials 
    
          $downloadResponse = $downloadRequest.GetResponse() 
          $sourceStream = $downloadResponse.GetResponseStream() 
          $targetStream = [System.IO.File]::Create($localFilePath) 
          $buffer = New-Object byte[] 10240 
          while (($read = $sourceStream.Read($buffer, 0, $buffer.Length)) -gt 0) 
          { 
           $targetStream.Write($buffer, 0, $read); 
          } 
          $targetStream.Dispose() 
          $sourceStream.Dispose() 
          $downloadResponse.Dispose() 
         } 
        } 
    } 
    

Kullanım gibi işlev: Kod C# Download all files and subdirectories through FTP benim C# örnekten çevrilmiştir

$credentials = New-Object System.Net.NetworkCredential("user", "mypassword") 
$url = "ftp://ftp.example.com/directory/to/download/" 
DownloadFtpDirectory $url $credentials "C:\target\directory" 

. Sunucu özgü dizin listeleme biçimleri ayrıştırma ile sorunları önlemek istiyorsanız


, MLSD komutu ve/veya çeşitli LIST listeleme çözümleme biçimlerinin destekleyen bir 3. parti kitaplığı kullanın. İdeal olarak, bir dizinden tüm dosyaları indirmeye veya yinelemeli indirmelere yönelik bir destekle.

WinSCP .NET assembly ile Örneğin Session.GetFiles tek bir çağrı ile tüm dizin indirebilirsiniz: sunucu tarafından destekleniyorsa
# Load WinSCP .NET assembly 
Add-Type -Path "WinSCPnet.dll" 

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

$session = New-Object WinSCP.Session 

try 
{ 
    # Connect 
    $session.Open($sessionOptions) 

    # Download files 
    $session.GetFiles("/directory/to/download/*", "C:\target\directory\*").Check() 
} 
finally 
{ 
    # Disconnect, clean up 
    $session.Dispose() 
}  

Dahili olarak, WinSCP, MLSD komutu kullanır. Değilse, LIST komutunu kullanır ve düzinelerce farklı liste biçimini destekler.

Session.GetFiles method varsayılan olarak yinelemelidir.

(Ben WinSCP yazarı olduğum)

İlgili konular