Windows PowerShell में wget करने का मूल विकल्प?


283

मुझे पता है कि मैं aformentioned पुस्तकालय (विंडोज के लिए wget) डाउनलोड और स्थापित कर सकता हूं, लेकिन मेरा सवाल यह है:

Windows PowerShell में, क्या कोई देशी विकल्प है wget?

मुझे wgetबस दिए गए URL से HTTP GET वाली फाइल को पुनः प्राप्त करना है। उदाहरण के लिए:

wget http://www.google.com/

यह भी देखें superuser.com/questions/25538/...
jiggunjer

जवाबों:


236

यहां एक साधारण PS 3.0 और बाद में एक-लाइनर है जो काम करता है और इसमें ज्यादा PS barf शामिल नहीं है:

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

ध्यान दें कि:

  • wget के लिए एक उपनाम है Invoke-WebRequest
  • Invoke-WebRequest एक HtmlWebResponseObject देता है , जिसमें बहुत सारे उपयोगी HTML पार्सिंग गुण होते हैं जैसे लिंक, चित्र, फ़ॉर्म, इनपुटफ़ील्ड, इत्यादि, लेकिन इस मामले में हम केवल कच्चे सामग्री का उपयोग कर रहे हैं।
  • फ़ाइल सामग्री को डिस्क पर लिखने से पहले मेमोरी में संग्रहीत किया जाता है, जिससे बड़ी फ़ाइलों को डाउनलोड करने के लिए यह दृष्टिकोण अनुपयुक्त हो जाता है
  • विंडोज सर्वर कोर इंस्टॉलेशन पर, आपको इसे इस प्रकार लिखना होगा

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
  • 20 सितंबर 2014 से पहले, मैंने सुझाव दिया

    (wget http://blog.stackexchange.com/).Content >out.html
    

    एक जवाब के रूप में। हालाँकि, यह सभी मामलों में काम नहीं करता है, >ऑपरेटर के रूप में (जो के लिए एक उपनाम है Out-File) इनपुट को यूनिकोड में परिवर्तित करता है।

यदि आप विंडोज 7 का उपयोग कर रहे हैं, तो आपको विंडोज मैनेजमेंट फ्रेमवर्क के संस्करण 4 या नए को स्थापित करने की आवश्यकता होगी।

आप पा सकते हैं कि $ProgressPreference = "silentlyContinue"पहले Invoke-WebRequestकरने से बड़ी फ़ाइलों के साथ डाउनलोड गति में काफी सुधार होगा; यह चर नियंत्रित करता है कि प्रगति UI प्रदान की गई है या नहीं।


3
यह अब सही उत्तर है, और अगर मैं वास्तविक रूप से स्थापित किया गया था, तो मैं गलती से परीक्षण में भाग गया। कष्टप्रद है कि इसे आसानी से फ़ाइल नाम नहीं मिल सकता है (आपको इसे आउटपुट पुनर्निर्देशन में निर्दिष्ट करना होगा), लेकिन इस विकल्प में वास्तविक wget (मेरी राय में) की तुलना में बेहतर UI है, इसलिए ऐसा है।
मैथ्यू शेर्ले

13
लेकिन विंडोज 7 केवल पॉवरशेल 2.0 के साथ आता है , और परिणाम "इनवॉइस-वेबरपेस्ट 'शब्द को एक cmdlet, ... के नाम के रूप में मान्यता प्राप्त नहीं है।
पीटर मोर्टेंसन

16
उचित चेतावनी: यह विधि फ़ाइल की संपूर्ण सामग्री को फ़ाइल में लिखने से पहले मेमोरी में डाल देगी। बड़ी फ़ाइलों को डाउनलोड करने के लिए यह एक अच्छा समाधान नहीं है।
im_nullable

2
@im_nullable, good call - मैंने इसे पोस्ट में जोड़ दिया है।
वारेन रमक सेप

1
@dezza मैंने उत्तर को एक अलग दृष्टिकोण के साथ अपडेट किया है। दुबारा प्रयास करें।
वारेन रमक

181

यदि आपको कोई फ़ाइल पुनर्प्राप्त करने की आवश्यकता है, तो आप WebClient ऑब्जेक्ट के DownloadFile विधि का उपयोग कर सकते हैं :

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

जहां $urlएक स्ट्रिंग फ़ाइल के URL $pathका प्रतिनिधित्व करता है , और स्थानीय पथ का प्रतिनिधित्व कर रहा है फ़ाइल को सहेजा जाएगा।

ध्यान दें कि $pathफ़ाइल नाम शामिल होना चाहिए; यह सिर्फ एक निर्देशिका नहीं हो सकता।


32
अब तक यह सबसे अच्छा समाधान प्रस्तावित किया गया है। यह भी कहा कि ऐसा लगता है कि मैं इसे एक पंक्ति प्रारूप में फिर से लिख सकता हूं क्योंकि (new-object System.Net.WebClient).DownloadFile( '$url, $path)यह wgetमेरे लिए अब तक का सबसे अच्छा पत्राचार है । धन्यवाद!
जसलोनन

3
एक नोट के रूप में तुम भी कुछ की तरह (नई-वस्तु System.Net.WebClient) .DownloadFileAsync (यूआरएल, FilePath) में अतुल्यकालिक का उपयोग कर ऐसा कर सकते हैं
जेम्स

क्या हम Webclient के माध्यम से एक विशेष पाठ प्राप्त कर सकते हैं और एक नोटपैड तक पहुंचा सकते हैं? धन्यवाद
मोगली

6
हां, यह विंडोज 7 पर बॉक्स से बाहर काम करता है ( जो कि पॉवरशेल 2.0 के साथ आता है )। नमूना: $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html")
पीटर मोर्टेनसेन

3
केवल एक url प्राप्त करने और परिणामों को अनदेखा करने के लिए (जैसे, IIS वार्मअप स्क्रिप्ट का एक भाग) DownloadData का उपयोग करें:(new-object System.Net.WebClient).DownloadData($url) | Out-Null
BurnsBA

86

नहीं है Invoke-WebRequestआगामी PowerShell संस्करण 3 में:

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

9
सभी भव्यता dd...
gWaldo

1
@gWaldo आप मजाक कर रहे हैं - यह एक खुशी का उपयोग करने के लिए है (जो किसी को सिर्फ पीएस सीखने के लिए बोल रहा है)
जैक डगलस

8
मेरा मतलब है कि -Outfileजब आप सिर्फ एक फाइल में ( >ओवरराइट करने के लिए) या >>(एपेंड करने के लिए ) का उपयोग कर सकते हैं, तो पैरामीटर बाहरी है ।
ग्वाल्डो

5
@gWaldo या URL से फ़ाइल नाम भी ठीक वैसे ही घटाएं wget:)
पेल्टियर

5
और पीएस 4.0 के रूप में, wgetऔर डिफ़ॉल्ट रूप curlसे Invoke-WebRequest( iwr) के लिए प्रतिरोधी हैं : डी
बॉब

18

यह थोड़ा गड़बड़ है लेकिन यह ब्लॉग पोस्ट है जो आपको फ़ाइलों को डाउनलोड करने के लिए निर्देश देती है।

वैकल्पिक रूप से (और यह वह है जिसे मैं सुझाऊंगा) आप BITS का उपयोग कर सकते हैं:

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

यह प्रगति दिखाएगा और वर्तमान निर्देशिका में फ़ाइल डाउनलोड करेगा।


3
BITS सर्वर के अंत में समर्थन पर निर्भर करता है, यदि यह पृष्ठभूमि में उपलब्ध है और आप अन्य cmdlets के साथ प्रगति अपडेट प्राप्त कर सकते हैं।
रिचर्ड

2
मैंने google.com लाने की कोशिश की , लेकिन मुझे सब मिल गया है Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))। मैं हैरान हूँ: |
jsalonen

