Родная альтернатива wget в Windows PowerShell?
Я знаю, что могу загрузить и установить вышеупомянутую библиотеку (wget для Windows), но у меня такой вопрос:
В Windows PowerShell есть собственная альтернатива wget
?
я нуждаюсь wget
просто получить файл с заданного URL с помощью HTTP GET. Например:
wget http://www.google.com/
12 ответов
Вот простой PS 3.0 и более поздний однострочный, который работает и не требует большого количества PS barf:
wget http://blog.stackexchange.com/ -OutFile out.html
Обратите внимание, что:
wget
это псевдоним дляInvoke-WebRequest
- Invoke-WebRequest возвращает HtmlWebResponseObject, который содержит множество полезных свойств для разбора HTML, таких как ссылки, изображения, формы, поля ввода и т. Д., Но в этом случае мы просто используем необработанный контент
- Содержимое файла хранится в памяти перед записью на диск, что делает этот подход непригодным для загрузки больших файлов
При установке Windows Server Core вам нужно записать это как
wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
До 20 сентября 2014 года я предложил
(wget http://blog.stackexchange.com/).Content >out.html
как ответ. Однако это работает не во всех случаях, так как
>
оператор (который является псевдонимом дляOut-File
) преобразует ввод в Unicode.
Если вы используете Windows 7, вам необходимо установить версию 4 или более новую платформу Windows Management Framework.
Вы можете обнаружить, что делаете $ProgressPreference = "silentlyContinue"
до Invoke-WebRequest
значительно улучшит скорость загрузки с большими файлами; эта переменная контролирует, отображается ли пользовательский интерфейс прогресса.
Если вам просто нужно получить файл, вы можете использовать метод DownloadFile объекта WebClient:
$client = New-Object System.Net.WebClient
$client.DownloadFile($url, $path)
куда $url
является строкой, представляющей URL файла, и $path
представляет локальный путь, в который будет сохранен файл.
Обратите внимание, что $path
должен включать имя файла; это не может быть просто каталог.
Есть Invoke-WebRequest
в следующей версии PowerShell 3:
Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html
Это немного грязно, но есть этот пост в блоге, который дает вам инструкции для загрузки файлов.
В качестве альтернативы (и это я бы порекомендовал) вы можете использовать биты:
Import-Module BitsTransfer
Start-BitsTransfer -source "http://urlToDownload"
Он покажет прогресс и загрузит файл в текущий каталог.
Если ваша Windows достаточно новая (например, версия 1809 или новее), есть "настоящий" локоть. curl имеет параметр командной строки "-O" (заглавная буква O; строчная буква не будет делать то же самое!) Опция "-O", альтернатива "--remote-name" сообщает curl, что сохраненный файл получает same name as the file-name part of the URL.
One needs to start this as "curl.exe", to discern it from the Alias "curl" for "Invoke-WebRequest". Incidentally it works in cmd.exe without changes.
Using the same example as in another answer here
curl.exe -O http://demo.mediacore.tv/files/31266.mp4
(The site won't allow me to add this as a comment, since I apparently need more "reputation" for that - so it gets a new answer)
PowerShell V4 One-liner:
(iwr http://blog.stackexchange.com/).Content >index.html`
или же
(iwr http://demo.mediacore.tv/files/31266.mp4).Content >video.mp4
Это в основном Уоррен (удивительный) однострочный V3 (спасибо за это!) - с небольшим изменением, чтобы заставить его работать в PowerShell V4.
Однострочник Уоррена - который просто использует wget
скорее, чем iwr
- все еще должен работать для V3 (по крайней мере, я думаю; не проверял, хотя). Тем не мение. Но при попытке выполнить его в PowerShell V4 (как я пытался) вы увидите, что PowerShell не удается разрешить wget
как действительный командлет / программа.
Для тех, кто заинтересован, это - как я понял из Bob в ответ на принятый ответ (спасибо, мужик!) - потому что в PowerShell V4, wget
а также curl
связаны с Invoke-WebRequest
, установлен в iwr
по умолчанию Таким образом, wget
не может быть решена (а также curl
здесь не может работать).
Вот функция PowerShell, которая разрешает короткие URL-адреса перед загрузкой файла
function Get-FileFromUri {
param(
[parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
[string]
[Alias('Uri')]
$Url,
[parameter(Mandatory=$false, Position=1)]
[string]
[Alias('Folder')]
$FolderPath
)
process {
try {
# resolve short URLs
$req = [System.Net.HttpWebRequest]::Create($Url)
$req.Method = "HEAD"
$response = $req.GetResponse()
$fUri = $response.ResponseUri
$filename = [System.IO.Path]::GetFileName($fUri.LocalPath);
$response.Close()
# download file
$destination = (Get-Item -Path ".\" -Verbose).FullName
if ($FolderPath) { $destination = $FolderPath }
if ($destination.EndsWith('\')) {
$destination += $filename
} else {
$destination += '\' + $filename
}
$webclient = New-Object System.Net.webclient
$webclient.downloadfile($fUri.AbsoluteUri, $destination)
write-host -ForegroundColor DarkGreen "downloaded '$($fUri.AbsoluteUri)' to '$($destination)'"
} catch {
write-host -ForegroundColor DarkRed $_.Exception.Message
}
}
}
Используйте это так, чтобы загрузить файл в текущую папку:
Get-FileFromUri http://example.com/url/of/example/file
Или загрузить файл в указанную папку:
Get-FileFromUri http://example.com/url/of/example/file C:\example-folder
Следующая функция получит URL.
function Get-URLContent ($url, $path) {
if (!$path) {
$path = Join-Path $pwd.Path ([URI]$url).Segments[-1]
}
$wc = New-Object Net.WebClient
$wc.UseDefaultCredentials = $true
$wc.Proxy.Credentials = $wc.Credentials
$wc.DownloadFile($url, $path)
}
Некоторые комментарии:
- Последние 4 строки нужны, только если вы находитесь за прокси-сервером аутентификации. Для простого использования
(New-Object Net.WebClient).DownloadFile($url, $path)
работает отлично. - Путь должен быть абсолютным, так как загрузка не выполняется в текущем каталоге, поэтому относительные пути приведут к потере загрузки.
if (!$path) {...}
section обрабатывает простой случай, когда вы просто хотите загрузить файл в текущий каталог, используя имя, указанное в URL.
Используйте оболочку Windows 10 bash, которая включает wget после настройки Windows.
Как установить оболочку Ubuntu Bash на Windows:
PowerShell Invoke-RestMethod может иметь меньше зависимостей, чем другие методы... если у вас установлен минимальный (или более старый) Windows Server.
См. сообщение об ошибке при запуске Invoke-WebRequest от имени системной учетной записи :
Invoke-WebRequest: невозможно проанализировать содержимое ответа, поскольку ядро Internet Explorer недоступно или конфигурация первого запуска Internet Explorer не завершена. Укажите параметр UseBasicParsing и повторите попытку.
Это может быть альтернативой применению-UseBasicParsing
опция, которая в некоторых случаях требуется приwget
илиInvoke-WebRequest
.
Однако отображаемый ответ может быть в другом формате в зависимости от анализа данных:
PowerShell форматирует ответ в зависимости от типа данных. Для канала RSS или ATOM PowerShell возвращает XML-узлы Item или Entry. Для нотации объектов JavaScript (JSON) или XML PowerShell преобразует или десериализует содержимое в объекты [PSCustomObject].
Invoke-WebRequest с параметром -outfile ожидает строку, поэтому, если ваше имя файла начинается с цифры и не заключено в кавычки, выходной файл не создается.
например. Invoke-WebRequest -Uri " http://www.google.com/" -outfile "2.pdf"
Это не влияет на имена файлов, начинающиеся с буквы.
Это должно работать для вас, чтобы обойти браузер без инициализации вещи. Обратите внимание на параметр -UseBasicParsing.
Invoke-WebRequest http://localhost -UseBasicParsing