Поиск по сайту:

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


PowerShell — отличный язык сценариев для написания самых разных скриптов. Но вы знали, что вы также можете скачать файл с помощью PowerShell? Вы можете использовать PowerShell для загрузки одного или нескольких файлов из интернета.

Существует несколько методов загрузки файлов с помощью PowerShell. Мы можем загружать файлы с любого URL с помощью PowerShell, локальных сетевых ресурсов и с защищенных паролем сайтов.

В этой статье мы начнем с самого простого метода загрузки одного файла, а также рассмотрим другие (более быстрые) методы загрузки файла с помощью PowerShell.

Скачивание файла по URL с помощью PowerShell

Мы начнем с самого распространенного способа загрузки файла по URL с помощью PowerShell. Для этого мы будем использовать командлет Invoke-WebRequest. Чтобы скачать файл, нам нужно знать исходный URL и указать место назначения для файла, который мы хотим скачать.

Параметр -OutFile обязателен. Вам не нужно вводить полный путь, но имя файла обязательно.

Source URL
$url = "http://speed.transip.nl/10mb.bin"

Destation file
$dest = "c:\temp\testfiles.bin"

Download the file
Invoke-WebRequest -Uri $url -OutFile $dest
Invoke-WebRequest перезапишет локальный файл, если он уже существует, без каких-либо предупреждений.

Аутентификация с помощью Invoke-WebRequest

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

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

URL and Destination
$url = "http://speed.transip.nl/10mb.bin"
$dest = "c:\temp\testfiles"

Define username and password
$username = 'LazyUsrName'
$password = 'StrongPlainTextPasswd'

Convert to SecureString
$secPassword = ConvertTo-SecureString $password -AsPlainText -Force

Create Credential Object
$credObject = New-Object System.Management.Automation.PSCredential ($username, $secPassword)

Download file
Invoke-WebRequest -Uri $url -OutFile $dest -Credential $credObject

Скачивайте файлы быстрее с помощью Start-BitsTransfer в PowerShell

Метод Invoke-WebRequest доступен во всех версиях PowerShell и также может использоваться на машинах с Linux. Но недостатком является то, что он немного медленный. С помощью Invoke-WebRequest файл сначала помещается в память, прежде чем он записывается на диск.

Быстрый и лучший способ — использовать командлет Start-BitsTransfer в PowerShell. Этот командлет позволяет добавлять файлы в очередь, устанавливать приоритет (полезно для ограничения пропускной способности), может работать в фоновом режиме и загружать несколько файлов асинхронно.

Это самый простой способ загрузки файла с помощью BitsTransfer, вам только нужно указать источник и место назначения.

URL and Destination
$url = "http://speed.transip.nl/10mb.bin"
$dest = "c:\temp\testfiles"

Download file
Start-BitsTransfer -Source $url -Destination $dest 

По умолчанию задачи скачивания выполняются в фоновом режиме, используя максимальную доступную пропускную способность. Вы можете изменить это, установив приоритет задачи:

  • Передний план - По умолчанию
  • Высокий
  • Нормально
  • Низкий

Только неиспользуемая пропускная способность сети используется, когда вы устанавливаете приоритет на высокий, нормальный или низкий.

Другим вариантом является выполнение задачи загрузки асинхронно, что позволяет вам запускать несколько задач загрузки одновременно. Когда вы используете этот метод, обязательно завершите задачу загрузки, когда она будет завершена.

Start-BitsTransfer -Source $url -Destination $dest -Asynchronous -Priority normal

Как вы можете видеть, я загрузил тот же файл .bin, что и раньше. Но если мы посмотрим в папку назначения, мы видим только файл .tmp.

Вам нужно выполнить Complete-BitsTransfer, чтобы завершить загрузку.

Get-BitsTransfer | Complete-BitsTransfer

Загрузка нескольких файлов с помощью PowerShell

Чтобы загрузить несколько файлов с помощью PowerShell, нам сначала нужно узнать, какие файлы доступны. Мы можем сначала использовать командлет Invoke-WebRequest, чтобы получить содержимое с веб-страницы.

Если вы посмотрите на содержимое http://speed.transip.nl, вы увидите список двоичных файлов, которые мы можем скачать.

Сначала мы собираемся собрать данные с веб-сайта

