Pregunta ¿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, ¿existe una alternativa nativa a wget?

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

wget http://www.google.com/

244


origen


Ver también superuser.com/questions/25538/... - jiggunjer


Respuestas:


Aquí hay una simple PS 3.0 y una línea posterior que funciona y no implica mucho PS barf:

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

Tenga en cuenta que:

  • wget es un alias para Invoke-WebRequest
  • Invoke-WebRequest devuelve un HtmlWebResponseObject, que contiene muchas propiedades de análisis HTML útiles, como enlaces, imágenes, formularios, campos de entrada, etc., pero en este caso solo estamos usando el contenido en bruto
  • El contenido del archivo se almacena en la memoria antes de escribir en el disco, por lo que este enfoque no es adecuado para descargar archivos de gran tamaño
  • En las instalaciones de Windows Server Core, tendrá que escribir esto como

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

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

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

Si está utilizando Windows 7, necesitará instalar la versión 4 o posterior de Windows Management Framework.

Puede encontrar que haciendo un $ProgressPreference = "silentlyContinue" antes de Invoke-WebRequest mejorará significativamente la velocidad de descarga con archivos de gran tamaño; esta variable controla si se procesa la IU de progreso.


199



Esta es ahora la respuesta correcta, y me encontré con Wget probando accidentalmente si tenía el wget real instalado. Es molesto que no pueda obtener el nombre de archivo fácilmente (tiene que especificarlo en la redirección de salida), pero esta opción tiene una mejor interfaz de usuario que el wget real (en mi opinión), así que eso es todo. - Matthew Scharley
Pero Windows 7 solo viene con PowerShell 2.0, y el resultado será "El término 'Invoke-WebRequest' no se reconoce como el nombre de un cmdlet, ...". - Peter Mortensen
Advertencia justa: este método pondrá todo el contenido del archivo en la memoria antes de escribirlo en el archivo. Esta no es una buena solución para descargar archivos de gran tamaño. - im_nullable
@im_nullable, buena llamada: lo he agregado a la publicación. - Warren Rumak
@dezza He actualizado la respuesta con un enfoque diferente. Pruébalo otra vez. - Warren Rumak


Si solo necesita recuperar un archivo, puede usar Descargar archivo método de la WebClient objeto:

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

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

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


169



Hasta ahora, esta ha sido la mejor solución propuesta. También dado que parece que puedo reescribirlo en formato de una línea como (new-object System.Net.WebClient).DownloadFile( '$url, $path) es la mejor correspondencia para wget He visto hasta ahora. ¡Gracias! - jsalonen
Como nota al margen también puede hacer esto de forma asíncrona usando algo como (new-object System.Net.WebClient) .DownloadFileAsync (url, filePath) - James
¿Podemos buscar un texto en particular a través de Webclient y outout a un bloc de notas? Gracias - Mowgli
Sí, esto funciona de la caja en Windows 7 (eso viene con PowerShell 2.0) Muestra: $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html") - Peter Mortensen
Solo por obtener una URL e ignorar los resultados (por ejemplo, parte de una secuencia de comandos de calentamiento de IIS) use DownloadData: (new-object System.Net.WebClient).DownloadData($url) | Out-Null - BurnsBA


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

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

81



toda la elegancia de dd... - gWaldo
@gWaldo estás bromeando, es un placer usarlo (hablando como alguien que acaba de aprender PS) - Jack Douglas
Solo quiero decir que el -Outfile parámetro parece extraño cuando podrías simplemente usar > (sobrescribir) o >> (para agregar) a un archivo. - gWaldo
@gWaldo o incluso deducir el nombre de archivo de la URL al igual que wget hace :) - Peltier
Y a partir de PS 4.0, wget y curl son aliasted a Invoke-WebRequest(iwr) por defecto: D - Bob


Es un poco complicado pero hay esta publicación en el blog que te da instrucciones para descargar archivos.

Alternativamente (y este es uno que recomendaría) puede usar BITS:

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

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


16



BITS depende del soporte en el extremo del servidor, si está disponible, funciona en segundo plano y puede obtener actualizaciones de progreso con otros cmdlets. - Richard
Intenté buscar google.com, pero todo lo que obtengo es Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). Estoy desconcertado: | - jsalonen
@jsalonen Creo que BITS solo descargará archivos en lugar de páginas. Como dice Richard, confía en el soporte del lado del servidor (aunque no creo que sea específico de Microsoft). - Matthew Steeples
Veo y creo que entiendo el punto en el uso de BITS, sin embargo, no es lo que estoy buscando aquí. - jsalonen
Necesito recordar ese. ¡Gracias! - flickerfly


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 (impresionante) V3 de una sola línea  (¡gracias por esto!) - con solo un pequeño cambio para que funcione en un PowerShell V4.

Warren's one-liner - que simplemente usa wget más bien que iwr - Debería funcionar para V3 (Al menos, supongo, pero no lo probé). De todas formas. Pero al tratar de ejecutarlo en una V4 PowerShell (como lo intenté), verá que PowerShell no puede resolver wget como un cmdlet / programa válido.

Para los interesados, eso es - cuando recogí de Comentario de Bob en respuesta a la respuesta aceptada  (¡gracias hombre!) - porque a partir de PowerShell V4, wget y curl son alias a Invoke-WebRequest, ajustado a iwr por defecto. Así, wgetno se puede resolver (tanto como curl no puede trabajar aquí).


6





Aquí hay una función de PowerShell que resuelve URL 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('\')) {
                $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
        }  
    }  
}  

Úselo 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 especificada:

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

4





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 solo son necesarias si está detrás de un proxy de autenticación. Para un uso simple, (New-Object Net.WebClient).DownloadFile($url, $path) funciona bien.
  2. El camino debe sea ​​absoluto, 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. los if (!$path) {...} La sección maneja el caso simple donde solo desea descargar el archivo al directorio actual utilizando el nombre dado en la URL.

2





Use Windows 10 bash shell que incluye wget una vez que se configura la característica de Windows.

Cómo instalar Ubuntu bash shell en Windows:

YouTube: ¡Ejecutando Bash en Ubuntu en Windows!

Subsistema de Windows para documentación de Linux


1



Considere agregar alguna referencia entre comillas a esta respuesta que respalde lo que usted declara en caso de que el enlace muera alguna vez, de modo que el contenido de la respuesta aún esté disponible y actualmente solo esté disponible a través de ese enlace según su sugerencia. - Pimp Juice IT