1
@jsalonen मुझे लगता है कि BITS पृष्ठों के बजाय केवल फ़ाइलें डाउनलोड करेगा। जैसा कि रिचर्ड कहते हैं कि यह कुछ सर्वर साइड सपोर्ट पर निर्भर करता है (हालांकि मुझे नहीं लगता कि यह Microsoft विशिष्ट है)।
मैथ्यू स्टीवंस

मैं देखता हूं और मुझे लगता है कि मुझे बिट्स का उपयोग करने में बात मिलती है, हालांकि, यह नहीं कि मैं यहां क्या देख रहा हूं।
jsalonen

6

PowerShell V4 एक-लाइनर:

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

या

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

यह मूल रूप से वॉरेन का (भयानक) वी 3 वन-लाइनर (इसके लिए धन्यवाद!) - वी 4 पॉवरशेल में काम करने के लिए सिर्फ एक छोटे से बदलाव के साथ।

वारेन का एक-लाइनर - जो बस के wgetबजाय का उपयोग करता है iwr- अभी भी वी 3 के लिए काम करना चाहिए (कम से कम, मुझे लगता है कि हालांकि, इसका परीक्षण नहीं किया गया था)। वैसे भी। लेकिन जब इसे V4 PowerShell में निष्पादित करने की कोशिश की जा रही है (जैसा कि मैंने कोशिश की), तो आप PowerShell wgetको एक वैध cmdlet / प्रोग्राम के रूप में हल करने में विफल होते देखेंगे ।

उन दिलचस्पी के लिए, वह यह है कि - के रूप में मैं से उठाया बॉब की टिप्पणी के जवाब में स्वीकार किए जाते हैं जवाब (धन्यवाद, आदमी!) - क्योंकि PowerShell V4 के रूप में, wgetऔर curlकरने के लिए एलियास की गई हैं Invoke-WebRequest, करने के लिए सेट iwrडिफ़ॉल्ट रूप से । इस प्रकार, wgetहल नहीं किया जा सकता है (साथ ही curlयहां काम नहीं कर सकता है)


4

यहाँ एक PowerShell फ़ंक्शन है जो फ़ाइल डाउनलोड करने से पहले छोटे URL को हल करता है

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

