PowerShell Wget: تنزيل الملفات بسهولة

هل تحتاج إلى تنزيل الملفات من الويب ولكنك تكره النقر على الروابط مرارًا وتكرارًا؟ إذا كانت مهمتك تتضمن تنزيل الملفات من الويب بانتظام ، فمن المحتمل أنك ترغب في أتمتة المهمة. لماذا لا تستخدم PowerShell لتنزيل الملفات تمامًا كـ PowerShell wget البديل؟

تحتوي Windows PowerShell و PowerShell على إمكانيات تنزيل الملفات. استخدام PowerShell لتنزيل الملفات يعتمد على معرفة الأوامر وفئات .NET المناسبة للاستخدام وكيفية استخدامها.

في هذه المقالة ، ستتعلم الطرق المختلفة لاستخدام PowerShell لتنزيل الملفات من الويب.

المتطلبات المسبقة

نظرًا لأن هذه المقالة تعتمد على مبدأ التعلم من خلال القيام بالأمور ، هناك بعض المتطلبات المسبقة للتأكد من قدرتك على اتباع الأمثلة. فيما يلي المتطلبات الأساسية.

  • A computer that is running on Windows 10 or higher. This computer is where you will run the scripts/commands featured in this article.
  • Windows PowerShell 5.1 أو PowerShell 7.1 (الموصى به).
    • يتضمن Windows 10 بالفعل Windows PowerShell 5.1.
  • A web site that hosts the files to download.
    • بالنسبة للتنزيلات غير المصادق عليها ، يُنصح باستخدام موقع “Tele2 Speedtest” المجاني.
    • إذا كنت ترغب في اختبار تنزيل الملفات بالمصادقة ، فقد تحتاج إلى بناء خادم ملفات HTTP الخاص بك. مثال على خادم ملفات HTTP مجاني هو “HFS by Rejetto”.

استخدام PowerShell لتنزيل الملفات من عناوين URL: أربع طرق

هناك أربع طرق لاستخدام PowerShell لتنزيل الملفات التي لا تعتمد على أدوات الأطراف الثالثة. هذه الطرق هي:

  • Invoke-WebRequest
  • Invoke-RestMethod
  • Start-BitsTransfer
  • .NET WebClient Class.

أياً كان الأسلوب الذي تستخدمه من هذه الطرق الأربع، فإن المنطق والعناصر المكونة لجعلها تعمل هي نفسها. يجب أن يكون هناك عنوان URL يشير إلى موقع الملف ومسار الوجهة لحفظ الملفات المُحمَّلة. إذا كان ذلك مطلوبًا من خادم الويب، فيجب عليك أيضًا إدخال بيانات الاعتماد.

توضح الأقسام التالية كل واحدة من هذه الطرق الأربع. في النهاية، يتوقف الأمر عليك لتقرر الطريقة التي ترغب في استخدام PowerShell لتنزيل الملفات.

استخدام Invoke-WebRequest كبديل لأمر wget في PowerShell

أول طريقة في PowerShell لتنزيل الملفات هي باستخدام أمر Invoke-WebRequest. ربما يكون أكثر الأوامر استخدامًا في هذه المقالة، يمكن لأمر Invoke-WebRequest تنزيل روابط HTTP و HTTPS و FTP.

سواء كان موقع المصدر يتطلب من المستخدمين تسجيل الدخول أم لا، فإن أمر Invoke-WebRequest يمكنه التعامل مع الطلبات بوجود بيانات الاعتماد.

لتنزيل ملف، يوضح النحو أدناه الحد الأدنى من المعلمات المطلوبة لتحقيق النتيجة المرغوبة.

Invoke-WebRequest -Uri <source> -OutFile <destination>

على سبيل المثال، يقوم الكود أدناه بتنزيل ملف بالاسم 10MB.zip من موقع ويب. ثم يحفظ الملف المُنزَّل في C:\dload\10MB.zip. يمكنك نسخ الكود أدناه ولصقه في جلسة PowerShell الخاصة بك للاختبار.

# موقع الملف المصدر
$source = 'http://speedtest.tele2.net/10MB.zip'
# وجهة حفظ الملف
$destination = 'c:\dload\10MB.zip'
# تنزيل الملف
Invoke-WebRequest -Uri $source -OutFile $destination

