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

Native alternatief voor wget in Windows PowerShell?

Ik weet dat ik de genoemde bibliotheek kan downloaden en installeren (wget voor Windows), maar mijn vraag is de volgende:

In Windows PowerShell, is er een native alternatief voor wget?

Ik heb wget simpelweg nodig om een bestand op te halen van een gegeven URL met HTTP GET. Bijvoorbeeld:

wget http://www.google.com/

Antwoorden (11)

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

Hier is een eenvoudige PS 3.0 en later one-liner die werkt en niet veel PS-barf heeft:

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

Noteer dat:

  • wget een alias is voor Invoke-WebRequest
  • Invoke-WebRequest een HtmlWebResponseObject retourneert, dat veel nuttige HTML-parsing eigenschappen bevat zoals Links, Afbeeldingen, Formulieren, InputFields, enz, maar in dit geval gebruiken we alleen de ruwe inhoud
  • De inhoud van het bestand wordt in het geheugen opgeslagen voordat het naar de schijf wordt geschreven, waardoor deze aanpak ongeschikt is voor het downloaden van grote bestanden
  • Op Windows Server Core installaties moet u dit schrijven als

  • Voor 20 sep 2014 heb ik

voorgesteld Als u Windows 7 gebruikt, moet u versie 4 of een nieuwere versie van het Windows Management Framework installeren.

U zult merken dat het doen van een $ProgressPreference = "silentlyContinue" voor Invoke-WebRequest de downloadsnelheid bij grote bestanden aanzienlijk zal verbeteren; deze variabele bepaalt of de voortgang van de UI wordt weergegeven.

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

Als u alleen een bestand moet ophalen, kunt u de DownloadFile methode van het WebClient object gebruiken:

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

Waar $url een tekenreeks is die de URL van het bestand weergeeft, en $path het lokale pad waar het bestand wordt opgeslagen.

Merk op dat $path de bestandsnaam moet bevatten; het kan niet alleen een map zijn.

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

Er is Invoke-WebRequest in de komende PowerShell versie 3:

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

Het is een beetje rommelig maar er is deze blogpost die je instructies geeft voor het downloaden van bestanden.

Als alternatief (en dit is er een die ik zou aanraden) kun je BITS gebruiken:

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

Het zal de voortgang laten zien en zal het bestand downloaden naar de huidige directory.

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

PowerShell V4 One-liner:

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

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

  • *

Dit is in feite Warren’s (geweldige) V3 one-liner (bedankt voor dit! ) - met slechts een kleine verandering om het te laten werken in een V4 PowerShell. Warren’s one-liner - die gewoon wget gebruikt in plaats van iwr - zou nog steeds moeten werken voor V3 (Tenminste, denk ik; heeft het echter niet getest). Hoe dan ook. Maar als je het probeert uit te voeren in een V4 PowerShell (zoals ik heb geprobeerd), zul je zien dat PowerShell wget niet oplost als een geldig cmdlet/programma.

Voor degenen die geïnteresseerd zijn, dat wil zeggen - zoals ik heb opgepikt uit Bob’s commentaar in antwoord op het geaccepteerde antwoord (bedankt, man!) - omdat als van PowerShell V4, wget en curl een alias hebben voor Invoke-WebRequest, standaard ingesteld op iwr. Dus, wget kan niet worden opgelost (net zo min als curl hier kan werken).

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

Hier is een PowerShell-functie die korte URL’s oplost voordat het bestand

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

wordt gedownload Gebruik het op deze manier om het bestand te downloaden naar de huidige map: 

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

of om het bestand te downloaden naar een gespecificeerde map:

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

wordt gedownload Gebruik het op deze manier om het bestand te downloaden naar de huidige map: 

&001 


of om het bestand te downloaden naar een gespecificeerde map: 

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

wordt gedownload Gebruik het op deze manier om het bestand te downloaden naar de huidige map:

&001

of om het bestand te downloaden naar een gespecificeerde map:

&001

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

De volgende functie krijgt een 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)
}
  1. Enkele opmerkingen:

  2. De laatste 4 regels zijn alleen nodig als je achter een authenticatie proxy zit. Voor eenvoudig gebruik werkt (New-Object Net.WebClient).DownloadFile($url, $path) prima.

  3. Het pad moet absoluut zijn, aangezien de download niet in je huidige directory wordt gedaan, dus relatieve paden zullen ertoe leiden dat de download ergens verloren gaat.

  4. De if (!$path) {...} sectie behandelt het eenvoudige geval waarin je het bestand gewoon wilt downloaden naar de huidige directory met behulp van de naam die in de URL is gegeven.

1
1
1
2017-09-27 03:21:03 +0000

Gebruik Windows 10 bash shell die wget bevat zodra de Windows-functie is ingesteld.

Hoe Ubuntu bash shell te installeren op Windows: YouTube: Running Bash op Ubuntu op Windows! Windows Subsystem for Linux Documentation

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

Invoke-WebRequest met -outfile parameter verwacht een string, dus als je bestandsnaam begint met een nummer, en niet tussen aanhalingstekens staat, wordt er geen uitvoerbestand aangemaakt.

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

Dit heeft geen invloed op bestandsnamen die beginnen met een letter.

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

Als uw Windows nieuw genoeg is (zoals versie 1809 of nieuwer), is er een “echte” curl beschikbaar. curl heeft de commandline-optie “-O” (hoofdletter O; kleine letter doet niet hetzelfde! ) De optie “-O”, of “–remote-naam” vertelt curl, dat het opgeslagen bestand dezelfde naam krijgt als het bestandsnaamgedeelte van de URL.

Men moet dit starten als “curl.exe”, om het te onderscheiden van de Alias “curl” voor “Invoke-WebRequest”. Overigens werkt het in cmd.exe zonder wijzigingen.

Met hetzelfde voorbeeld als in een ander antwoord hier

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

(De site staat niet toe dat ik dit als commentaar toevoeg, omdat ik daar blijkbaar meer “reputatie” voor nodig heb - dus het krijgt een nieuw antwoord)

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

Dit zou moeten werken voor u om de geen-browser geïnitialiseerde dingen te omzeilen. Let op de “-UseBasicParsing” param.

Invoke-WebRequest http://localhost -UseBasicParsing