वर्तमान फ़ोल्डर में फ़ाइल डाउनलोड करने के लिए इसका उपयोग इस तरह करें:

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

या फ़ाइल को एक निर्दिष्ट फ़ोल्डर में डाउनलोड करने के लिए:

Get-FileFromUri http://example.com/url/of/example/file  C:\example-folder  

2

निम्न फ़ंक्शन को एक 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. अंतिम 4 पंक्तियों की केवल तभी आवश्यकता होती है जब आप एक प्रामाणिक प्रॉक्सी के पीछे हों। सरल उपयोग के लिए, (New-Object Net.WebClient).DownloadFile($url, $path)ठीक काम करता है।
  2. पथ निरपेक्ष होना चाहिए, क्योंकि डाउनलोड आपकी वर्तमान निर्देशिका में नहीं किया गया है, इसलिए सापेक्ष पथों के परिणामस्वरूप डाउनलोड कहीं खो जाएगा।
  3. यह if (!$path) {...}अनुभाग उस सरल मामले को संभालता है जहां आप URL में दिए गए नाम का उपयोग करके फ़ाइल को वर्तमान निर्देशिका में डाउनलोड करना चाहते हैं।

1

विंडोज 10 बैश शेल का उपयोग करें जिसमें विंडोज फीचर सेटअप होने के बाद wget भी शामिल है।

विंडोज पर उबंटू बैश शेल कैसे स्थापित करें:

YouTube: विंडोज पर उबंटू पर बैश चल रहा है!

लिनक्स प्रलेखन के लिए विंडोज सबसिस्टम


1
इस उत्तर के संदर्भ में कुछ उद्धृत संदर्भ जोड़ने पर विचार करें कि आप जिस स्थिति में लिंक देते हैं, उसके संबंध में कभी भी राज्य मर जाता है इसलिए उत्तर सामग्री अभी भी उपलब्ध है जो वर्तमान में आपके सुझाव के अनुसार केवल उस लिंक के माध्यम से उपलब्ध है।
दलाल जूस आईटी

0

यदि आपका विंडोज़ पर्याप्त नया है (जैसे संस्करण 1809 या नया), तो एक "वास्तविक" कर्ल उपलब्ध है। कर्ल में कमांड-लाइन विकल्प "-O" (कैपिटल लेटर O; छोटा अक्षर समान नहीं होगा!) विकल्प "-O", वैकल्पिक रूप से "-remote-name" कर्ल बताता है, कि सहेजी गई फ़ाइल मिलती है। URL के फ़ाइल-नाम भाग के समान नाम।

इसे "इनवोक-वेबरैस्ट" के लिए एलियास "कर्ल" से अलग करने के लिए, इसे "कर्ल। Exe" के रूप में शुरू करने की आवश्यकता है। संयोग से यह बिना बदलाव के cmd.exe में काम करता है।

एक और उदाहरण के रूप में एक ही जवाब में यहाँ का उपयोग कर

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

(साइट मुझे इस टिप्पणी के रूप में जोड़ने की अनुमति नहीं देगी, क्योंकि मुझे स्पष्ट रूप से इसके लिए और अधिक "प्रतिष्ठा" की आवश्यकता है - इसलिए इसे एक नया उत्तर मिलेगा)


0

इनवॉइट-वेबरैस्ट के साथ -outfile पैरामीटर एक स्ट्रिंग की अपेक्षा करता है, इसलिए यदि आपका फ़ाइल नाम एक नंबर से शुरू होता है, और उद्धरणों में संलग्न नहीं होता है, तो कोई आउटपुट फ़ाइल नहीं बनाई जाती है।

जैसे। Invoke-WebRequest -Uri "http://www.google.com/" -outfile "2.pdf"

यह अक्षर से शुरू होने वाले फ़ाइल नाम को प्रभावित नहीं करता है।


इस समाधान को अन्य उत्तरों में वर्णित किया गया है ( wgetयह एक उपनाम है Invoke-WebRequest, और उपरोक्त में से एक समान है)
बर्टिएब

उत्तर का मुद्दा नोट पर जोर देना था। वाक्यविन्यास त्रुटि के कारण कोई भी उत्तर कोई फ़ाइल नहीं बना रहा है।
जोम्बा

वास्तव में अन्य उत्तर पर एक टिप्पणी होनी चाहिए [s]
बर्टिएब

यह उत्तर अन्य उत्तरों में प्रदान नहीं किया गया है और न ही ऊपर वाले के समान है।
जोम्बा

-1

यह आपके लिए काम करना चाहिए कि कोई भी ब्राउज़र इनिशियलाइज़्ड सामान न ले। "-UseBasicParsing" परम पर ध्यान दें।

Invoke-WebRequest http://localhost -UseBasicParsing

(1) "कोई ब्राउज़र इनिशियलाइज़्ड सामान" क्या है? (२) ध्यान दें कि स्वीकृत उत्तर में पहले से उल्लेख है -UseBasicParsing
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.