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/
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
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.
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)
Où $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.
Il existe Invoke-WebRequest
dans la prochaine version de PowerShell 3:
Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html
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.
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)} _.
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
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:
(New-Object Net.WebClient).DownloadFile($url, $path)
fonctionne bien.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.Utilisez Windows 10 bash Shell, qui inclut wget une fois la fonctionnalité Windows configurée.
Comment installer Ubuntu bash Shell sous Windows:
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)