العرض أدناه يوضح النتيجة المتوقعة بعد تشغيل الكود أعلاه في PowerShell. كما يمكن ملاحظة نجاح تنزيل الملف.

PowerShell wget : Downloading a file using Invoke-WebRequest

ماذا لو كان المصدر يتطلب مصادقة قبل السماح بالوصول؟ على سبيل المثال، يقوم الكود أدناه بتنزيل ملف من موقع ويب خاص حيث يجب على المستخدمين تسجيل الدخول.

$source = 'https://mirror.lzex.ml/100MB.zip'
$destination = 'c:\dload\100MB.zip'
Invoke-WebRequest -Uri $source -OutFile $destination

ومع ذلك، فإن عملية التنزيل فشلت بسبب عدم الوصول المصرح به.

Downloading failed due to unauthorized access

إذا كانت المصادقة مطلوبة، فيجب عليك إضافة بيانات اعتماد إلى الطلب باستخدام المعامل -Credential. السطر الأول في الكود أدناه يطلب منك إدخال بيانات الاعتماد (اسم المستخدم وكلمة المرور) ويخزنها في المتغير $credential.

$credential = Get-Credential
$source = 'https://mirror.lzex.ml/100MB.zip'
$destination = 'c:\dload\100MB.zip'
Invoke-WebRequest -Uri $source -OutFile $destination -Credential $credential

العرض أدناه يوضح ما يمكنك توقعه عند تشغيل الكود أعلاه في PowerShell. كما يمكن ملاحظة أن cmdlet Get-Credential قام بطلب اعتماد PowerShell. وهذه المرة، باستخدام الاعتماد مع Invoke-WebRequest أسفر عن تنزيل ناجح.

Downloading a file with authentication

ذات الصلة: استخدام أداة Get-Credential في PowerShell وجميع أمور الاعتمادات

البحث عن أخطاء التحليل عند استخدام Invoke-WebRequest

A crucial thing to remember when using Invoke-WebRequest in Windows PowerShell is that, by default, this cmdlet uses the Internet Explorer engine to parse data. The error below may happen when using Invoke-WebRequest on computers without the Internet Explorer in it.

سيتعين عليك إعادة إصدار الأمر الخاص بك، ولكن هذه المرة، قم بتضمين مفتاح -UseBasicParsing.

Invoke-WebRequest -Uri <source> -OutFile <destination> -UseBasicParsing

في Windows PowerShell ، قد تتلقى رسالة خطأ: لا يمكن تجزئة محتوى الاستجابة لأن محرك Internet Explorer غير متاح ، أو أن تكوين التشغيل الأولي لـ Internet Explorer غير مكتمل. حدد معلمة UseBasicParsing وحاول مرة أخرى.

ابتداءً من PowerShell Core 6.0 ، يستخدم cmdlet Invoke-WebRequest التجزئة الأساسية فقط. وبالتالي ، لم يعد من الضروري استخدام معلمة -UseBasicParsing.

استخدام Invoke-RestMethod

يتعلق cmdlet Invoke-RestMethod أكثر بإرسال طلب HTTP أو HTTPS إلى خدمة ويب RESTful. يعد هذا الأمر المناسب أكثر للطلبات التي تتفاعل مع واجهات برمجة التطبيقات REST مثل Microsoft Graph API.

عندما يتعلق الأمر بتنزيل الملفات مباشرة من الويب ، فإن Invoke-RestMethod هو متنافس ممتاز. لا تدع نفسك تظن خلاف ذلك. ليس هناك الكثير من الاختلاف بين استخدام Invoke-RestMethod و Invoke-WebRequest عند استخدامهما لتنزيل الملفات من رابط ويب مباشر.

تنزيل ملف باستخدام Invoke-RestMethod

لتنزيل ملف باستخدام Invoke-RestMethod ، استخدم الصيغة أدناه. ستلاحظ أن الأمر يستخدم نفس المعلمات مثل Invoke-WebRequest.

Invoke-RestMethod -Uri <source> -OutFile <destination>

