Копирование файлов на ftp powershell

Обновлено: 04.07.2024

Я хочу использовать PowerShell для передачи файлов с FTP на анонимный FTP-сервер. Я бы не использовал никаких дополнительных пакетов. Как?

Не должно быть опасений, что script зависает или падает.

ОТВЕТЫ

Ответ 1

Я не уверен, что вы можете на 100% устранить ошибки script из-за того, что вы не висели или не рушились, поскольку есть вещи вне вашего контроля (что, если сервер теряет мощность в середине загрузки?), но это должно обеспечить прочную основу для начала:

Ответ 2

Есть и другие способы. Я использовал следующий скрипт:

И вы можете запустить скрипт для утилиты командной строки Windows FTP, используя следующую команду

На этот вопрос также отвечает следующий вопрос: Как создать сценарий загрузки и выгрузки по FTP?

Ответ 3

Я не собираюсь утверждать, что это более элегантно, чем решение с высоким разрешением. но это классно (ну, по крайней мере, в моем уме LOL) по-своему:

Как вы можете видеть, он использует этот dinky встроенный FTP-клиент Windows. Гораздо короче и прямолинейно. Да, я действительно использовал это, и он работает!

Ответ 4

Ответ 5

Самый простой способ

Самый простой способ загрузки двоичного файла на FTP-сервер с помощью PowerShell - это использование WebClient.UploadFile :

Если вам нужен больший контроль, который WebClient не предлагает (например, шифрование TLS/SSL и т.д.), Используйте FtpWebRequest . Простой способ - просто скопировать FileStream в поток FTP, используя Stream.CopyTo :

Если вам нужно отслеживать ход загрузки, вы должны скопировать содержимое по частям:

Загрузка папки

Ответ 6

Здесь моя супер классная версия ПОТОМУ ЧТО ЭТО БУДЕТ ПРОГРЕСС: -)

Это совершенно бесполезная функция, я знаю, но она по-прежнему выглядит круто \m/\ m/

PS. Помогает много, когда мне интересно, "он прекратил работать, или это просто мое медленное соединение ASDL?"

Ответ 7

Решение Goyuix отлично работает, но как представлено, он дает мне эту ошибку: "Запрошенная команда FTP не поддерживается при использовании прокси-сервера HTTP".

Ответ 8

Ответ 9

Вы можете использовать эту функцию:

Эта функция отправляет указанный файл по FTP. Вы должны вызвать функцию с этими параметрами:

Метод 1 . Одна из полезных и удобных особенностей PowerShell – возможность прозрачно взаимодействовать с утилитами командной строки.

Одна из таких утилит ftp.exe Утилита специфическая и по современным понятиям неудобная. Но она стандартная и администратор может ее использовать при необходимости на любой системе без лишних усилий. Чтобы несколько уменьшить неуклюжесть интерфейса утилиты ftp.exe , используем PowerShell.

Конечно мы не будем делать универсальную обертку: просто продемонстрируем технику и за одно решим вполне практическую задачу копирования списка файлов с ftp-сервера: сделать это стандартными командами вручную непросто (написать 5 команд get еще можно, а 15 уже утомительно).

Для начала создадим список команд в переменной (каждая команда пишется на новой строке!):

>$FileList = "open 17.17.17.21

user USERNAME PASSWORD

cd DIRECTORYNAME

Получив список файлов, мы можем использовать PowerShell для его предварительной обработки и фильтрации, чтобы выбрать нужные нам файлы для последующего копирования, например за определенную дату:

Тут сначала убраны директории, затем выбраны файлы за определенную дату, а потом вырезаны имена файлов.

Теперь скопируем эти файлы на локальную машину:

>$cmd = " open 17.17.17.21

user USERNAME PASSWORD

cd DIRECTORYNAME

$cmd | ftp -i –n

Как видите утилита ftp принимает команды через стандартный поток ввода и выдает результат на стандартный поток вывода. Эта ее особенность использована в приведенном примере.

Примечание .Некоторые утилиты не могут принимать команды через стандартный поток, но могут принимать команды из файла. В этом случае нам придется создать вспомогательный файл команд. Аналогичная ситуация может возникнуть с выводом результатов в файл.

Конечно приведенную технику можно использовать не только для загрузки файлов, но и для выгрузки на сервер: достаточно изменить команду get на команду put.

Получить список файлов (DIR):

>$url = ftp://$server/$filename

>$WR.Proxy = $null

>$WRStream = $WR.GetResponse();

