web-dev-qa-db-fra.com

Alternative native à wget dans Windows PowerShell?

Je sais que je peux télécharger et installer la bibliothèque susmentionnée (wget pour Windows), mais ma question est la suivante:

Dans Windows PowerShell, existe-t-il une alternative native à wget?

J'ai besoin de wget simplement pour récupérer un fichier depuis une URL donnée avec HTTP GET. Par exemple:

wget http://www.google.com/
275
jsalonen

Voici un simple PS 3.0 et plus récent one-liner qui fonctionne et qui implique peu de PS:

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

Notez que:

  • wget est un alias pour Invoke-WebRequest
  • Invoke-WebRequest retourne un HtmlWebResponseObject , qui contient de nombreuses propriétés d'analyse HTML utiles, telles que des liens, des images, des formulaires, des champs de saisie, etc., mais dans ce cas, nous utilisons uniquement le contenu brut.
  • Le contenu du fichier est stocké en mémoire avant l'écriture sur le disque, rendant cette approche inutilisable pour le téléchargement de fichiers volumineux.
  • Sur les installations Windows Server Core, vous devez écrire ceci sous la forme suivante:

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
  • Avant le 20 septembre 2014, j'ai suggéré

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

    comme une réponse. Toutefois, cela ne fonctionne pas dans tous les cas, car l'opérateur > (qui est un alias pour Out-File) convertit l'entrée en Unicode.

Si vous utilisez Windows 7, vous devrez installer la version 4 ou plus récente de Windows Management Framework.

Vous constaterez peut-être que le fait de $ProgressPreference = "silentlyContinue" avant Invoke-WebRequest améliorera considérablement la vitesse de téléchargement des fichiers volumineux; cette variable contrôle si l'interface utilisateur de progression est rendue.

228
Warren Rumak

Si vous avez juste besoin de récupérer un fichier, vous pouvez utiliser la méthode DownloadFile du WebClient object:

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

$url est une chaîne représentant l'URL du fichier et $path représente le chemin d'accès local dans lequel le fichier sera enregistré.

Notez que $path doit inclure le nom du fichier; ce ne peut pas être juste un répertoire.

180
Traveling Tech Guy

Il existe Invoke-WebRequest dans la prochaine version de PowerShell 3:

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

C'est un peu brouillon mais il y a cet article de blog qui vous donne des instructions pour télécharger des fichiers.

Sinon, vous pouvez utiliser BITS (et c'est celui que je recommanderais):

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

Il montrera la progression et téléchargera le fichier dans le répertoire actuel.

17
Matthew Steeples

PowerShell V4 One-Liner:

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

ou

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

Ceci est fondamentalement Warren (génial) one-liner V3(merci pour cela!) _ - avec juste un petit changement pour le faire fonctionner dans un V4 PowerShell.

Le one-liner de Warren - qui utilise simplement wget au lieu de iwr - devrait toujours fonctionner pour V3 (Au moins, je suppose; ne l’a pas testé, cependant). En tous cas. Mais lorsque vous essayez de l'exécuter dans un V4 PowerShell (comme j'ai essayé), vous verrez que PowerShell ne parvient pas à résoudre wget en tant qu'applet de commande/programme valide.

Pour ceux que ça intéresse, c’est - comme je l’ai compris dans le commentaire de Bob en réponse à la réponse acceptée(merci, mec!)} - parce que à partir de PowerShell V4, wget et curl sont associés à Invoke-WebRequest, défini sur iwr par défaut . Ainsi, wget ne peut pas être résolu (de même que curl ne peut pas fonctionner ici)} _.

6
eyecatchUp

Voici une fonction PowerShell qui résout les URL courtes avant de télécharger le fichier.

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

Utilisez-le comme ceci pour télécharger le fichier dans le dossier actuel:

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

Ou pour télécharger le fichier dans un dossier spécifié:

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

La fonction suivante obtiendra une 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)
}

Certains commentaires:

  1. Les 4 dernières lignes ne sont nécessaires que si vous êtes derrière un proxy d’authentification. Pour une utilisation simple, (New-Object Net.WebClient).DownloadFile($url, $path) fonctionne bien.
  2. Le chemin must doit être absolu, car le téléchargement n’est pas effectué dans votre répertoire actuel. Par conséquent, les chemins relatifs entraînent la perte du téléchargement quelque part.
  3. La section if (!$path) {...} traite le cas simple où vous souhaitez simplement télécharger le fichier dans le répertoire actuel en utilisant le nom indiqué dans l'URL.
2
Paul Moore

Utilisez Windows 10 bash Shell, qui inclut wget une fois la fonctionnalité Windows configurée.

Comment installer Ubuntu bash Shell sous Windows:

YouTube: Utiliser Bash sous Ubuntu sous Windows!

Documentation du sous-système Windows pour Linux

1
Miloud Eloumri

Si votre Windows est suffisamment nouveau (comme la version 1809 ou plus récente), il existe une "vraie" boucle disponible. curl a l'option de ligne de commande "-O" (lettre majuscule O; les petites lettres ne font pas de même!) L'option "-O", ou "--remote-name" indique à curl que le fichier enregistré obtient le même nom que la partie nom de fichier de l'URL.

Il faut commencer par "curl.exe" pour le distinguer de l'alias "curl" de "Invoke-WebRequest". Incidemment, cela fonctionne dans cmd.exe sans modifications.

En utilisant le même exemple que dans une autre réponse ici

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

(Le site ne me permet pas d'ajouter ceci en tant que commentaire, car j'ai apparemment besoin de plus de "réputation" pour cela - donc cela donne une nouvelle réponse)

0
Dweia