Usuario del software
2011-11-28 09:56:40 +0000 2011-11-28 09:56:40 +0000
293

Alternativa nativa a wget en Windows PowerShell?

Sé que puedo descargar e instalar la biblioteca mencionada (wget para Windows), pero mi pregunta es la siguiente:

En Windows PowerShell, ¿hay una alternativa nativa a wget?

Necesito wget simplemente para recuperar un archivo de una dirección URL determinada con HTTP GET. Por ejemplo:

wget http://www.google.com/

Respuestas [11]

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

Aquí hay una simple línea de PS 3.0 y posterior que funciona y no involucra mucho vómito de PS:

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

Nota que:

  • wget es un alias para Invoke-WebRequest
  • Invoke-WebRequest devuelve un HtmlWebResponseObject , que contiene un montón de propiedades útiles de análisis HTML como Enlaces, Imágenes, Formularios, Campos de Entrada, etc, pero en este caso sólo estamos usando el Contenido en bruto
  • El contenido del archivo se almacena en la memoria antes de escribir en el disco, haciendo este enfoque inadecuado para descargar archivos grandes
  • En instalaciones de Windows Server Core, necesitarás escribir esto como

  • Antes del 20 de septiembre de 2014, sugerí

Si estás usando Windows 7, necesitarás instalar la versión 4 o más reciente del Windows Management Framework.

Puedes encontrar que hacer un $ProgressPreference = "silentlyContinue" antes de Invoke-WebRequest mejorará significativamente la velocidad de descarga con archivos grandes; esta variable controla si la interfaz de progreso se renderiza.

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

Si sólo necesitas recuperar un archivo, puedes usar el método DownloadFile del WebClient objeto:

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

Donde $url es una cadena que representa la URL del archivo, y $path representa la ruta local en la que se guardará el archivo.

Ten en cuenta que $path debe incluir el nombre del archivo; no puede ser sólo un directorio.

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

Hay Invoke-WebRequest en la próxima versión 3 de PowerShell:

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

Es un poco desordenado pero hay esta entrada de blog que te da instrucciones para descargar archivos.

Alternativamente (y esta es una que yo recomendaría) puedes usar BITS:

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

Mostrará el progreso y descargará el archivo al directorio actual.

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

PowerShell V4 One-liner:

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

o

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

Esto es básicamente Warren's (awesome) V3 one-liner (gracias por esto! ) - con sólo un pequeño cambio para que funcione en un V4 PowerShell. Warren's one-liner - que simplemente usa wget en lugar de iwr - debería funcionar para V3 (Al menos, supongo; aunque no lo he probado). De todas formas. Pero cuando intente ejecutarlo en un V4 PowerShell (como lo intenté), verá que PowerShell no resuelve wget como un cmdlet/programa válido.

Para aquellos interesados, esto es - como recogí de el comentario de Bob en respuesta a la respuesta aceptada (¡gracias, hombre!) - porque como de PowerShell V4, wget y curl son alias de Invoke-WebRequest, puesto a iwr por defecto. Por lo tanto, wget no puede ser resuelto (así como curl no puede funcionar aquí).

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

Aquí hay una función de PowerShell que resuelve URLs cortas antes de descargar el archivo

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

Utilícela así para descargar el archivo a la carpeta actual: 

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

O para descargar el archivo a una carpeta específica:

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

Utilícela así para descargar el archivo a la carpeta actual: 

&001 

O para descargar el archivo a una carpeta 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
        }  
    }  
}

Utilícela así para descargar el archivo a la carpeta actual:

&001

O para descargar el archivo a una carpeta específica:

&001

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

La siguiente función obtendrá una 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)
}

Algunos comentarios:

  1. Las últimas 4 líneas sólo son necesarias si estás detrás de un proxy de autenticación. Para un uso sencillo, (New-Object Net.WebClient).DownloadFile($url, $path) funciona bien.
  2. La ruta debe ser absoluta, ya que la descarga no se realiza en su directorio actual, por lo que las rutas relativas harán que la descarga se pierda en algún lugar.
  3. La sección if (!$path) {...} maneja el caso simple en el que sólo quieres descargar el archivo al directorio actual usando el nombre dado en la URL.
2
0
2018-11-27 18:05:22 +0000

El parámetro Invoke-WebRequest con -outfile espera una cadena, por lo que si su nombre de archivo comienza con un número, y no está entre comillas, no se crea ningún archivo de salida.

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

Esto no afecta a los nombres de archivo que comienzan con una letra.

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

Si su Windows es lo suficientemente nuevo (como la versión 1809 o más reciente), hay un rizo "real" disponible. El rizo tiene la opción de línea de comandos "-O" (letra O mayúscula; la letra minúscula no hará lo mismo! ) La opción "-O", alternativamente "--remote-name" le dice a curl, que el archivo guardado obtiene el mismo nombre que la parte de nombre de archivo de la URL.

Uno necesita comenzar esto como "curl.exe", para discernirlo del Alias "curl" para "Invoke-WebRequest". Por cierto, funciona en cmd.exe sin cambios.

Usando el mismo ejemplo que en otra respuesta aquí

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

(El sitio no me permite añadir esto como un comentario, ya que aparentemente necesito más "reputación" para eso - así que obtiene una nueva respuesta)

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

Esto debería funcionar para que puedas evitar las cosas no inicializadas del navegador. Note el parámetro "-UseBasicParsing".

Invoke-WebRequest http://localhost -UseBasicParsing
-1