في الشفرة المثالية أدناه ، يتم تنزيل الملف من قيمة URL في المتغير $source. ثم يتم حفظه في المسار المحدد في المتغير $destination.

$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
Invoke-RestMethod -Uri $source -OutFile $destination

إذا كان المصدر يتطلب مصادقة، فيمكنك تمرير بيانات الاعتماد باستخدام معامل -Credential. في المثال أدناه، يتم طلب بيانات الاعتماد وتخزينها في المتغير $credential. ثم يتم تمرير قيمة المتغير $credential إلى معامل -Credential.

أيضًا، نظرًا لأن رابط الملف هو مصدر HTTP وليس HTTPS، فهذا يعني أنك ترسل مصادقة غير مشفرة. عادةً، يجب تجنب استخدام مصادر HTTP لأسباب أمان. ولكن إذا كنت تحتاج إلى استخدام مصدر HTTP، فعليك إضافة مفتاح -AllowUnencryptedAuthentication إلى الأمر الخاص بك.

$credential = Get-Credential
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
Invoke-RestMethod -Uri $source -OutFile $destination -Credential $credential -AllowUnencryptedAuthentication

استخدام Start-BitsTransfer

تم تصميم Start-BitsTransfer خصيصًا لنقل الملفات بين أجهزة العميل والخادم. هذا الأمر في PowerShell يعتمد على خدمة نقل البيانات الذكية الخلفية (BITS) التي تكون أصلية في نظام التشغيل Windows.

نظرًا لأن Start-BitsTransfer يتطلب BITS للعمل، فإن هذا الأمر غير متاح على أجهزة غير Windows. ومن الجانب الآخر، يستفيد Start-BitsTransfer من فوائد BITS نفسه. وبعض هذه الفوائد هي:

  • وعي بعرض النطاق الترددي واستخدامه في الشبكة.
  • التعامل مع الانقطاعات (استئناف التنزيل تلقائيًا، وإلغاء التنزيل مؤقتًا، وما إلى ذلك)
  • تنزيل ملفات متعددة كوظائف خلفية.
  • القدرة على تعيين أولوية للمهمة التنزيل.

تنزيل ملف

الطريقة الأساسية لاستخدام Start-BitsTransfer في PowerShell لتنزيل ملف هي تحديد المصدر والوجهة. باستخدام النص أدناه، تحتاج فقط إلى تغيير قيم $source و $destination وفقًا لاحتياجاتك.

$source = 'http://speedtest.tele2.net/100MB.zip'
$destination = 'c:\dload\100MB.zip'
Start-BitsTransfer -Source $source -Destination $destination

كما يمكن ملاحظة من العرض التوضيحي أدناه، يتم تنزيل الملف إلى المسار c:\dload\100MB.zip.

Downloading a file using Start-BitsTransfer

في حالة عدم تحديد الوجهة، يقوم Start-BitsTransfer بتنزيل وحفظ الملف في دليل العمل الحالي. على سبيل المثال، إذا قمت بتشغيل Start-BitsTransfer من C:\dload، سيتم تنزيل الملف إلى نفس الدليل.

بالنسبة للتنزيلات التي تتطلب المصادقة، يحتوي Start-BitsTransfer على معلمة -Credential التي تقبل كائن PSCredential.

تنزيل ملفات متعددة

لتوضيح تنزيل ملفات متعددة، ستحتاج إلى إنشاء ملف CSV يحتوي على عمودين. قم بتسمية الملف filelist.txt. يجب أن يحتوي العمود الأول على رابط المصدر، بينما يجب أن يحتوي العمود الثاني على مسار الوجهة. يجب أن يكون محتوى الملف مشابهًا للمثال أدناه.

# المصدر,الوجهة
http://speedtest.tele2.net/1MB.zip,c:\dload\1MB.zip
http://speedtest.tele2.net/10MB.zip,c:\dload\10MB.zip
http://speedtest.tele2.net/100MB.zip,c:\dload\100MB.zip

ذات صلة: إدارة ملفات CSV في PowerShell باستخدام Import-Csv

بمجرد أن يكون الملف CSV جاهزًا ، استخدم الأمر أدناه لبدء تنزيل الملف. يقوم الأمر بإستيراد الملف CSV باستخدام Import-Csv ويمرر المحتويات إلى Start-BitsTransfer.

