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

Alternativa nativa al wget in Windows PowerShell?

So che posso scaricare e installare la libreria citata (wget per Windows), ma la mia domanda è questa:

In Windows PowerShell, c'è un'alternativa nativa a wget?

Ho bisogno di wget semplicemente per recuperare un file da un dato URL con HTTP GET. Per esempio:

wget http://www.google.com/

Risposte (11)

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

Ecco un semplice PS 3.0 e successivi one-liner che funziona e non coinvolge molto PS barf:

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


Nota che: 


- `wget` è un alias per `Invoke-WebRequest` 
- Invoke-WebRequest restituisce un [ HtmlWebResponseObject ](http://msdn.microsoft.com/en-us/library/microsoft.powershell.commands.htmlwebresponseobject_members%28v=vs.85%29.aspx), che contiene molte utili proprietà di parsing HTML come Link, Immagini, Forms, InputFields, ecc, ma in questo caso stiamo usando solo il raw Content 
- Il contenuto dei file viene memorizzato in memoria prima della scrittura su disco, rendendo questo approccio inadatto per scaricare file di grandi dimensioni 
- Sulle installazioni di Windows Server Core, dovrete scriverlo come 


- Prima del 20 settembre 2014, ho suggerito 

Se state usando Windows 7, dovrete installare la versione 4 o più recente del Windows Management Framework. 

Potreste scoprire che fare un `$ProgressPreference = "silentlyContinue"` prima di `Invoke-WebRequest` migliorerà significativamente la velocità di download con file di grandi dimensioni; questa variabile controlla se l'interfaccia utente di avanzamento viene resa.
186
186
186
2011-11-28 10:20:08 +0000

Se si ha solo bisogno di recuperare un file, si può usare il metodo DownloadFile dell'oggetto WebClient :

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

dove $url è una stringa che rappresenta l'URL del file, e $path rappresenta il percorso locale in cui il file verrà salvato.

Si noti che $path deve includere il nome del file; non può essere solo una directory.

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

C'è Invoke-WebRequest nella prossima versione 3 di PowerShell:

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

E’ un po’ disordinato ma c'è questo post del blog che vi dà le istruzioni per scaricare i file.

In alternativa (e questa è una che raccomanderei) potete usare BITS:

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

.

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

PowerShell V4 One-liner:

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

o

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

Questo è fondamentalmente Warren’s (awesome) V3 one-liner (grazie per questo! ) - con solo una piccola modifica per farlo funzionare in un PowerShell V4. Warren’s one-liner - che usa semplicemente wget piuttosto che iwr - dovrebbe funzionare ancora per V3 (Almeno, credo; non l'ho testato, però). In ogni caso. Ma quando si cerca di eseguirlo in un V4 PowerShell (come ho provato), vedrete che PowerShell non riesce a risolvere wget come un valido cmdlet/programma.

Per chi fosse interessato, cioè - come ho preso dal commento di Bob in risposta a la risposta accettata (grazie, amico!) - perché come di PowerShell V4, wget e curl sono aliasati a Invoke-WebRequest, impostati a iwr per default. Quindi, wget non può essere risolto (così come curl non può funzionare qui).

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

Ecco una funzione PowerShell che risolve brevi URL prima di scaricare il file

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


Usatela in questo modo per scaricare il file nella cartella corrente: 


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

o per scaricare il file in una cartella specificata:

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


Usatela in questo modo per scaricare il file nella cartella corrente: 


&001 


o per scaricare il file in una cartella specificata: 


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

Usatela in questo modo per scaricare il file nella cartella corrente:

&001

o per scaricare il file in una cartella specificata:

&001

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

La seguente funzione otterrà un 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)
}
``` &001 


Alcuni commenti: 


1. Le ultime 4 righe sono necessarie solo se si è dietro un proxy di autenticazione. Per un uso semplice, `(New-Object Net.WebClient).DownloadFile($url, $path)` funziona bene. 
2. Il percorso _deve essere assoluto, in quanto il download non viene effettuato nella vostra directory corrente, quindi i percorsi relativi comporteranno la perdita del download da qualche parte. 
3. La sezione `if (!$path) {...}` gestisce il semplice caso in cui si vuole solo scaricare il file nella directory corrente usando il nome indicato nell'URL.
1
1
1
2017-09-27 03:21:03 +0000

Utilizzare la shell bash di Windows 10 che include wget una volta che la funzionalità di Windows è stata impostata.

Come installare la shell bash di Ubuntu su Windows: YouTube: Eseguire Bash su Ubuntu su Windows! Sottosistema Windows per la documentazione Linux

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

Invoke-WebRequest con il parametro -outfile si aspetta una stringa, quindi se il nome del file inizia con un numero, e non è racchiuso tra virgolette, non viene creato alcun file di output.

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

Questo non influisce sui nomi dei file che iniziano con una lettera.

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

Se il vostro Windows è abbastanza nuovo (come la versione 1809 o più recente), c'è un ricciolo “reale” disponibile. Il ricciolo ha l'opzione a riga di comando “-O” (lettera O maiuscola; la lettera minuscola non fa lo stesso! ) L'opzione “-O”, in alternativa “–nome remoto” dice a curl, che il file salvato ottiene lo stesso nome della parte di nome del file dell'URL.

Bisogna iniziare come “curl.exe”, per distinguerlo dall'Alias “curl” per “Invoke-WebRequest”. Per inciso, funziona in cmd.exe senza modifiche.

Usando lo stesso esempio di un'altra risposta qui

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

(Il sito non mi permette di aggiungere questo come commento, dato che apparentemente ho bisogno di più “reputazione” per questo - così ottiene una nuova risposta)

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

Questo dovrebbe funzionare per aggirare le cose non inizializzate dal browser. Notare il parametro “-UseBasicParsing”

Invoke-WebRequest http://localhost -UseBasicParsing