334 votos

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 URL dada con HTTP GET. Por ejemplo:

wget http://www.google.com/

1 votos

296voto

Sean Bannister Puntos 341

Aquí tienes un comando simple de una sola línea para PS 3.0 y posteriores que funciona y no involucra mucho código PS:

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

Ten en cuenta que:

  • wget es un alias de Invoke-WebRequest

  • Invoke-WebRequest devuelve un HtmlWebResponseObject, que contiene muchas propiedades útiles para el análisis de HTML como Links, Images, Forms, InputFields, etc., pero en este caso solo estamos usando el Content en bruto

  • El contenido del archivo se almacena en la memoria antes de escribirlo en disco, por lo que este enfoque no es adecuado para descargar archivos grandes

  • En instalaciones de Windows Server Core, necesitarás escribirlo de esta manera

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
  • Antes de Sep 20 2014, sugerí

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

    como respuesta. Sin embargo, esto no funciona en todos los casos, ya que el operador > (que es un alias de Out-File) convierte la entrada a Unicode.

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

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

4 votos

Esta es ahora la respuesta correcta, y me encontré con wget por accidente probando si tenía instalado el wget real. Es molesto que no pueda obtener fácilmente el nombre del archivo (tienes que especificarlo en la redirección de salida), pero esta opción tiene una mejor interfaz de usuario que el verdadero wget (en mi opinión), así que ahí está.

13 votos

Pero Windows 7 solo viene con PowerShell 2.0, y el resultado será "The term 'Invoke-WebRequest' is not recognized as the name of a cmdlet, ...".

0 votos

Powershell 4 está disponible para Windows 7, forma parte del Marco de trabajo de gestión de Windows. microsoft.com/en-us/download/details.aspx?id=40855

193voto

Traveling Tech Guy Puntos 6836

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

$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 donde se guardará el archivo.

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

37 votos

Hasta ahora esta ha sido la mejor solución propuesta. Además, dado que parece que puedo reescribirla en formato de una línea como (new-object System.Net.WebClient).DownloadFile( '$url, $path), es la mejor correspondencia para wget que he visto hasta ahora. ¡Gracias!

3 votos

Como nota adicional, también puedes hacer esto de forma asíncrona utilizando algo como (new-object System.Net.WebClient).DownloadFileAsync(url, filePath)

0 votos

¿Podemos obtener un texto en particular a través de WebClient y guardarlo en un bloc de notas? gracias

97voto

user4514 Puntos 812

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

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html

9 votos

Toda la elegancia de dd...

1 votos

@gWaldo estás bromeando, esto es un placer de usar (hablando como alguien que recién está aprendiendo PS)

8 votos

Solo quiero decir que el parámetro -Outfile parece superfluo cuando podrías simplemente usar > (para sobrescribir) o >> (para agregar) a un archivo.

19voto

therefromhere Puntos 652

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

Alternativamente (y esta es la que te recomendaría) puedes usar BITS:

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

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

3 votos

BITS depende del soporte en el servidor, si está disponible, esto funciona en segundo plano y puede obtener actualizaciones de progreso con otros cmdlets.

2 votos

Intenté buscar google.com, pero todo lo que obtengo es Start-BitsTransfer : Acceso denegado. (Excepción de HRESULT: 0x80070005 (E_ACCESSDENIED)). ¡Estoy desconcertado! :|

1 votos

@jsalonen Creo que BITS solo descargará archivos en lugar de páginas. Como dice Richard, depende de algún soporte en el servidor (aunque no creo que sea específico de Microsoft).

8voto

eyecatchUp Puntos 133

PowerShell V4 One-liner:

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

o

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

Este es básicamente el magnífico one-liner de Warren (¡gracias por esto!) en V3, con solo un pequeño cambio para que funcione en PowerShell V4.

El one-liner de Warren - que simplemente usa wget en lugar de iwr - debería seguir funcionando para V3 (al menos, supongo; aunque no lo he probado). Sin embargo, al intentar ejecutarlo en PowerShell V4 (como lo intenté), verás que PowerShell no puede resolver wget como un cmdlet/programa válido.

Para aquellos interesados, según lo que recogí del comentario de Bob en respuesta a la respuesta aceptada (¡gracias, amigo!) - es porque en PowerShell V4, wget y curl están aliasados a Invoke-WebRequest, establecido como iwr por defecto. Por lo tanto, wget no se puede resolver (al igual que curl no puede funcionar aquí).

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X