Копирование файлов на ftp powershell
Я хочу использовать 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
так проблему с ошибкой решил. ура.
вот код рабочий.
Как зайти на домашний FTP сервер
Я не понимаю как зайти на домашний FTP сервер, я его создал а зайти не знаю как, создавал через.
Как проверить, запущен ли ftp сервер?
На машине должны быть запущены: апачь, лайт манагэ и ftp, на маршрутизаторе открыты порты: 80, 5650.
Загрузка файла на ftp сервер
получаю от сервера ответ 226, загрузка окончено загружено 576 байт, но самого файла на ftp-сервере.
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 файлов
Для перезаписи файла с атрибутом read-only, нужно использовать ключ -Force. Если его не использовать, вы получите ошибку “отказано в доступе по пути… 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 символа * или с помощью символа ?. Также поддерживаются некоторые регулярные выражения
Для примера возьмём такую структуру файлов:
Выполним копирование командой:
Copy-Item -Path "C:\SourceFolder\fol*" -Destination "F:\DestFolder\"
Результат в F:\DestFolder\
Теперь чистим папку назначения и выполняем:
Copy-Item -Path "C:\SourceFolder\folder1" -Destination "F:\DestFolder\"
Папка без цифры в окончании не скопировалась, потому что 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
Если WSMan не настроен, вы можете выполнить его быструю конфигурацию. Для этого откройте командную строку с правами администратора и выполните 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.
Ключ Verbose
При использовании ключа -Verbose вы получите подробный лог операций копирования. Например, вывод команды
Copy-Item -Path "C:\SourceFolder\*.txt" -Destination "F:\DestFolder\" -Recurse -Force -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 есть около 10 команд. С помощью команды New-Item можно создать файл или папку в Powershell, жесткую и мягкую ссылку. Copy-Item и Move-Item выполняют копирование и перемещение объектов. В этой стать мы рассмотрим все эти операции, а так же удаление директорий и файлов включая сетевые пути, на примерах.
Навигация по посту
Создание файлов
По умолчанию файл создается в той директории откуда был запущен сам Powershell. Изменить путь создания файла можно указав путь в Path:
Создание со вложенными директориями
Мы можем создать множество папок не указывая дополнительных параметров:
Если мы захотим создать директорию и файл, то получим ошибку:
Перезапись
Ключ Force не только создает родительские объекты в виде папок, но и перезаписывает файлы. Если не указан параметр Force, а файл или папка уже существует - вы получите ошибки:
Указывая Force - файлы перезаписываются удаляя все содержимое. В случае с папками ничего удалено не будет.
Запись данных
Почти такой же результат будет если добавить в команду параметр Value. Результат следующего примера будет аналогичен предыдущему:
Мягкие и жесткие ссылки
Кроме файлов и директорий в ItemType можно указать следующие типы ссылок:
- SymbolicLink (мягкая ссылка) - обычный ярлык на папку или директорию;
- Junction - старый тип ссылок (до Windows Vista);
- HardLink (жесткая ссылка) - ссылка на объект в файловой системе. Не работает с директориями.
Каждый файл можно представить как ссылку на объект файловой системы. Ярлык устанавливает связь с именем файла (ссылка на ссылку). При переименовании оригинального файла или его удалении ярлык перестает работать.
Жесткая ссылка работает иначе. Она ссылается на объект файловой системы, а не на имя. Поэтому при удалении или переименовании оригинального файла эта связь не потеряется. Такие ссылки можно представить как копии оригинальных фалов, но которые не занимают дополнительное место на диске. Жесткие ссылки работают в рамках одного раздела и их нельзя использовать на каталогах. Сам объект файловой системы (файл) будет существовать до последней такой ссылки.
Создание множества файлов и директорий
Параметр Path может принимать несколько значений. Это значит, что одной командой мы можем создать несколько объектов:
Можно использовать сочетания директорий и файлов, добавляя ключ 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. В качестве * я указал один из элементов неизвестного пути:
Дополнительные параметры фильтрации
Если предыдущих примеров, где мы находили файлы с неизвестным название, не достаточно, то можно использовать дополнительные параметры. Они доступны в обеих командах Copy-Item и Move-Item:
- Include - включает объекты с этим упоминанием;
- Exclude - работает аналогично предыдущему, но исключает объекты;
- Filter - включает объекты указанные в этом параметре.
Создание и изменение в Powershell NTFS разрешений ACL
Переименование файлов и директорий
Для переименовывания в Powershell используется Rename-Item. В следующем примере мы укажем новое имя в параметре NewName:
В NewName можно указать путь, но он должен соответствовать источнику. При следующем написании будет ошибка:
- Rename-Item : Cannot rename the specified target, because it represents a path or device name.
Удаление
В следующем примере мы удалим файл:
Пустые каталоги в Powershell удаляются так же. Если в папке находятся другие файлы будет запрошено разрешение на удаление.
Избежать таких вопросов можно использовав рекурсию в виде параметра 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 - одноразовое выполнение команды.
Этот сервис может не работать по умолчанию и нуждаться в дополнительных настройках. Этот процесс был описан в другой статье.
В следующем примере будет объявлена переменная в которой будет храниться логин и пароль нужной учетной записи:
После заполнения этой переменной нужно будет передать ее в параметр Credential. Примеры по работе с файлами удаленно от другого пользователя:
Читайте также: