التخطي إلى المحتوى

شعار Powershell

بروتوكول نقل الملفات (FTP) هو خدمة شائعة تستخدم لنقل الملفات بين العملاء والخوادم. غالبًا ما يكون من المفيد أتمتة عمليات نقل الملفات هذه ، ويمكن أن تكون البرامج النصية لـ PowerShell مفيدة لتسريع هذه العملية.

كيفية استخدام FTP في بوويرشيل

هناك عدة طرق مختلفة لإجراء عمليات نقل FTP في PowerShell.

أبسط هو استخدام WebClient.UploadFile. PowerShell هي لغة برمجة نصية موجهة للكائنات ، ولديك حق الوصول الكامل إليها .NET المكتبات الافتراضية مع New-Object. مع هذا ، يمكنك إنشاء واحدة جديدة WebClientقم بتعيين بيانات الاعتماد الخاصة به ، وقم بتحميل ملف.

$client = New-Object System.Net.WebClient
$client.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$client.UploadFile("ftp://example.com/path/archive.zip", "C:archive.zip")

سيعمل هذا بشكل جيد ، لكنه لن يكون قادرًا على معالجة الطلبات المشفرة باستخدام بروتوكول TLS / SSL ، أو إجراء عمليات نقل FTP “نشطة”. استخدام FtpWebRequestالمغطاة أدناه ، سوف تحل هذه المشكلة.

ليس من الأفضل تخزين اسم المستخدم وكلمة المرور في برنامج نصي ، خاصة إذا كان هذا البرنامج النصي ملتزمًا بمستودع Git مشترك. يمكنك بدلاً من ذلك تعيين متغيرات البيئة مثل FtpUsername والوصول إليها في البرنامج النصي.

function uploadToFTPServer($remote, $local) {
    $client = New-Object System.Net.WebClient
    $client.Credentials = New-Object System.Net.NetworkCredential($Env:FtpUsername, $Env:FtpPassword)
    $client.UploadFile($remote, $local)
}

uploadToFTPServer "ftp://example.com/path/archive.zip", "C:archive.zip"

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

عمليات نقل FTP المتقدمة باستخدام PowerShell

إذا كنت بحاجة إلى مزيد من التحكم ، فيجب عليك استخدامه FtpWebRequest. سيدعم هذا عمليات نقل TLS ، ويسمح لك أيضًا بإيقاف تشغيل الوضع الخامل. أسهل طريقة لاستخدامه هي فتح دفق ملف ونسخه إلى دفق FTP.

function uploadToFTPServer($remote, $local) {
    $request = [System.Net.FtpWebRequest]::Create($remote)
    $request.Credentials = New-Object System.Net.NetworkCredential($Env:FtpUsername, $Env:FtpPassword)
    $request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
    $request.UsePassive = $true

    $fileStream = [System.IO.File]::OpenRead($local)
    $ftpStream = $request.GetRequestStream()

    $fileStream.CopyTo($ftpStream)

    $ftpStream.Dispose()
    $fileStream.Dispose()
}

uploadToFTPServer "ftp://example.com/archive.zip" "C:archive.zip"

نظرًا لأنه يستخدم تدفقات الملفات ، وليس قراءة كل وحدات البايت ، فإن هذا له ميزة العمل بشكل أفضل مع عمليات نقل الملفات الضخمة.

إرسال تحويلات SFTP باستخدام Posh-SSH

SFTP هو بروتوكول FTP بديل يعمل عبر SSH. يعد استخدامه أكثر تعقيدًا قليلاً من استخدام FTP العادي ، حيث لا يمكنك فقط إرسال اسم مستخدم وكلمة مرور ، ولا يدعمه PowerShell الأصلي.

ستحتاج إلى تثبيت ملف Posh-SSH حزمة للتواصل عبر SFTP:

Install-Module -Name Posh-SSH

بعد ذلك ستتمكن من بدء جلسة جديدة باستخدام كائن بيانات اعتماد جديد. يعمل هذا بنفس طريقة عمليات نقل طلبات الويب ، باستثناء أنك ستحتاج أيضًا إلى إغلاق الجلسة في النهاية.

Import-Module Posh-SSH

$Password = ConvertTo-SecureString $Env:FtpPassword -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential ($Env:FtpUsername, $Password)

$FilePath = "C:archive.zip"
$SftpPath="/folder"

$ThisSession = New-SFTPSession -ComputerName '1.2.3.4' -Credential $Credential

Set-SFTPFile -SessionId ($ThisSession).SessionId -LocalFile $FilePath -RemotePath $SftpPath
Get-SFTPSession | % { Remove-SFTPSession -SessionId ($_.SessionId) }

إرسال ملفات ضخمة مع شريط تقدم في PowerShell

باستخدام ملف دفق CopyTo أمر بسيط ، ولكن بالنسبة لعمليات النقل الطويلة ، قد ترغب في نوع من مراقبة التقدم. هذا أمر معقد بعض الشيء لإضافته ، حيث سيتعين عليك نسخ التدفقات بنفسك ، لكنه يعمل بشكل جيد مع النص التالي:

$request = [Net.WebRequest]::Create("ftp://example.com/path/archive.zip")
$request.Credentials =
New-Object System.Net.NetworkCredential($Env:FtpUsername, $Env:FtpPassword)
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile

$fileStream = [System.IO.File]::OpenRead("C:archive.zip")
$ftpStream = $request.GetRequestStream()

$buffer = New-Object Byte[] 10240
while (($read = $fileStream.Read($buffer, 0, $buffer.Length)) -gt 0)
{
    $ftpStream.Write($buffer, 0, $read)
    $pct = ($fileStream.Position / $fileStream.Length)
    Write-Progress `
        -Activity "Uploading" -Status ("{0:P0} complete:" -f $pct) `
        -PercentComplete ($pct * 100)
}

$ftpStream.Dispose()
$fileStream.Dispose()

التعليقات

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني.