Файлы и подпапки файлов PowerShell FTP

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

#FTP Server Information - SET VARIABLES $ftp = "ftp://ftp.abc.ch/" $user = 'abc' $pass = 'abc' $folder = '/' $target = "C:\LocalData\Powershell\" #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 "*.*"})){ $source=$folderPath + $file $destination = $target + $file $webclient.DownloadFile($source, $target+$file) #PRINT FILE NAME AND COUNTER $counter++ $counter $source } 

Спасибо за вашу помощь (:

3 Solutions collect form web for “Файлы и подпапки файлов PowerShell FTP”

.NET Framework или PowerShell не имеют явной поддержки для рекурсивных операций с файлами (включая загрузку). Вы должны сами реализовать рекурсию:

  • Список удаленных каталогов
  • Итерировать записи, загружать файлы и рекурсировать в подкаталоги (перечислять их снова и т. Д.)

Трудная часть – идентифицировать файлы из подкаталогов. FtpWebRequest сделать это переносимым образом с платформой .NET ( FtpWebRequest или WebClient ). К сожалению, платформа .NET не поддерживает команду MLSD , которая является единственным переносимым способом получения списка каталогов с атрибутами файлов в протоколе FTP. См. Также Проверка, является ли объект на FTP-сервере файлом или каталогом .

Ваши варианты:

  • Сделайте операцию над именем файла, которое наверняка потерпит неудачу для файла и будет успешным для каталогов (или наоборот). Т.е. вы можете попробовать загрузить «имя». Если это удастся, это файл, если это не удается, это каталог.
  • Возможно, вам повезло, и в вашем конкретном случае вы можете указать файл из каталога по имени файла (т. Е. Все ваши файлы имеют расширение, а в подкаталогах нет)
  • Вы используете длинный список каталогов (метод LIST command = ListDirectoryDetails ) и пытаетесь разобрать листинг на сервере. Многие FTP-серверы используют список * nix-style, в котором вы идентифицируете каталог по d в самом начале записи. Но многие серверы используют другой формат. Следующий пример использует этот подход (при условии, что формат * nix)
 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() } } } 

Используйте функцию:

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

Код переведен из моего примера C # в C #. Загрузите все файлы и подкаталоги через FTP .


Если вы хотите избежать проблем с parsingом форматов MLSD каталогов конкретного сервера, используйте стороннюю библиотеку, которая поддерживает команду MLSD и / или parsing различных форматов MLSD LIST ; и рекурсивные загрузки.

Например, с помощью сборки WinSCP .NET вы можете загрузить весь каталог одним вызовом Session.GetFiles :

 # 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() } 

Внутри WinSCP использует команду MLSD , если она поддерживается сервером. Если нет, он использует команду LIST и поддерживает десятки разных форматов листинга.

По умолчанию метод Session.GetFiles рекурсивный.

(Я автор WinSCP)

Для получения файлов / папок с FTP через powerShell я написал некоторые функции, вы можете получить даже скрытые вещи с FTP.

Пример получения всех файлов и подпапок (даже скрытых) в определенной папке:

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

Вы можете просто скопировать функции из следующего модуля без необходимости установки какой-либо третьей библиотеки: https://github.com/AstralisSomnium/PowerShell-No-Library-Just-Functions/blob/master/FTPModule.ps1

AstralisSomnium

Для получения файлов / папок с FTP через powerShell я написал некоторые функции, вы можете получить даже скрытые вещи с FTP.

Пример получения всех файлов и подпапок (даже скрытых) в определенной папке:

Get-FtpChildItem -ftpFolderPath ” ftp://myHost.com/root/leaf/ ” -userName “Пользователь” -password ” pw ” -Directory -File Вы можете просто скопировать функции из следующего модуля без необходимости установки какой-либо третьей библиотеки: https://github.com/AstralisSomnium/PowerShell-No-Library-Just-Functions/blob/master/FTPModule.ps1

Да, но где я пишу назначение загруженного файла?

Мартин Прикрилл

Возможно, вам повезло, и в вашем конкретном случае вы можете указать файл из каталога по имени файла (т. Е. Все ваши файлы имеют расширение, а в подкаталогах нет)

Я думаю, что использовать этот параметр, но могу ли я сделать что-то вроде «. *», Чтобы выбрать все расширения?

  • Загрузите несколько файлов с помощью одного действия
  • Загрузите рабочую локальную копию веб-страницы
  • ANDROID: Как загрузить видеофайл на SD-карту?
  • Загрузите файл с Android и покажите прогресс в ProgressDialog
  • Как получить размер файла из заголовков http
  • Что означает код состояния HTTP 0
  • Обнаружение вредоносного файла в Chrome
  • Загрузка большого файла - iPhone SDK
  • Открыть текстовый файл в текстовом редакторе по умолчанию ... через Java?
  • Возможно ли инициировать запрос загрузки в браузере для распознанных типов MIME, используя только JavaScript (подход на стороне клиента)?
  • Как принудительно загрузить PDF-файл автоматически?
  • Interesting Posts

    Mockito: ввод реальных объектов в закрытые поля @Autowired

    Помогите с пониманием функционального объекта или функтора в Java

    Пара значений ключа для комбинированного поля в JavaFX 2

    Как отключить светодиоды на ноутбуке Fujitsu-Siemens Amilo Pi-3525

    Командная строка в режиме администратора не отображает подключенные диски

    Внутренний разъем S / PDIF на материнской плате Gigabyte Z97

    Обновление ObservableCollection в отдельном streamе

    Выбросить ошибку в триггере MySQL

    Как я могу использовать пакеты NuGet в своих функциях Azure?

    django – упорядочение запроса по вычисленному полю

    Как определить компонент списка весной?

    Доступ к инъецируемой зависимости в конструкторе управляемого компонента вызывает NullPointerException

    Запустите Safari из командной строки с параметром URL

    Я не могу настроить яркость экрана в Windows 10

    Почему ленивая оценка полезна?

    Давайте будем гением компьютера.