Powershell скачать файлы с веб сервера. Как с помощью PowerShell загрузить файл на компьютер? Парсинг HTML страниц с помощью Powershell

Обновлено: 27.11.2017 Опубликовано: 06.05.2017

Для загрузки файлов из Интернета в Powershell предусмотрен метод DownloadFile, которому нужно передать два аргумента — что скачиваем и куда.

Скачать по HTTP или HTTPS

DownloadFile

Пример скрипта:

$download_url = "http://download_ahyware/file1.zip"

* в данном примере мы скачаем файл http://download_ahyware/file1.zip и разместим его на компьютере по пути C:\Downloads\file1.zip .

Invoke-WebRequest

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

Invoke-WebRequest -URI https://www..zip -outfile c:\temp\winsetupfromusb.zip

* где URI — путь-источник (что скачиваем); outfile — путь-назначение (куда скачиваем).

Для удобства можно использовать команду wget — по сути, это алиас на Invoke-WebRequest.

Скачать с FTP

Принцип скачивания файлов с FTP -сервера такой же, за исключением того, что сначала необходима авторизация.

Пример скрипта:

$download_url = "ftp://download_ahyware/file1.zip"
$local_path = "C:\Downloads\file1.zip"
$user = "myFtpUser"
$pass = "myPassword123"

$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.NetworkCredential($user, $pass)
$WebClient.DownloadFile($download_url, $local_path)

Распаковываем архив

Чаще всего, файлы в сети Интернет хранятся в сжатом виде. Поэтому, после загрузки файла есть необходимость его распаковать. Для этого в Powershell можно использовать следующую команду:

Expand-Archive $archive_file.zip -DestinationPath C:\Unzip\

Однако, не все версии Powershell поддерживают командлет Expand-Archive. В таком случае можно вызвать стороннее приложение, например 7-zip . Пример скрипта:

set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"
sz x -r C:\Downloads\file1.zip -oC:\Unzip\

Возможные ошибки

Исключение при вызове downloadfile с 2 аргументами исключение во время запроса webclient

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

Решение: проверяем путь или пробуем указать другой.

Снова поговорим о замечательном инструменте PowerShell. Данный интерфейс я буду обозревать на Windows 10. Кто не знает, вот .

Итак, PowerShell может реализовать множество различных функций, и во многом превосходит обычную командную строку. Конечно, данный инструмент тоже может выполнять, например, удаление приложений, как и с помощью командной строки. А вот с помощью PowerShell мы можем загрузить файл из интернета туда, куда захотим, например, в Dropbox. Если заинтересовало, как с помощью PowerShell загрузить файл на компьютер, то продолжаем читать.

Как с помощью PowerShell загрузить файл на компьютер?

В данном примере, нам понадобится вот такая команда:

Как видите, все просто. Вместо «Ссылка на скачивания» мы указываем ссылку на необходимый файл, который необходимо скопировать. Запомните, команда должна быть именно такой, не пропустите необходимые кавычки и скобки. В «Путь к файлу» мы указываем, куда будем сохранять наш файл, не забудьте в конце дописывать название файла и его расширение.

Таким образом, мы получаем в пример следующую команду:

Если вы хотите загрузить файл в Dropbox или какой-то другой подобный сервис, то в эту службу, конечно, нужно будет войти, для этого, мы между уже данными командами вставим еще одну:

Убедитесь, что у вас есть прямая ссылка на скачиваемый файл, иначе, у вас может ничего не получится. А на этом все, это был, так сказать, краткий экскурс возможностей утилиты PowerShell, у нас еще будет много статей о данном инструменте.

В PowerShell версии 3.0 появилась возможность напрямую обращаться и работать с HTML веб-страницам в Интернете. Для этого был разработан специальный командлет Invoke-WebRequest . Данный командлет позволяет реализовать множество сценариев: начиная от возможности скачать/ загрузить файл с/на любого веб-сайта по HTTP/ HTTPS/ FTP, заканчивая возможностями парсинга HTML страниц, мониторинга состояния веб серверов, заполнения и отправкой веб-форм. В целом, новый командлет предоставляет все необходимые методы для навигации по DOM дереву HTML документа. В этой статье мы разберём базовые примеры работы с командлетом PowerShell Invoke-WebRequest.

Совет . Командлет Invoke-WebRequest доступен в Windows PowerShell 3.0, поэтому перед началом работы убедитесь, что у вас используется эта или более свежая версия. Если на компьютере установлено несколько версий Posh, переключиться между ними можно .

Использование командлета Invoke-WebRequest

Командлет Invoke -WebRequest (псевдоним wget) может отправлять и получать HTTP, HTTPS и FTP запросы, обрабатывать возвращаемый сервером ответ. Полученный ответ представляет собой набор коллекции форм, ссылок, изображений и других важных элементов HTML документа.

Попробуем выполнить следующую команду:

Invoke-WebRequest -Uri "http://сайт"

Как вы видите, возвращенный ответ представляет собой не простой HTML код страницы. Вы видите различные свойства web-документа. Командлет Invoke-WebRequest, как и большинство других командлетов PowerShell оперирует объектами. Invoke-WebRequest возвращает объект типа HtmlWebResponseObject . Посмотрим все свойства данного объекта:

$WebResponseObj = Invoke-WebRequest -Uri "http://сайт"
$WebResponseObj| Get-Member

Чтобы получить сырой HTML код веб страницы, который содержится в данном объекте, выполните:

$WebResponseObj.content

Вы можете вернуть HTML код вместе с HTTP заголовками, которые вернул веб сервер:

$WebResponseObj.rawcontent

Вы можете проверить только код ответа веб-сервера и HTTP заголовки HTML страницы:

$WebResponseObj.Headers