>$responseStream = $WRStream.GetResponseStream()

>$readStream = new-object System.IO.StreamReader($responseStream, [System.Text.Encoding]::UTF8)

>$FileList =$readStream.ReadToEnd()

Примечание. Получить список методов для запросов:

Отфильтровать список файлов и получить только нужные файлы:

Загрузить файлы по сформированному списку:

$WR.Proxy = $null

$WRStream = $WR.GetResponse()

$responseStream = $WRStream.GetResponseStream()

$readStream = new-object System.IO.StreamReader($responseStream, [System.Text.Encoding]::UTF8)

$a=$readStream.ReadToEnd()

Обратная задача – выгрузка файлов по списку на сервер (не тестировано):

$WR.Proxy = $null

$WRStream = $WR.GetResponse()

$responseStream = $WRStream.GetResponseStream()

$WriteStream = new-object System.IO.StreamWriter($responseStream, [System.Text.Encoding]::UTF8)

$WriteStream.Close()

$responseStream.Close()

Загрузку одиночного файла можно выполнить более экономным методом . Для этого можно применить класс WebClient Class:

>$filename = "DIRECTORY/FILENAME"

>$WC.Proxy = $null

>$localfile = "LOCALFILENAME"

>$WC.DownloadFile($url,$localfile)

Для выгрузки файла на сервер надо поменять последнюю строку:

>$ WC . UploadFile ($ url ,$ localfile )

Метод 3. Загрузить и установить какое-нибудь дополнение к PowerShell для работы с сетью. Есть коммерческие варианты. Есть бесплатные (Indy). Примеры смотрите в самих пакетах.

Добрый день!
Есть простенькая задачка: Средствами powershell закинуть текстовый файл на ftp-сервак.

Использую класс webclient и метод UploadFile(String, String):

Однако возникает следующая ошибка:

В чем ошибка? На MSDN посмотрел описание метода, но либо не увидел описания этого исключения, либо плохо смотрел.
Заранее благодарен за помощь

Загрузка на FTP-сервер последнего созданного в папке файла
Есть скрипт который копирует на ftp последний созданный файл в папке. Но вылетает ошибка при.

Ftp сервер
Посоветуйте хорошую програму для создания ftp сервера на своём ПК. Стоит windows 7,Спасибо.

Копирование на FTP сервер
Всем добрый день! Помогите решить задачку с копированием файлов на FPT сервер из сетевой папки. .

Вроде у вас UserInfo не подгружается,а если так попробовать?

borne, Пробовал. Ничего не меняется, вся та же ошибка А вручную фтп работает с этими данными?папка доступна для этого пользователя с правами записи? borne, Да, например, через totalcmd все в порядке. borne,Спасибо.
Это по сути то же самое что у меня, только с проверкой коннекта и исключением при загрузке файла.
Мне бы хотя бы понять почему возникает ошибка, это было бы 50% решения.

А файл во время upload не может быть занят на стороне ftp? это перезапись или первое копирование?

Добавлено через 6 минут
а что если попробовать с другого компа или/и с другой учеткой ftp ?

borne, Это первое копирование. Я походу понял в чем проблема. webclient либо не работает, либо работает коряво при пассивном режиме ftp.

Добавлено через 1 минуту
Попробую использовать класс ftpwebrequest

Добавлено через 16 часов 29 минут
так проблему с ошибкой решил. ура.
вот код рабочий.

Как зайти на домашний FTP сервер
Я не понимаю как зайти на домашний FTP сервер, я его создал а зайти не знаю как, создавал через.

Как проверить, запущен ли ftp сервер?
На машине должны быть запущены: апачь, лайт манагэ и ftp, на маршрутизаторе открыты порты: 80, 5650.

Загрузка файла на ftp сервер
получаю от сервера ответ 226, загрузка окончено загружено 576 байт, но самого файла на ftp-сервере.

date

13.05.2020

directory

PowerShell

comments

комментариев 6

PowerShell командлет Copy-Item используется для копирования файлов между локальными, сетевыми каталогами или между компьютерами по сети через WinRM. Командлет Copy-Item предоставляет большое количество опций, которые можно использовать в разных сценариях копирования файлов и каталогов (по своим возможностям этот командлет почти не уступает утилите robocopy). Например:

  • перезапись файлов (override)
  • фильтрация по имени/шаблону
  • исключение по имени/шаблону
  • Verbose режим
  • Копирование файлов с/на удаленные компьютеры

