Question 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 wget simplement pour récupérer un fichier à partir d'une URL donnée avec HTTP GET. Par exemple:

wget http://www.google.com/

244
2017-11-28 09:56


origine


Voir également superuser.com/questions/25538/... - jiggunjer


Réponses:


Voici un simple one-liner PS 3.0 et ultérieur qui fonctionne et ne nécessite pas beaucoup de 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 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 d’écrire sur le disque, ce qui rend cette approche impropre au téléchargement de fichiers volumineux.
  • Sur les installations Windows Server Core, vous devez écrire ceci comme

    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. Cependant, cela ne fonctionne pas dans tous les cas, car le > opérateur (qui est un alias pour Out-File) convertit l’entrée en Unicode.

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

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


199
2017-12-26 06:47



C'est maintenant la bonne réponse, et j'ai rencontré accidentellement wget pour tester si le wget réel était installé. Ennuyeux de ne pas pouvoir obtenir facilement le nom de fichier (vous devez le spécifier dans la redirection de sortie), mais cette option a une meilleure interface que le vrai wget (à mon avis), il y a donc ça. - Matthew Scharley
Mais Windows 7 est fourni uniquement avec PowerShell 2.0, et le résultat sera "Le terme 'Invoke-WebRequest' n'est pas reconnu comme le nom d'une applet de commande, ...". - Peter Mortensen
Avertissement correct: cette méthode mettra en mémoire l'intégralité du contenu du fichier avant de l'écrire dans le fichier. Ce n'est pas une bonne solution pour télécharger des fichiers volumineux. - im_nullable
@im_nullable, bon appel - je l'ai ajouté à la poste. - Warren Rumak
@dezza J'ai mis à jour la réponse avec une approche différente. Essaye encore. - Warren Rumak


Si vous avez juste besoin de récupérer un fichier, vous pouvez utiliser le Télécharger un fichier méthode de la WebClient objet:

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

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


169
2017-11-28 10:20



Jusqu'à présent, ceci a été la meilleure solution proposée. Aussi, étant donné qu'il semble que je puisse le réécrire dans un format de ligne comme (new-object System.Net.WebClient).DownloadFile( '$url, $path) c'est la meilleure correspondance pour wget J'ai vu jusqu'ici. Merci! - jsalonen
En guise de remarque, vous pouvez également le faire de manière asynchrone en utilisant quelque chose comme (new-object System.Net.WebClient) .DownloadFileAsync (url, filePath) - James
Pouvons-nous aller chercher un texte particulier via Webclient et le sortir dans un bloc-notes? Merci - Mowgli
Oui, cela fonctionne directement sur Windows 7 (qui vient avec PowerShell 2.0). Échantillon: $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html") - Peter Mortensen
Pour obtenir simplement une URL et ignorer les résultats (par exemple, une partie d'un script de démarrage IIS), utilisez DownloadData: (new-object System.Net.WebClient).DownloadData($url) | Out-Null - BurnsBA


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

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

81
2017-08-10 23:38



toute l'élégance de dd... - gWaldo
@gWaldo vous plaisantez - c'est un plaisir à utiliser (parler en tant que quelqu'un qui apprend juste PS) - Jack Douglas
Je veux juste dire que le -Outfile paramètre semble étranger lorsque vous pouvez simplement utiliser > (écraser) ou >> (à ajouter) à un fichier. - gWaldo
@gWaldo ou même déduire le nom de fichier de l'URL comme wget Est-ce que :) - Peltier
Et à partir de PS 4.0, wget et curl sont dévoués à Invoke-WebRequest(iwr) par défaut: D - Bob


C'est un peu en désordre mais il y a ce billet de blog qui vous donne des instructions pour télécharger des fichiers.

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

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

Il affichera la progression et téléchargera le fichier dans le répertoire en cours.


16
2017-11-28 10:18



BITS s'appuie sur le support à la fin du serveur, si disponible, cela fonctionne en arrière-plan et vous pouvez obtenir des mises à jour de progression avec d'autres applets de commande. - Richard
J'ai essayé d'aller chercher google.com, mais tout ce que je reçois est Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). Je suis perplexe: | - jsalonen
@jsalonen Je pense que BITS ne téléchargera que des fichiers plutôt que des pages. Comme le dit Richard, il s'appuie sur un support côté serveur (bien que je ne pense pas que ce soit spécifique à Microsoft). - Matthew Steeples
Je vois et je pense que je comprends bien l'utilisation de BITS, cependant, ce n'est pas ce que je cherche ici. - jsalonen
Je dois me souvenir de celui-là. Merci! - flickerfly


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 essentiellement Warren (génial) V3 one-liner  (Merci pour cela!) - Avec juste un petit changement pour le faire fonctionner dans un PowerShell V4.

La doublure de Warren - qui utilise simplement wget plutôt que iwr - devrait encore travailler pour V3 (Au moins, je suppose, mais je ne l'ai pas testé). En tous cas. Mais en essayant 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 qui sont intéressés, c’est-à-dire Commentaire de Bob en réponse à la réponse acceptée  (Merci mec!) - car à partir de PowerShell V4, wget et curl sont alias à Invoke-WebRequest, mis à iwr par défaut. Ainsi, wgetne peut pas être résolu (aussi bien que curl ne peut pas travailler ici).


6
2018-05-25 10:22





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
2017-08-12 10:48





La fonction suivante aura 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 doit être absolu, puisque le téléchargement ne se fait pas dans votre répertoire actuel, les chemins relatifs entraîneront la perte du téléchargement quelque part.
  3. le if (!$path) {...} section gère le cas simple où vous voulez simplement télécharger le fichier dans le répertoire en cours en utilisant le nom donné dans l’URL.

2
2017-12-15 15:26





Utilisez Windows 10 bash shell qui inclut wget une fois que la fonctionnalité Windows est configurée.

Comment installer le shell bash Ubuntu sur Windows:

YouTube: Lancer Bash sur Ubuntu sous Windows!

Sous-système Windows pour la documentation Linux


1
2017-09-27 03:21



Pensez à ajouter une référence citée à cette réponse en prenant en compte ce que vous indiquez dans le cas où le lien mourrait afin que le contenu de la réponse soit toujours disponible via ce lien uniquement selon votre suggestion. - Pimp Juice IT