Alternativa nativa para o wget no Windows PowerShell?

253

Eu sei que posso baixar e instalar a biblioteca mencionada (wget para Windows), mas minha pergunta é:

No Windows PowerShell, existe uma alternativa nativa para wget ?

Eu preciso de wget simplesmente para recuperar um arquivo de um determinado URL com HTTP GET. Por exemplo:

wget http://www.google.com/
    
por jsalonen 28.11.2011 / 10:56

8 respostas

207

Aqui está um simples one-liner para o PS 3.0 e posterior que funciona e não envolve muito PS:

wget http://blog.stackexchange.com/ -OutFile out.html

Observe que:

  • wget é um alias para Invoke-WebRequest
  • O Invoke-WebRequest retorna um HtmlWebResponseObject , que contém muitas propriedades de análise de HTML úteis, como Links, Imagens, Formulários, InputFields, etc., mas neste caso estamos apenas usando o conteúdo bruto
  • O conteúdo do arquivo é armazenado na memória antes de ser gravado no disco, tornando essa abordagem inadequada para o download de arquivos grandes
  • Nas instalações do Windows Server Core, você precisará escrever isso como

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
  • Antes de 20 de setembro de 2014, sugeri

    (wget http://blog.stackexchange.com/).Content >out.html
    

    como resposta. No entanto, isso não funciona em todos os casos, pois o operador > (que é um alias para Out-File ) converte a entrada para Unicode.

Se você estiver usando o Windows 7, precisará instalar a versão 4 ou mais recente do Windows Management Framework.

Você pode descobrir que fazer $ProgressPreference = "silentlyContinue" antes de Invoke-WebRequest aumentará significativamente a velocidade de download com arquivos grandes; essa variável controla se a interface do usuário de progresso é renderizada.

    
por 26.12.2013 / 07:47
175

Se você só precisar recuperar um arquivo, poderá usar o Método DownloadFile do Cliente Web objeto:

$client = New-Object System.Net.WebClient
$client.DownloadFile($url, $path)

Em que $url é uma string representando o URL do arquivo e $path está representando o caminho local no qual o arquivo será salvo.

Observe que $path deve incluir o nome do arquivo; não pode ser apenas um diretório.

    
por 28.11.2011 / 11:20
81

Invoke-WebRequest na próxima versão 3 do PowerShell:

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html
    
por 11.08.2012 / 01:38
16

É um pouco confuso, mas existe esta postagem do blog que fornece instruções para o download de arquivos.

Alternativamente (e este é um que eu recomendo) você pode usar o BITS:

Import-Module BitsTransfer
Start-BitsTransfer -source "http://urlToDownload"

Ele mostrará o progresso e fará o download do arquivo para o diretório atual.

    
por 28.11.2011 / 11:18
6

One-liner do PowerShell V4:

(iwr http://blog.stackexchange.com/).Content >index.html'

ou

(iwr http://demo.mediacore.tv/files/31266.mp4).Content >video.mp4

Isto é basicamente Warren (impressionante) V3 one-liner (obrigado por isso!) - com apenas uma pequena alteração para que funcione em um PowerShell V4.

O one-liner de Warren - que simplesmente usa wget em vez de iwr - ainda deve funcionar para V3 (pelo menos, eu acho; não testei, no entanto). De qualquer forma. Mas, ao tentar executá-lo em um V4 PowerShell (como tentei), você verá o PowerShell não conseguir resolver wget como um cmdlet / programa válido.

Para os interessados, isto é, como peguei no comentário de Bob em resposta a a resposta aceita (obrigado, cara!) - porque a partir do PowerShell V4, wget e curl são alias para Invoke-WebRequest , definido para iwr por padrão . Portanto, wget não pode ser resolvido (assim como curl não pode funcionar aqui) .

    
por 25.05.2014 / 12:22
4

Aqui está uma função do PowerShell que resolve URLs curtos antes de fazer o download do arquivo

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
        }  
    }  
}  

Use-o assim para baixar o arquivo para a pasta atual:

Get-FileFromUri http://example.com/url/of/example/file  

Ou para baixar o arquivo para uma pasta especificada:

Get-FileFromUri http://example.com/url/of/example/file  C:\example-folder  
    
por 12.08.2014 / 12:48
2

A seguinte função irá obter um 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)
}

Alguns comentários:

  1. As últimas 4 linhas são necessárias apenas se você estiver atrás de um proxy de autenticação. Para uso simples, (New-Object Net.WebClient).DownloadFile($url, $path) funciona bem.
  2. O caminho deve ser absoluto, pois o download não é feito em seu diretório atual, portanto, os caminhos relativos resultarão no download perdido em algum lugar.
  3. A seção if (!$path) {...} manipula o caso simples em que você deseja apenas fazer o download do arquivo para o diretório atual usando o nome fornecido na URL.
por 15.12.2014 / 16:26
1

Use o shell bash do Windows 10, que inclui wget quando o recurso do windows é configurado.

Como instalar o shell bash do Ubuntu no Windows:

YouTube: executando o Bash no Ubuntu no Windows!

Windows Subsystem para documentação do Linux

    
por 27.09.2017 / 05:21