سؤال بديل بديل لـ wget في Windows PowerShell؟


أعلم أنه يمكنني تنزيل وتثبيت المكتبة المذكورة (wget لنظام التشغيل Windows) ، ولكن سؤالي هو:

في Windows PowerShell ، هل هناك بديل أصلي لـ wget؟

احتاج wget ببساطة لاستعادة ملف من عنوان URL محدد باستخدام HTTP GET. على سبيل المثال:

wget http://www.google.com/

253
2017-11-28 09:56


الأصل


أنظر أيضا superuser.com/questions/25538/... - jiggunjer


الأجوبة:


إليك بطاقة PS 3.0 بسيطة وأخرى لاحقة تعمل والتي لا تنطوي على الكثير من PS barf:

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

لاحظ أن:

  • wget هو اسم مستعار لـ Invoke-WebRequest
  • Invoke-WebRequest بإرجاع HtmlWebResponseObjectوالتي تحتوي على الكثير من خصائص تحليل HTML المفيدة مثل الروابط والصور والنماذج و InputFields وغيرها ، ولكن في هذه الحالة نحن نستخدم فقط المحتوى الخام
  • يتم تخزين محتويات الملف في الذاكرة قبل الكتابة على القرص ، مما يجعل هذه الطريقة غير مناسبة لتنزيل الملفات الكبيرة
  • في عمليات تثبيت Windows Server Core ، ستحتاج إلى كتابة هذا كـ

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
  • قبل 20 سبتمبر 2014 ، اقترحت

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

    كإجابة. ومع ذلك ، هذا لا يعمل في جميع الحالات ، مثل > المشغل (الذي هو اسم مستعار ل Out-File) يحول المدخلات إلى Unicode.

إذا كنت تستخدم Windows 7 ، فستحتاج إلى تثبيت الإصدار 4 أو الأحدث من Windows Management Framework.

قد تجد أن تفعل $ProgressPreference = "silentlyContinue" قبل Invoke-WebRequest سيحسن بشكل كبير سرعة التنزيل مع الملفات الكبيرة ؛ يتحكم هذا المتغير في ما إذا تم تقديم واجهة مستخدم التقدم.


207
2017-12-26 06:47



هذا هو الآن الجواب الصحيح ، وركضت في wget اختبار بطريق الخطأ إذا كان لي تثبيت wget الفعلي. مزعج أنه لا يمكن الحصول على اسم الملف بسهولة (يجب عليك تحديده في إعادة توجيه الإخراج) ، ولكن هذا الخيار لديه واجهة مستخدم أفضل من wget الحقيقي (في رأيي) لذلك هناك ذلك. - Matthew Scharley
لكن يأتي Windows 7 فقط مع PowerShell 2.0وستكون النتيجة "لم يتم التعرف على المصطلح" Invoke-WebRequest "كاسم أمر cmdlet ، ...". - Peter Mortensen
التحذير العادل: ستضع هذه الطريقة محتوى الملف بالكامل في الذاكرة قبل كتابته إلى الملف. هذا ليس حلاً جيدًا لتنزيل الملفات الكبيرة. - im_nullable
im_nullable ، مكالمة جيدة - لقد أضفت ذلك إلى المشاركة. - Warren Rumak
dezza لقد قمت بتحديث الإجابة بنهج مختلف. حاول مرة أخرى. - Warren Rumak


إذا كنت بحاجة فقط لاسترداد ملف ، يمكنك استخدام تحميل الملف طريقة العميل على شبكة الإنترنت موضوع:

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

أين $url هي سلسلة تمثل عنوان URL للملف و $path يمثل المسار المحلي الذي سيتم حفظ الملف فيه.

لاحظ أن $path يجب أن يتضمن اسم الملف لا يمكن أن يكون مجرد دليل.


175
2017-11-28 10:20



حتى الآن كان هذا هو الحل الأفضل المقترح. أيضا بالنظر إلى أنه يبدو أنني يمكن إعادة كتابتها في تنسيق سطر واحد كما (new-object System.Net.WebClient).DownloadFile( '$url, $path) هذا هو أفضل المراسلات ل wget لقد رأيت حتى الآن. شكر! - jsalonen
كملاحظة جانبية ، يمكنك أيضًا القيام بذلك بشكل غير متزامن باستخدام شيء مثل (كائن جديد System.Net.WebClient) .DownloadFileAsync (url ، filePath) - James
هل يمكننا جلب نص معين عبر Webclient والخروج إلى نوتة؟ شكر - Mowgli
نعم ، هذا يعمل من خارج العلبة على Windows 7 (يأتي مع PowerShell 2.0). عينة: $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html") - Peter Mortensen
للحصول على مجرد عنوان url وتجاهل النتائج (على سبيل المثال ، جزء من برنامج نصي للتدفئة يستخدم IIS) استخدم DownloadData: (new-object System.Net.WebClient).DownloadData($url) | Out-Null - BurnsBA


يوجد Invoke-WebRequest في الإصدار 3 من PowerShell القادم:

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

81
2017-08-10 23:38



كل أناقة dd... - gWaldo
gWaldo كنت تمزح - وهذا هو الفرح لاستخدام (التحدث باسم شخص مجرد تعلم PS) - Jack Douglas
أنا فقط أعني أن -Outfile يبدو المعلمة غريبة إذا كنت تستخدم فقط > (للكتابة فوق) أو >> (إلحاق) إلى ملف. - gWaldo
gWaldo أو حتى نستنتج اسم الملف من عنوان URL تمامًا wget هل :) - Peltier
واعتبارًا من PS 4.0 ، wget و curl هي aliasted ل Invoke-WebRequest(iwr) افتراضيًا: D - Bob


