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

Alternative native à wget dans Windows PowerShell ?

Je sais que je peux télécharger et installer la bibliothèque mentionnée ci-dessus (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 à partir d'une URL donnée avec HTTP GET. Par exemple :

wget http://www.google.com/

Réponses (11)

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

Voici une simple ligne PS 3.0 et plus qui fonctionne et n'implique pas beaucoup de barf PS :

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

Notez que :

  • wget est un alias pour Invoke-WebRequest
  • Invoke-WebRequest renvoie un HtmlWebResponseObject , qui contient beaucoup de propriétés d'analyse HTML utiles telles que Liens, Images, Formulaires, Champs de saisie, etc, mais dans ce cas, nous n'utilisons que le contenu brut
  • Le contenu des fichiers est stocké en mémoire avant d'être écrit sur le disque, ce qui rend cette approche inappropriée pour le téléchargement de gros fichiers
  • Sur les installations Windows Server Core, vous devrez écrire ceci sous la forme

  • Avant le 20 septembre 2014, je vous ai suggéré

Si vous utilisez Windows 7, vous devrez installer la version 4 ou plus récente du cadre de gestion Windows.

Vous pouvez constater que faire un $ProgressPreference = "silentlyContinue" avant Invoke-WebRequest améliorera considérablement la vitesse de téléchargement avec des fichiers volumineux ; cette variable contrôle si l'interface utilisateur de progression est rendue.

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

Si vous avez simplement besoin de récupérer un fichier, vous pouvez utiliser la méthode DownloadFile de l'objet WebClient :

$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 local dans lequel le fichier sera enregistré.

Notez que $path doit inclure le nom du fichier ; il ne peut s'agir d'un simple répertoire.

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

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

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

C'est un peu compliqué mais il y a ce post de blog qui vous donne les instructions pour télécharger les fichiers.

Alternativement (et c'est celui que je recommande) vous pouvez utiliser BITS :

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

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

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

PowerShell V4 One-liner:

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

ou

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

C'est en gros Warren’s (awesome) V3 one-liner (merci pour ça ! ) - avec juste une petite modification pour le faire fonctionner dans un V4 PowerShell. Warren’s one-liner - qui utilise simplement wget plutôt que iwr - devrait toujours fonctionner pour V3 (du moins, je suppose ; ne l'a pas testé, cependant). Quoi qu'il en soit. Mais en essayant de l'exécuter dans un PowerShell V4 (comme j'ai essayé), vous verrez que PowerShell ne parvient pas à résoudre wget comme un cmdlet/programme valide.

Pour ceux que ça intéresse, c'est-à-dire - comme je l'ai retenu du commentaire de Bob en réponse à la réponse acceptée (merci, mec !) - parce que comme pour PowerShell V4, wget et curl sont aliasés à Invoke-WebRequest, mis à iwr par défaut. Ainsi, wget ne peut pas être résolu (de même que curl ne peut pas fonctionner ici).

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

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

Utilisez-la comme suit 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écifique :

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

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

&001 

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

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

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

&001

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

&001

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

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

Quelques 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 doit être absolu, car le téléchargement n'est pas effectué dans votre répertoire actuel, donc les chemins relatifs feront que le téléchargement se perdra quelque part.
  3. La section if (!$path) {...} gère le cas simple où vous voulez juste télécharger le fichier dans le répertoire courant en utilisant le nom donné dans l'URL.
1
1
1
2017-09-27 03:21:03 +0000

Utilisez le shell bash de Windows 10 qui inclut wget une fois que la fonction windows est installée.

Comment installer le shell bash d'Ubuntu sur Windows : YouTube : Running Bash on Ubuntu on Windows ! Documentation du sous-système Windows pour Linux

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

Invoke-WebRequest avec le paramètre -outfile attend une chaîne de caractères, donc si votre nom de fichier commence par un nombre, et n'est pas entre guillemets, aucun fichier de sortie n'est créé.

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

Cela n'affecte pas les noms de fichiers commençant par une lettre.

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

Si votre Windows est assez récent (comme la version 1809 ou plus récente), il y a un “vrai” curl disponible. curl a l'option de ligne de commande “-O” (lettre majuscule O ; les minuscules ne feront pas la même chose ! ) L'option “-O”, ou “–remote-name” indique à curl que le fichier sauvegardé porte 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” pour “Invoke-WebRequest”. Par ailleurs, 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 comme commentaire, car j'ai apparemment besoin de plus de “réputation” pour cela - donc il obtient une nouvelle réponse)

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

Cela devrait vous permettre de contourner le problème de l'absence d'initialisation du navigateur. Notez les paramètres “-UseBasicParsing”

Invoke-WebRequest http://localhost -UseBasicParsing