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

Введение
PowerShell — бесплатный инструмент автоматизации от Microsoft. Он позволяет управлять системой и автоматизировать задачи в Windows и (в более новых версиях) кросс-платформенно. Одна из частых задач — автоматическая загрузка файлов из интернета. Ниже приведён понятный и практичный набор приёмов для этого.
Важно: в примерах использованы общие URL и локальные пути. Замените их на свои значения.
Базовый синтаксис: Invoke-WebRequest
Самая распространённая команда для загрузки файла — Invoke-WebRequest с параметром -OutFile.
$source = 'https://www.majorgeeks.com/files/details/4diskclean_free.html/4dskcln.exe'
$destination = 'C:\programfiles\newfolder\4dskcln.exe'
Invoke-WebRequest -Uri $source -OutFile $destinationПояснения:
- $source — адрес (URI) файла в сети.
- $destination — полный путь и имя файла на диске.
- Invoke-WebRequest загружает по HTTP/HTTPS и сохраняет содержимое в указанный файл.
Если сервер требует аутентификацию, создайте учётные данные и передайте их в командлет:
$credential = Get-Credential
Invoke-WebRequest -Uri $source -OutFile $destination -Credential $credentialGet-Credential откроет стандартное окно ввода логина и пароля и вернёт объект PSCredential.
Альтернативы и когда их использовать
- Start-BitsTransfer — полезен для фоновой и надёжной передачи, автоматически восстанавливает прерванные загрузки. Доступен преимущественно в Windows:
Start-BitsTransfer -Source $source -Destination $destination- System.Net.WebClient — устаревающий, но простой метод, работает в многих средах PowerShell:
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($source, 'C:\programfiles\newfolder\4dskcln.exe')
$wc.Dispose()- PowerShell 7+ (PowerShell Core) — Invoke-WebRequest присутствует, но поведение парсинга HTML и некоторые опции отличаются от Windows PowerShell.
Когда простой Invoke-WebRequest может не сработать
- URL возвращает HTML-страницу с перенаправлением или кнопкой загрузки (нужна имитация клика или анализ HTML).
- Требуется OAuth, токены или нестандартная аутентификация (нужна предварительная обработка заголовков).
- HTTPS с самоподписанным сертификатом — соединение может быть заблокировано.
- Система блокирует исходящий трафик (фаервол, прокси) или доступ запрещён по политике компании.
Важно: если сервер возвращает не «сырой» файл, а страницу с JavaScript, Invoke-WebRequest не выполнит скрипт — нужно использовать альтернативы (инструмент автоматизации браузера или API).
Практическая шпаргалка (cheat sheet)
- Быстрая загрузка:
Invoke-WebRequest -Uri $url -OutFile $path- С учётными данными:
$cred = Get-Credential
Invoke-WebRequest -Uri $url -OutFile $path -Credential $cred- Фоновые/устойчивые загрузки:
Start-BitsTransfer -Source $url -Destination $path- Проверка результата:
if (Test-Path $path) { Write-Host 'Загрузка прошла успешно' } else { Write-Host 'Ошибка загрузки' }Критерии приёмки
- Файл появился по ожидаемому пути и имеет ненулевой размер.
- Контрольная сумма совпадает с ожидаемой (если доступна).
- Установлены корректные права доступа (если требуется).
Пример проверки SHA256:
$expected = 'ваша_ожидаемая_хеш_строка'
$actual = (Get-FileHash -Path $destination -Algorithm SHA256).Hash
if ($actual -eq $expected) { Write-Host 'Хеш совпадает' } else { Write-Host 'Несоответствие хеша' }Политика безопасности и хардэннинг
- Всегда загружайте файлы из доверенных источников.
- Не запускайте скачанные исполняемые файлы без проверки подписи и хеша.
- Используйте HTTPS и проверяйте сертификаты.
- Для критичных сценариев проверяйте подпись Authenticode или подпись пакета.
- Не храните пароли в явном виде — используйте Get-Credential или защищённые хранилища (Credential Manager, Azure Key Vault).
Роли и чек-лист (Admin vs обычный пользователь)
Администратор:
- Убедиться, что порт/политики позволяют исходящие HTTP/HTTPS.
- Настроить папку назначения и права доступа.
- Автоматизировать проверку хешей и подписи.
Обычный пользователь:
- Указать корректный путь сохранения и имя файла.
- Не запускать исполняемый файл без разрешения администратора.
Советы по совместимости и миграции
- Start-BitsTransfer: работает в Windows PowerShell; в кросс-платформенном PowerShell Core эта команда может быть недоступна.
- Invoke-WebRequest: присутствует и в PowerShell Core, но поведение парсинга HTML могло измениться; тестируйте скрипты при переходе на PowerShell 7+.
- WebClient: пригоден для простых сценариев, но в новых проектах лучше использовать Invoke-WebRequest или HttpClient.
Тестовые сценарии (основные)
- Успешная загрузка маленького файла (HTTP/HTTPS).
- Загрузка большого файла и возобновление при прерывании (Start-BitsTransfer).
- Попытка загрузки с неверными учётными данными — ожидается ошибка 401/403.
- Загрузка с перенаправлением — убедиться, что конечный файл получен.
Быстрые примеры: полные скрипты
Пример 1 — простая загрузка:
$source = 'https://www.majorgeeks.com/files/details/4diskclean_free.html/4dskcln.exe'
$destination = 'C:\programfiles\newfolder\4dskcln.exe'
Invoke-WebRequest -Uri $source -OutFile $destinationПример 2 — загрузка с проверкой хеша:
$source = 'https://example.com/file.zip'
$destination = 'C:\temp\file.zip'
Invoke-WebRequest -Uri $source -OutFile $destination
$hash = (Get-FileHash -Path $destination -Algorithm SHA256).Hash
if ($hash -ne 'ожидаемый_хеш') { throw 'Хеш не совпадает' }Краткое резюме
PowerShell предлагает несколько способов скачать файл: Invoke-WebRequest — простой и универсальный, Start-BitsTransfer — для устойчивых фоновых загрузок, а WebClient — для совместимости. Выбор зависит от требований к надёжности, совместимости и безопасности.
Заметки:
- Проверьте различия между версиями PowerShell при переносе скриптов.
- Всегда проверяйте целостность и источник скачанных файлов.
Спасибо за внимание — попробуйте варианты в тестовой среде и добавьте проверку хешей в ваши сценарии автоматизации.
Похожие материалы
Загрузочный USB‑диск с Windows — инструкция
Как отключить безопасный режим в Tumblr
Копирование пользовательских представлений Outlook
Очистка Docker-образов и освобождение места
Обновить Cube WP10 до Anniversary Update