انها فوضوي بعض الشيء ولكن هناك هذا بلوق وظيفة الذي يعطيك تعليمات لتنزيل الملفات.

بدلا من ذلك (وهذا هو واحد أوصي) يمكنك استخدام BITS:

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

سيظهر التقدم وسيقوم بتنزيل الملف إلى الدليل الحالي.


16
2017-11-28 10:18



يعتمد BITS على الدعم في نهاية الخادم ، إذا كان هذا متوفرًا في الخلفية ويمكنك الحصول على تحديثات التقدم مع أوامر cmdlets الأخرى. - Richard
حاولت الجلب google.comلكن كل ما أحصل عليه هو Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). أنا في حيرة: | - jsalonen
jsalonen أعتقد أن BITS ستقوم فقط بتنزيل الملفات بدلاً من الصفحات. كما يقول ريتشارد أنه يعتمد على بعض الدعم من جانب الخادم (على الرغم من أنني لا أعتقد أنه محدد لـ Microsoft). - Matthew Steeples
أرى وأعتقد أنني حصلت على نقطة في استخدام BITS ، ولكن ليس ما أبحث عنه هنا. - jsalonen
أحتاج أن أتذكر ذلك. شكر! - flickerfly


PowerShell V4 One-liner:

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

أو

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

هذا هو في الأساس وارن (رهيبة) V3 واحد الخطوط الملاحية المنتظمة  (شكرا على هذا!) - مع تغيير بسيط من أجل جعلها تعمل في V4 PowerShell.

وارن واحد الخطوط الملاحية المنتظمة - التي تستخدم ببساطة wget عوضا عن iwr - لا يزال العمل ل V3 (على الأقل ، على ما أظن ؛ لم أختبره ، مع ذلك). على أي حال. ولكن عند محاولة تنفيذها في V4 PowerShell (كما حاولت) ، سترى فشل PowerShell في حل wget كمكودت / برنامج صحيح.

للمهتمين ، وهذا هو - كما التقطت من تعليق بوب ردا على الجواب المقبول  (شكرا يا رجل!) - لان بدءًا من PowerShell V4 ، wget و curl مستعارة ل Invoke-WebRequest، ضبط ل iwr بشكل افتراضي. وهكذا، wgetلا يمكن حلها (طالما curl لا يمكن أن تعمل هنا).


6
2018-05-25 10:22





هذه هي وظيفة 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  

4
2017-08-12 10:48





ستحصل الوظيفة التالية على عنوان 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. لا يلزم استخدام الأسطر الأربعة الأخيرة إلا إذا كنت وراء خادم مصادقة. للاستخدام البسيط ، (New-Object Net.WebClient).DownloadFile($url, $path) يعمل بشكل جيد.
  2. الطريق يجب يكون مطلقًا ، نظرًا لأن التنزيل لم يتم في الدليل الحالي ، لذلك ستؤدي المسارات النسبية إلى فقد التنزيل في مكان ما.
  3. ال if (!$path) {...} يعالج القسم الحالة البسيطة حيث تريد فقط تنزيل الملف إلى الدليل الحالي باستخدام الاسم الوارد في عنوان URL.

2
2017-12-15 15:26





استخدم Windows 10 bash shell الذي يتضمن wget بمجرد إعداد ميزة windows.

كيفية تثبيت Ubuntu bash shell على نظام التشغيل Windows:

يوتيوب: تشغيل باش على أوبونتو على ويندوز!

ويندوز النظام الفرعي لتوثيق لينكس


1
2017-09-27 03:21



ضع في اعتبارك إضافة مرجع مقتبس إلى هذه الإجابة يدعم ما تنص عليه في حالة وفاة الارتباط حتى لا يزال محتوى الإجابة متاحًا حاليًا فقط عبر هذا الرابط وفقًا لاقتراحك. - Pimp Juice IT