Как вы видите, веб сервер вернул ответ 200 , т.е. запрос выполнен успешно и веб сервер доступен и работает корректно.

Получаем список всех HTML ссылок на странице

Обратимся к главной странице нашего сайта и получим список ссылок, имеющихся на ней:
$SiteAdress = "http://сайт"

$HttpContent.Links | Foreach {$_.href }

$HttpContent.Links | fl innerText, href

$HttpContent.Links | Where-Object {$_.class -eq "page-numbers"} | fl innerText, href

Или определенным текстом в url:

$HttpContent.Links | Where-Object {$_.href -like "*exchange*"} | fl innerText,href

Парсинг HTML страниц с помощью Powershell

Командлет Invoke-WebRequest позволяет довольно быстро и удобно парсить содержимое любых веб-страниц. При обработке HTML страницы из ее содержимого формируются коллекции ссылок (links), веб-форм (forms), изображений (images), скриптов (scripts) и т.д.

С помощью Powershell получим содержимое главной страницы нашего сайта:

$Img = Invoke-WebRequest "http://сайт/"

Затем выведем список всех изображений на данной странице:

Сформируем коллекцию из полных url путей к используемым изображениям:

$images = $Img.Images | select src

Инициализируем новый экземпляр класса WebClient:

$wc = New-Object System.Net.WebClient

И скачаем все изображения со страницы (с оригинальными именами) в каталог c:\tools\:

$images | foreach { $wc.DownloadFile($_.src, ("c:\tools\"+::GetFileName($_.src))) }

В качестве интересного примера использования командлета Invoke-WebRequest можно привести способ .

Как скачать файл по HTTP с помощью PowerShell

Invoke-WebRequest может работать как аналог Wget или cURL для Windows, позволяя скачать с веб-страницы или ftp сайта нужный файл или файлы. Допустим, нам нужно с помощью PowerShell скачать по HTTP некий файл (в нашем примере дистрибутив Mozilla Firefox). Выполним такую команду:

Invoke-WebRequest "https://download.mozilla.org/?product=firefox-32.0.3-SSL&os=win&lang=ru" -outfile “c:\tools\firefox setup 32.0.3.exe”

В результате выполнения командлета с указанного URL адреса будет скачан файл и сохранен в каталоге c:\tools\ под именем firefox setup 32.0.3.exe. Если нужно скачать файл с FTP сайта, просто замените http: // на ftp: //.

Таким образом вы с легкостью можете на определенной веб-странице найти все ссылки, попадающие под конкретные критерии (класс ссылки, разрешение в имени файла, url адрес), и скачать файлы по полученным ссылкам. Например, имеется некий сайт с кучей ссылок на PDF документы. Ваша задача скачать все эти файлы на ваш компьютер. Костяк PowerShell скрипта для массовой скачки файлов может выглядеть так:

$OutDir="C:\Downloads\docs\PDF"
$SiteAdress = "https://www.site.ru/free-pdf-books/"
$HttpContent = Invoke-WebRequest -URI $SiteAdress
$HttpContent.Links | Where-Object {$_.href -like "*.pdf"} | %{Invoke-WebRequest -Uri $_.href -OutFile ($OutDir + $(Get-Random 100000)+".pdf")}

В результате выполнения скрипта в целевом каталоге будут загружены все pdf файлы со страницы. Каждый файл сохраняется под произвольным именем.

В PowerShell 6.1 команделт Invoke-WebRequest поддерживает режим докачки. Таким образом с помощью параметра Invoke-WebRequest -Uri $Uri -OutFile $OutFile –Resume вы можете возобновить загрузку файла в случае падения канала или сервера.

Заполнение и отправка веб-форм на Powershell

Многие веб-сервисы для работы требуют ввода различных данных в HTML формы. С помощью Invoke -WebRequest можно получить доступ к любой HTML-форме, заполнить необходимые поля и передать заполненную форму обратно на сервер. В этом примере мы покажем, как с помощью Powershell авторизоваться в почтовом ящике популярного российского сервиса mail.ru через его стандартную веб форму.

С помощью следующей конструкции сохраним информацию о куках (Cookies) подключения в отдельной сессионной переменной:

$mailru = Invoke-WebRequest https://e.mail.ru/login -SessionVariable session

Следующей командой отобразим список заполняемых полей в HTML форме авторизации (форма называется LoginExternal):

$mailru.Forms["LoginExternal"].Fields

Присвоим нужные значения всем полям:

$mailru.Forms["LoginExternal"].Fields["Login"] = "[email protected]"

$mailru.Forms["LoginExternal"].Fields["Password"] = "Str0NgP$$w0rd"

Чтобы передать заполненную форму на веб сервер, вызовем атрибут HTML-формы action.

$Log = Invoke-WebRequest -method POST -URI ("https://e.mail.ru/login" + $mailru.Forms["LoginExternal"].Action) -Body $mailru.Forms["LoginExternal"].Fields -WebSession $session

Недостатки командлета Invoke-WebRequest

Одним из существенных недостатком командлета Invoke-WebRequest является довольно низкая скорость работы. При загрузке файла HTTP поток целиком буферизируется в память, и только после окончания полной загрузки сохраняется на диск. Таким образом, при закачке больших файлов можно столкнутся с нехваткой памяти.

Другая проблема – командлет Invoke-WebRequest тесно связан с Internet Explorer. Например, в редакциях Windows Server Core, в которых IE не установлен, командлет Invoke-WebRequest использовать нельзя.

Если на HTTP сайте используется , то командлет Invoke-WebRequest отказывается получать данные с него. Чтобы игнорировать некорректный SSL сертификат, используйте следующий код:

Игнорировать SSL сертификат можно так:
add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy: ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
::CertificatePolicy = New-Object TrustAllCertsPolicy
$result = Invoke-WebRequest -Uri "https://site.ru"