Import-Csv .\filelist.csv | Start-BitsTransfer

ارجع إلى العرض التوضيحي أدناه لمعرفة كيفية عمل الشفرة أعلاه. كما يمكنك رؤية بدء التنزيل ومشاهدة تقدم التنزيل. لا يتوفر سطر الأوامر PowerShell أثناء عملية التنزيل.

Starting a synchronous multiple file download

فلنفترض أنك ترغب في بدء عملية التنزيل كوظيفة خلفية. للقيام بذلك ، يكفي إضافة مفتاح التبديل -Asynchronous في نهاية أمر Start-BitsTransfer.

Import-Csv .\filelist.csv | Start-BitsTransfer -Asynchronous

في البداية ، سيظهر حالة كل وظيفة على أنها “قيد الاتصال”. يوضح اللقطة أدناه معرف الوظيفة لكل تنزيل للملف.

Starting file download as background jobs

الآن بعد أن بدأت عملية التنزيل ، سترغب في التحقق مما إذا تم إكمال التنزيل. للتحقق من حالة وظيفة التنزيل ، استخدم أمر Get-BitsTransfer. كما يمكنك رؤية أدناه ، تم تغيير حالة وظائف التنزيل إلى “تم النقل”.

Viewing the file download job status

استخدام فئتي WebClient و HttpClient (.NET Framework)

يعتمد PowerShell على .NET ، وطبيعتها تجعلها قادرة على استغلال قوة .NET نفسها. هناك فئتان في .NET يمكنك استخدامهما في PowerShell لتنزيل الملفات؛ WebClient و HttpClient.

إذا كنت ترغب في معرفة المزيد عن هاتين الفئتين في .NET بطريقة تطويرية وتقنية أكثر، يمكنك البدء مع → متى يجب استخدام WebClient مقابل HttpClient مقابل HttpWebRequest. في القسم التالي، ستتعلم كيفية استخدام WebClient و HttpClient في PowerShell لتنزيل الملفات من الويب.

تنزيل ملف باستخدام System.Net.WebClient

لاستخدام فئة WebClient ، تحتاج إلى إنشاء كائن بنوع System.Net.WebClient. في المثال أدناه، يكون $webClient كائن System.Net.WebClient الجديد. ثم، باستخدام طريقة DownloadFile() يتم بدء تنزيل الملف من المصدر.

ذات صلة: استخدام مسرعات أنواع البيانات في PowerShell لتسريع البرمجة

يرجى نسخ الكود أدناه وتشغيله في جلسة PowerShell الخاصة بك للاختبار. يرجى ملاحظة أنك لن ترى أي تقدم أو نتائج على الشاشة ما لم يحدث خطأ. ومع ذلك، ستكون واجهة سطر الأوامر مغلقة حتى اكتمال التنزيل.

# قم بتحديد رابط المصدر ومسار الوجهة
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
# قم بإنشاء WebClient الجديد
$webClient = [System.Net.WebClient]::new()
# قم بتنزيل الملف
$webClient.DownloadFile($source, $destination)

إذا كانت المصدر يتطلب المصادقة للسماح بتنزيل الملف، يمكنك استخدام الكود أدناه. السطر الأول يطلب بيانات اعتماد المستخدم ويخزنها في المتغير “$credentials”. ثم يتم تضمين قيمة “$credential” في طلب تنزيل الملف.

# طلب اسم المستخدم وكلمة المرور
$credentials = Get-Credential
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
# إنشاء WebClient جديد
$webClient = [System.Net.WebClient]::new()
# إضافة بيانات اعتماد المستخدم
$webClient.Credentials = $credentials
# تنزيل الملف
$webClient.DownloadFile($source, $destination)

وفقًا لـ مستند Microsoft هذا: “نحن لا نوصي باستخدام فئة WebClient للتطوير الجديد. بدلاً من ذلك، استخدم فئة System.Net.Http.HttpClient.”

يبدو أن فئة WebClient قديمة العهد، والفئة الجديدة التي يروج لها Microsoft هي فئة HttpClient. لكن لا تقلق. تتحدث الجزء التالي عن استخدام فئة HttpClient في PowerShell لتنزيل الملفات من الويب.