Начнем с простых примеров использования Copy-Item и будем переходить к более сложным.

Копирование файлов и каталогов

Чтобы скопировать один файл 1.txt из каталога C:\SourceFolder\ в F:\DestFolder\, выполните:

Copy-Item -Path "C:\SourceFolder\1.txt" -Destination "F:\DestFolder\1.txt"

Можно использовать сокращенный синтаксис командлета, пропустив указание параметров Path и Destination:

cpi "C:\SourceFolder\1.txt" "F:\DestFolder\1.txt"

Теперь скопируем каталог C:\SourceFolder\folder в F:\DestFolder\folder. В папке folder находится файл 1.txt. Обратите внимание что без ключа –Recurse, папка folder копируется без содержимого:

Copy-Item -Path "C:\SourceFolder\folder" -Destination "F:\DestFolder\folder" -Recurse

С помощью Copy-Item также можно просто объединить файлы из несколько директорий в одну (слияние директории), для этого нужно перечислить директории в ключе –Path:

Copy-Item -Path "C:\SourceFolder\*", "C:\SourceFolder2\*", "C:\SourceFolder3\*" -Destination "F:\DestFolder\"

Копирование с заменой и копирование с заменой read-only файлов

copy-item DirectoryExists

Для перезаписи файла с атрибутом read-only, нужно использовать ключ -Force. Если его не использовать, вы получите ошибку “отказано в доступе по пути… CopyFileInfoItemUnauthorizedAccessError”.

copy-item CopyFileInfoItemUnauthorizedAccessError

Чтобы скопировать файл с перезаписью файла с read-only атрибутом используйте параметр Force.

Copy-Item -Path "C:\SourceFolder\1.txt" -Destination "F:\DestFolder\1.txt" -Force

Совет. Чтобы не путаться, ключ –Force можно рассматривать как ключ для копирования с заменой.

Чтобы Copy-Item скопировал файлы из одной папки в другую без замены существующих файлов, можно использовать этот простой скрипт