$content = Invoke-WebRequest -URI "http://speed.transip.nl"

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

Это довольно простая веб-страница, но скажем, что мы хотим только файлы, начинающиеся с имени "random". Мы можем отфильтровать ссылки с помощью простого запроса like и выбрать только свойство href из каждой ссылки.

$randomBinFiles = $content.links | where {$_.innerHTML -like 'random*'} | select href

Итак, теперь у нас есть ссылки на все случайные бинарные файлы. Все, что нам нужно сделать, - это скачать каждый из них.

Когда вам нужно скачать несколько файлов, лучше воспользоваться командлетом Start-BitsTransfer. Он позволяет загружать несколько файлов одновременно в фоновом режиме с параметром -Asynchronous.

Другие преимущества командлета BitsTransfer заключаются в том, что он может справляться с перерывами в соединении и учитывает использование вашей сетевой пропускной способности.

$url = "http://speed.transip.nl"

Create full links for each entry
$randomBinFiles.foreach( { $_.href = $url + "/" + $_.href })

Download each file in the background
$randomBinFiles.foreach({
    Start-BitsTransfer ($url + "/" + $_.href) -Asynchronous
})

Complete the BitsTransfer
Get-BitsTransfer | Complete-BitsTransfer

Мы можем начать все задания на скачивание, используя параметр Asynchronous. Без него cmdlet BitsTransfer полностью загружает первый файл, прежде чем начать следующую загрузку, при этом приостанавливая выполнение вашего скрипта.

Вы можете использовать командлет Get-BitTransfer для отображения процесса загрузки. Если вы хотите остановить задание загрузки, затем используйте командлет Remove-BitTransfer. Вы можете остановить отдельное задание по его JobId или все задания с помощью:

Get-BitsTransfer | % {Remove-BitsTransfer $_.JobId}

Закончите загрузку BitsTransfer

Важно завершить переданный файл при использовании BitsTransfer в сочетании с параметром Asynchronous. При использовании Asynchronous создаётся временный файл в процессе загрузки. Но чтобы фактически использовать файл, вам нужно будет выполнить следующую команду:

Get-BitsTransfer | Complete-BitsTransfer

PowerShell загрузить файл с сервера

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

Командлет Copy-Items принимает источник и назначение, как и командлет Invoke-WebRequest.

Set Source and destination
$source = "\\LA-WIN10-LAB01\speedtest\"
$destination = "c:\temp\testfiles"

Copy all items in the source folder
Copy-Item -path $source -Destination $destination -Recurse

Если вы хотите узнать больше о команде Copy-Item, вам следует прочитать эту статью, в которой я подробнее рассказываю о команде и альтернативах.

Скачать zip-файл с помощью PowerShell

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

Я собираюсь использовать этот образец csv на GitHub, который мы можем скачать в zip-файле. Нам нужно установить место назначения для самого zip-файла и путь, куда мы хотим извлечь файлы.

Команда Invoke-WebRequest загружает zip-файл так же, как и любой другой файл.

URL and Destination
$url = "https://github.com/datapackage-examples/sample-csv/archive/refs/heads/master.zip"

Create temp destination for the zip and get zipfile name from source URL
$zipFile = "c:\temp\zipfiles" + $(Split-Path -Path $Url -Leaf)

Extract path
$extractPath = "c:\temp\zipfiles"

Download file
Invoke-WebRequest -Uri $url -OutFile $zipFile

Следующим шагом является автоматическое извлечение zip-файла в нужное место. Для этого мы собираемся использовать объект COM. С помощью объекта COM мы можем извлечь zip-файл и скопировать его содержимое в нужное место.

Create instance of COM Object
$objShell = New-Object -ComObject Shell.Application

Extract the Files
$extractedFiles = $ObjShell.NameSpace($zipFile).Items()

Copy the extracted files to the destination folder
$ObjShell.NameSpace($extractPath).CopyHere($extractedFiles)

Заключение

Скачивание файлов с помощью PowerShell довольно просто, когда у вас есть точный URL-адрес исходного файла. Когда нужно сначала собрать данные с веб-сайта, может потребоваться немного больше времени, чтобы настроить все правильно.

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

Если у вас есть какие-либо вопросы о том, как скачать файл с помощью PowerShell, оставьте комментарий ниже.