تنزيل ملف باستخدام System.Net.Http.HttpClient

مثل فئة WebClient، يجب عليك أولاً إنشاء System.Net.Http.HttpClient. باستخدام الكود أدناه، يتم تنزيل الملف من المصدر $source إلى الوجهة $destination. راجع التعليقات أعلاه لمعرفة وظيفة كل سطر من الأكواد.

الشفرة أدناه مباشرة، ويمكنك اختبارها عن طريق تشغيلها في جلسة PowerShell الخاصة بك.

# قم بتعيين المصدر والوجهة
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
 
# قم بإنشاء طلب تنزيل عميل HTTP
$httpClient = New-Object System.Net.Http.HttpClient
$response = $httpClient.GetAsync($source)
$response.Wait()
 
# قم بإنشاء تدفق ملف موجه إلى وجهة الملف الناتج
$outputFileStream = [System.IO.FileStream]::new($destination, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
 
# نقل التنزيل إلى تدفق ملف الوجهة
$downloadTask = $response.Result.Content.CopyToAsync($outputFileStream)
$downloadTask.Wait()
 
# أغلق تدفق الملف
$outputFileStream.Close()

في الحالات التي يتطلب فيها تنزيل ملف المصادقة، يجب عليك إضافة بيانات الاعتماد إلى كائن HttpClient. لتضمين بيانات الاعتماد في طلب تنزيل الملف، قم بإنشاء كائن جديد System.Net.Http.HttpClientHandler لتخزين بيانات الاعتماد.

يمكنك نسخ الشفرة أدناه وتشغيلها في PowerShell للاختبار. أو يمكنك أيضًا تشغيلها كنص PowerShell. في هذا المثال، يتم حفظ الشفرة كـ download-file.ps1.

# قم بتعيين المصدر والوجهة
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
 
# اطلب بيانات الاعتماد
$credentials = Get-Credential

# قم بإنشاء طلب تنزيل عميل HTTP مع بيانات الاعتماد
$handler = New-Object System.Net.Http.HttpClientHandler
$handler.Credentials = $credentials
$httpClient = New-Object System.Net.Http.HttpClient($handler)
$response = $httpClient.GetAsync($source)
$response.Wait()
 
# قم بإنشاء تدفق ملف موجه إلى وجهة الملف الناتج
$outputFileStream = [System.IO.FileStream]::new($destination, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
 
# نقل التنزيل إلى تدفق ملف الوجهة
$downloadTask = $response.Result.Content.CopyToAsync($outputFileStream)
$downloadTask.Wait()
 
# أغلق تدفق الملف
$outputFileStream.Close()

العرض التوضيحي أدناه يوضح النتيجة عند تشغيل سكريبت PowerShell لتنزيل الملف.

في البداية ، تحتوي المجلد فقط على ملف السكريبت فيه. يتم طلب إدخال اسم المستخدم وكلمة المرور. ثم يتابع السكريبت عملية تنزيل الملف. بعد تنزيل الملف ، يمكنك مشاهدة الملف الجديد الآن داخل المجلد المستهدف.

Downloading a file using the .NET HttpClient class

الاستنتاج

تأتي Windows PowerShell و PowerShell Core مع إمكانيات مدمجة لتنزيل الملفات ، وتعمل كبديل PowerShell wget! سواء كانت المصادر المحمية بكلمة مرور أو ملفات فردية أو متعددة – يتوفر لديك طريقة PowerShell.

تعمل طرق تنزيل الملفات المشمولة في هذه المقالة على كل من Windows PowerShell و PowerShell Core. يعني هذا أن هذه الطرق تنطبق على كل من أنظمة Windows وغير Windows ، باستثناء Start-BitsTransfer.

وبما أن PowerShell هو أكثر من سطر أوامر ، يمكنك ترجمة ما تعلمته إلى سكريبتات. بالنسبة لك ، يعني ذلك فرصة للتشغيل التلقائي. لا داعي لنسخ عناوين URL أو النقر على الروابط أو الانتظار للتنزيل يدويًا.

Source:
https://adamtheautomator.com/powershell-download-file/