Copy-Item (Join-Path "C:\SourceFolder\" "*") "F:\DestFolder\" -Exclude (Get-ChildItem "F:\DestFolder\") -Recurse

Этот скрипт скопирует все файлы и папки из C:\SourceFolder в F:\DestFolder без замены файлов уже существующих в F:\DestFolder

Копирование с фильтрацией по шаблону

С помощью Copy-Item можно скопировать файлы/директории выбранные с помощью wildcard символа * или с помощью символа ?. Также поддерживаются некоторые регулярные выражения

Для примера возьмём такую структуру файлов:

source

Выполним копирование командой:

Copy-Item -Path "C:\SourceFolder\fol*" -Destination "F:\DestFolder\"

Результат в F:\DestFolder\

copy-item replace

Теперь чистим папку назначения и выполняем:

Copy-Item -Path "C:\SourceFolder\folder1" -Destination "F:\DestFolder\"

result

Папка без цифры в окончании не скопировалась, потому что folder3 подразумевает что после folder будет как минимум еще 1 символ между 0 и 3

Исключение файлов при копировании

С помощью ключа –Exclude можно исключить файлы при копировании. Например, следующай команда скопирует все файлы кроме файлов с расширением txt.

Copy-Item -Path "C:\SourceFolder\*" -Destination "F:\DestFolder\" -Recurse -Force -Exclude "*.txt"

Аналогичным же образом можно применить ключ –Include, например

Copy-Item -Path "C:\SourceFolder\*" -Destination "F:\DestFolder\" -Recurse -Force -Include "*.txt"

Скопирует только txt файлы. Хотя для простоты гораздо удобнее использовать при копировании вид -Path "C:\SourceFolder\*.txt" .

Копирование файлов на удаленный компьютер по сети

Copy-File может копировать не только по SMB протоколу, но и через WinRM (WSMan).

Создайте новую сессию с компьютером testnode1 и выполните копирование в её контексте:

$session = New-PSSession -ComputerName testnode1
Copy-Item -Path "C:\SourceFolder\*" -ToSession $session -Destination "C:\SourceFolder\" -Recurse -Force

Эта команда скопирует файлы с локального компьютера из директории C:\SourceFolder на компьютер testnode1 в C:\SourceFolder\.

Примечание. Доступность WSMan на удаленном компьютере можно проверить с помощью командлета Test-WSMan.

Test-WSMan -ComputerName testnode1

Test-WSMan

Если WSMan не настроен, вы можете выполнить его быструю конфигурацию. Для этого откройте командную строку с правами администратора и выполните winrm quickconfig

winrm quickconfig

Также можно копировать и через обычные сетевые SMB шары, для этого просто используйте UNC формат сетевого пути.

Copy-Item -Path "C:\SourceFolder\*" -Destination "\\testnode1\C$\copy_tutorial\"

Можно скопировать файл с удаленного компьютера. Принцип такой же, как и при копировании файлов на удаленный компьютер, за исключением параметра –ToSession, вместо него нужно использовать –FromSession:

$session = New-PSSession -ComputerName testnode1
Copy-Item -FromSession $session -Path "C:\SourceFolder\*" -Destination "F:\DestFolder\" -Recurse -Force

Эта команда скопирует содержимое папки C:\SourceFolder\ с компьютера testnode1 на локальный компьютер в директорию F:\DestFolder

Ключ PassThru

Командлет Copy-Item (как и многие другие командлеты PowerShell) не возвращает результатов в консоль. Параметр PassThru применяется скриптах, или для лог-файлов, когда нужно получить список скопированных файлов и работать с ним дальше. Рассмотрим пример

$items = Copy-Item -Path "C:\SourceFolder\*" –Destination "\\testnode1\C$\copy_tutorial\" -PassThru

Переменная $items будет содержать список скопированных файлов, с которым вы можете работать дальше.Это значит что вы можете напрямую работать с этими файлами. Например выполнив команду Remove-Item $items[0] , вы удалите директорию folder.

copy-item passthru

Ключ Verbose

При использовании ключа -Verbose вы получите подробный лог операций копирования. Например, вывод команды

Copy-Item -Path "C:\SourceFolder\*.txt" -Destination "F:\DestFolder\" -Recurse -Force -Verbose

copy-item verbose лог

Несколько полезных скриптов с Copy-Item

Скопировать только файлы:

Get-ChildItem "C:\SourceFolder" -File -Recurse | Copy-Item -Destination "F:\DestFolder"

Скопировать структуру папок, без файлов:

$path = Get-ChildItem "C:\SourceFolder" -Recurse | ?
$dest = "F:\DestFolder\"
$parent = $path[0].Parent.Name
$path | foreach $_.FullName -match "$parent.+"
New-Item -ItemType directory ($dest + $Matches[0])
>

Copy-Item очень простой и удобный в использовании командлет PowerShell для выполнения операций копирования и перемещения файлов. В сочетании с другими инструментами PowerShell, Copy-Item также является мощным инструментом для написания скриптов.

Создание файлов и папок с Powershell New-Item с копированием и переименованием

Для работы с файлами в Powershell есть около 10 команд. С помощью команды New-Item можно создать файл или папку в Powershell, жесткую и мягкую ссылку. Copy-Item и Move-Item выполняют копирование и перемещение объектов. В этой стать мы рассмотрим все эти операции, а так же удаление директорий и файлов включая сетевые пути, на примерах.

Навигация по посту

Создание файлов

Создание файлов в Powershell New-Item

По умолчанию файл создается в той директории откуда был запущен сам Powershell. Изменить путь создания файла можно указав путь в Path:

Создание файлов по пути с Powershell New-Item

Создание каталогов с Powershell New-Item

Создание со вложенными директориями

Мы можем создать множество папок не указывая дополнительных параметров:

Если мы захотим создать директорию и файл, то получим ошибку:

Создание вложенных папок с Powershell New-Item

Перезапись

Ключ Force не только создает родительские объекты в виде папок, но и перезаписывает файлы. Если не указан параметр Force, а файл или папка уже существует - вы получите ошибки:

Указывая Force - файлы перезаписываются удаляя все содержимое. В случае с папками ничего удалено не будет.

Перезапись файлов с Powershell New-Item

Запись данных

Запись в файл с Powershell New-Item

Почти такой же результат будет если добавить в команду параметр Value. Результат следующего примера будет аналогичен предыдущему:

Запись в файл с Powershell New-Item

Мягкие и жесткие ссылки

Кроме файлов и директорий в ItemType можно указать следующие типы ссылок:

  • SymbolicLink (мягкая ссылка) - обычный ярлык на папку или директорию;
  • Junction - старый тип ссылок (до Windows Vista);
  • HardLink (жесткая ссылка) - ссылка на объект в файловой системе. Не работает с директориями.

Каждый файл можно представить как ссылку на объект файловой системы. Ярлык устанавливает связь с именем файла (ссылка на ссылку). При переименовании оригинального файла или его удалении ярлык перестает работать.

Жесткая ссылка работает иначе. Она ссылается на объект файловой системы, а не на имя. Поэтому при удалении или переименовании оригинального файла эта связь не потеряется. Такие ссылки можно представить как копии оригинальных фалов, но которые не занимают дополнительное место на диске. Жесткие ссылки работают в рамках одного раздела и их нельзя использовать на каталогах. Сам объект файловой системы (файл) будет существовать до последней такой ссылки.

Создание жестких ссылок с Powershell New-Item

Создание множества файлов и директорий

Параметр Path может принимать несколько значений. Это значит, что одной командой мы можем создать несколько объектов:

Создание нескольких файлов с Powershell New-Item

Можно использовать сочетания директорий и файлов, добавляя ключ Force тем самым избегая ошибок.

Открываем файл и читаем его содержимое с Get-Content в Powershell

Копирование и перемещение папок и файлов

Перемещение объектов выполняется так же, но с использованием Move-Item:

Если в перемещаемой папке уже существует файл с этим именем, то мы получим ошибку:

  • Move-Item : Cannot create a file when that file already exists

Для исправления этой ситуации можно использовать параметр Force или перемещать файл под другим именем. Новое имя можно указать в Destination:

Path - принимает список, а это значит, что мы можем указывать несколько значений через запятую.

Использование масок для копирования и перемещения

Во многих командах Powershell доступны следующие специальные символы:

  • * - говорит, что в этом месте есть неизвестное количество неизвестных символов;
  • ? - в этом месте есть один неизвестный символ;
  • [A,B,C] - в этом месте есть одна из следующих букв A,B,C.

Перемещение сработает так же.

Предыдущий вариант сработает, если мы ищем файлы в текущей директории. Для копирования в Powershell внутри всех вложенных каталогов нужно использовать рекурсивный поиск, который доступен только в Copy-Item. Рекурсивный поиск устанавливается ключом Recurse. В следующем примере будет найден и скопирован файл hosts. В качестве * я указал один из элементов неизвестного пути:

Копирование файлов с Powershell Copy-Item

Дополнительные параметры фильтрации

Если предыдущих примеров, где мы находили файлы с неизвестным название, не достаточно, то можно использовать дополнительные параметры. Они доступны в обеих командах Copy-Item и Move-Item:

  • Include - включает объекты с этим упоминанием;
  • Exclude - работает аналогично предыдущему, но исключает объекты;
  • Filter - включает объекты указанные в этом параметре.

Копирование множества файлов с Powershell Copy-Item

Создание и изменение в Powershell NTFS разрешений ACL

Переименование файлов и директорий

Для переименовывания в Powershell используется Rename-Item. В следующем примере мы укажем новое имя в параметре NewName:

В NewName можно указать путь, но он должен соответствовать источнику. При следующем написании будет ошибка:

  • Rename-Item : Cannot rename the specified target, because it represents a path or device name.

Переименовывание файлов с Powershell Rename-Item

Удаление

В следующем примере мы удалим файл:

Пустые каталоги в Powershell удаляются так же. Если в папке находятся другие файлы будет запрошено разрешение на удаление.

Удаление файлов с Powershell Remove-Item

Избежать таких вопросов можно использовав рекурсию в виде параметра Recurse:

У команды есть параметры, описанные ранее, в виде:

Работа с сетевыми папками и SMB

Для копирования и переноса данных по сети нужно использовать следующий формат:

Он сработает со всеми командами, как для источника так и для назначения:

Выполнение команд под другим пользователем

  • The FileSystem provider supports credentials only on the New-PSDrive cmdlet. Perform the operation again without specifying credentials.

Есть несколько способов обойти эти ограничения использовав методы WMI и CIM. В Powershell так же доступен сервис PSRemoting, который создан для выполнения задач удаленно. Мы можем использовать две команды:

  • New-PSItem - подключение к компьютеру и дальнейшая работы с ним;
  • Invoke-Command - одноразовое выполнение команды.

Этот сервис может не работать по умолчанию и нуждаться в дополнительных настройках. Этот процесс был описан в другой статье.

В следующем примере будет объявлена переменная в которой будет храниться логин и пароль нужной учетной записи:

Запрос учетных данных пользователя Powershell Get-Credential

После заполнения этой переменной нужно будет передать ее в параметр Credential. Примеры по работе с файлами удаленно от другого пользователя:

Читайте также: