2011-11-28 09:56:40 +0000 2011-11-28 09:56:40 +0000
293
293

Alternativa nativa ao wget no Windows PowerShell?

Sei que posso descarregar e instalar a biblioteca mencionada (wget para Windows), mas a minha pergunta é esta:

No Windows PowerShell, existe uma alternativa nativa ao wget?

Preciso do wget simplesmente para recuperar um ficheiro de um dado URL com HTTP GET. Por exemplo:

wget http://www.google.com/

Respostas (11)

243
243
243
2013-12-26 06:47:06 +0000

Aqui está uma simples PS 3.0 e mais tarde uma linha que funciona e não envolve muito barf PS:

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

Note que:

  • wget é um pseudónimo de Invoke-WebRequest
  • Invoke-WebRequest retorna um HtmlWebResponseObject , que contém muitas propriedades de análise HTML úteis tais como Links, Imagens, Formulários, Campos de InputFields, etc, mas neste caso estamos apenas a usar o conteúdo bruto
  • O conteúdo dos ficheiros é armazenado na memória antes de gravar em disco, tornando esta abordagem inadequada para o download de ficheiros grandes
  • Nas instalações Windows Server Core, terá de escrever isto como

  • Antes de 20 de Setembro de 2014, sugeri

Se estiver a usar o Windows 7, terá de instalar a versão 4 ou mais recente do Windows Management Framework.

Pode descobrir que fazer um $ProgressPreference = "silentlyContinue" antes do Invoke-WebRequest irá melhorar significativamente a velocidade de download com ficheiros grandes; esta variável controla se a IU de progresso é apresentada.

186
186
186
2011-11-28 10:20:08 +0000

Se só precisa de recuperar um ficheiro, pode usar o método DownloadFile do objecto Cliente Web :

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

Onde $url é uma string representando o URL do ficheiro, e $path representa o caminho local para onde o ficheiro será guardado.

Note que $path tem de incluir o nome do ficheiro; não pode ser apenas um directório.

88
88
88
2012-08-10 23:38:18 +0000

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

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html
18
18
18
2011-11-28 10:18:36 +0000

É um pouco confuso mas há este post no blog que lhe dá instruções para descarregar ficheiros.

Em alternativa (e este é um que eu recomendaria) pode usar BITS:

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

Mostrará o progresso e descarregará o ficheiro para o directório actual.

6
6
6
2014-05-25 10:22:13 +0000

PowerShell V4 One-liner:

(iwr http://blog.stackexchange.com/).Content >index.html`
(iwr http://demo.mediacore.tv/files/31266.mp4).Content >video.mp4

Isto é basicamente Warren’s (fantástico) V3 one-liner (obrigado por isto! ) - com apenas uma pequena alteração para que funcione num V4 PowerShell. Warren’s one-liner - que simplesmente usa wget em vez de iwr - ainda deve funcionar para V3 (Pelo menos, acho que não o testou, no entanto). De qualquer forma. Mas ao tentar executá-lo num V4* PowerShell (como eu tentei), verá o PowerShell a não resolver o wget como um cmdlet/programa válido.

Para os interessados, isto é - como peguei no comentário de Bob em resposta a a resposta aceite (obrigado, meu!) - porque as do PowerShell V4, wget e curl são aliados a Invoke-WebRequest, definidos a iwr por defeito*. Assim, wget não pode ser resolvido (assim como curl não pode funcionar aqui).

4
4
4
2014-08-12 10:48:51 +0000

Aqui está uma função PowerShell que resolve URLs curtos antes de descarregar o ficheiro

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(' 


Use-a assim para descarregar o ficheiro para a pasta actual: 


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

Ou para descarregar o ficheiro para uma pasta específica:

Get-FileFromUri http://example.com/url/of/example/file C:\example-folder
```)) {
                $destination += $filename
            } else {
                $destination += ' 


Use-a assim para descarregar o ficheiro para a pasta actual: 


&001 


Ou para descarregar o ficheiro para uma pasta específica: 


&001 + $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-a assim para descarregar o ficheiro para a pasta actual:

&001

Ou para descarregar o ficheiro para uma pasta específica:

&001

2
2
2
2014-12-15 15:26:13 +0000

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ó são necessárias se você estiver atrás de um proxy autenticador. Para uma utilização simples, (New-Object Net.WebClient).DownloadFile($url, $path) funciona bem.
  2. O caminho must deve ser absoluto, pois o download não é feito no seu directório actual, pelo que caminhos relativos resultarão na perda do download algures.
  3. A secção if (!$path) {...} trata do caso simples em que apenas pretende descarregar o ficheiro para o directório actual utilizando o nome dado no URL.
1
1
1
2017-09-27 03:21:03 +0000

Utilize a shell bash do Windows 10 que inclui wget assim que a funcionalidade windows estiver configurada.

Como instalar a shell bash do Ubuntu no Windows: YouTube: Rodando Bash no Ubuntu no Windows! Subsistema Windows para Documentação Linux

0
0
0
2018-11-27 18:05:22 +0000

Invoke-WebRequest com parâmetro -outfile espera uma string, então se o seu nome de ficheiro começa com um número, e não está entre aspas, nenhum ficheiro de saída é criado.

por exemplo Invoke-WebRequest -Uri "http://www.google.com/" -outfile "2.pdf"

Isto não afecta os nomes de ficheiros que começam com uma letra.

0
0
0
2019-03-04 13:25:33 +0000

Se o seu Windows é suficientemente novo (como a versão 1809 ou mais recente), há um “real” curl disponível. curl tem a opção de linha de comando “-O” (letra maiúscula O; a letra minúscula não fará o mesmo! ) A opção “-O”, em alternativa “–remote-name” diz curl, que o ficheiro guardado recebe o mesmo nome que a parte ficheiro-nome do URL.

É necessário iniciar isto como “curl.exe”, para o distinguir do Alias “curl” para “Invoke-WebRequest”. A propósito funciona em cmd.exe sem alterações.

Usando o mesmo exemplo de outra resposta aqui

curl.exe -O http://demo.mediacore.tv/files/31266.mp4

(O site não me permite adicionar isto como um comentário, uma vez que aparentemente preciso de mais “reputação” para isso - por isso obtém uma nova resposta)

-1
-1
-1
2019-04-27 20:13:44 +0000

Isto deve funcionar para você contornar o material não inicializado pelo navegador. Note o param. “-UseBasicParsing”

Invoke-WebRequest http://localhost -UseBasicParsing