Рекурсивная загрузка файлов с FTP-сервера

#powershell

#powershell

Вопрос:

Привет всем, я новичок в написании сценариев power shell, я пытаюсь загрузить все файлы в корневом каталоге и файлы в подпапке на основе имени файла с FTP-сервера. Поскольку я ищу файлы, которые были сопоставлены по именам файлов в like, поскольку мой путь всегда будет указывать на корневой каталог, а корневой каталог содержит текстовые файлы и вложенные папки, вложенные папки содержат текстовые файлы.

Я нашел пример получения текстовых файлов для загрузки на локальный с ftp-сервера, но в примере, который я нашел, загружаются только текстовые файлы из корневого каталога, он не сканирует вложенные папки и не получает файлы во вложенных папках.

Вот пример, который я попробовал

 #    $url = "ftp://XXX.com/" 
    $user = 'UserName' 
    $pass = 'Password'
    $folder = 'FTP_Folder'
    $target = "C:FolderFolder1"

    #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() 
        $reader.ReadToEnd()
        $reader.Close()
        $response.Close()
    }

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

    $Allfiles=Get-FTPDir -url $folderPath -credentials $credentials
    $files = ($Allfiles -split "`r`n")

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

Я попробовал использовать функции модуля PSFTP, такие как функция Get-ftpchilditem с рекурсивным, но у меня это не сработало.

Пожалуйста, помогите мне в этом, чтобы получить файлы из корневой папки и вложенных папок FTP-сервера в локальную систему.

Ответ №1:

Я делал это в прошлом, используя WinSCP и SFTP. Пример приведен ниже. При этом используется SFTP SCP, который в основном работает по SSH. Я уверен, что вы можете изменить протокол WinSCP на ftp и попробовать другую комбинацию. Надеюсь, это вам поможет. Измените маски файлов, чтобы они включали только .txt, и это будет проходить через вложенные папки. Также для этой работы вам потребуется WinSCPnet.dll и WinSCP.exe который вы можете легко загрузить с сайта WinSCP. Загрузите «.Net Assembly / COM Library» и сохраните скрипт и необходимые файлы в той же папке и обновите путь в скрипте. Удачи.

 # Load WinSCP .NET assembly
Add-Type -Path "C:Usersadministrator.ADDocumentsWinSCP    ScriptWinSCPnet.dll"


$hostname = "ftp.xyz.net"
$user = "me"
$pass = "mypassword"
$sfolder = "/home/me"
$dfolder = "C:tmp"
$sshHostKeyFingerprint = "ssh-rsa 2048 eb:2c:f9:ab:19:2e:0c:22:02:d4:8f:64:44:75:ec:04"
$mask = "*.jpg;*.jpeg;*.png;*.tiff;*.txt"
####################### END USER CONFIGURABLE SETTINGS #########################

# Main script
# Setup session options

$sessionOptions = New-Object WinSCP.SessionOptions -Property @{

Protocol = [WinSCP.Protocol]::Scp

HostName = $hostname

UserName = $user

Password = $pass

SshHostKeyFingerprint = $sshHostKeyFingerprint

}


$session = New-Object WinSCP.Session

$transferOptions = New-Object WinSCP.TransferOptions

$transferOptions.FileMask = "*.jpg; *.jpeg; *.png; *.tiff;"

try

{
# Will continuously report progress of synchronization

$session.add_FileTransferred( { FileTransferred($_) } )

# Connect

$session.Open($sessionOptions)

# Synchronize files

$synchronizationResult = $session.SynchronizeDirectories(

[WinSCP.SynchronizationMode]::Local,$dfolder, $sfolder, $False, $False, 1, $transferOptions)

# Throw on any error

$synchronizationResult.Check()

}

finally

{

# Disconnect, clean up

$session.Dispose()

}
 

Комментарии:

1. Спасибо Junaid за быстрое воспроизведение … Это очень полезно.

2. Привет, Junid, пожалуйста, посмотрите на приведенный ниже сценарий, о котором я упоминал, и помогите мне… Заранее спасибо