تظاهر بالكتابة بلغة C # ، ولكن فقط في Powershell



Powershell هي واجهة برمجة تطبيقات سهلة الاستخدام مبنية على .net. يتيح Powershell للمستخدمين كتابة نصوص برمجية دون الحاجة إلى عناء البرمجة ، مع الاستمرار في الحصول على نتائج مماثلة. ماذا يحدث في KDVP ، سيشرح المؤلف لاحقًا في النص. نحن الآن بحاجة ماسة إلى التظاهر بأننا نبرمج في C #.



TL ؛ DR: لا حاجة إلى ساعي البريد إذا كان Powershell متاحًا. لكن عليك أولاً أن تذهب من بعيد.



عمل فصل بسيط



سمعت أن المبرمجين الرائعين يفعلون كل شيء من خلال الفصول وطرقهم.

نظرًا لأن PowerShell يسمح بذلك ، دع المؤلف يوضح لك كيف يمكنك إضافة 1 + 1 أثناء التظاهر بالبرمجة.



class ClassName {
 
    [string] Sum ($A, $B) {
       
        $Result = $A + $B
        return $Result
    }
}


إليك فئة ClassName وطريقة Sum الخاصة بها. يمكن استدعاء مثيل لفئة بنفس الطريقة تمامًا كما في لغات البرمجة الحقيقية.



$NewClass = [ClassName]::new()
$NewClass.Sum(1, 1)


نقوم بإنشاء مثيل جديد للفئة وندعو الطريقة ، كل شيء بسيط.



هل هناك فراغ في بوويرشيل



عند كتابة نصوص معقدة ، نشأ نفس السؤال من المؤلف. كيف أقوم بعمل دالة ستكون باطلة؟



يقولون أنه يمكنك القيام بذلك:



Get-Date | Out-Null


ومع ذلك ، فإن | يقوم Out-Null أيضًا بمنع كل Verbose و ErrorAction ولا يعمل مع Invoke-Command.



إذا كنت بحاجة إلى وظيفة مع [Void] - أنشئ فئة جديدة ، فلا يوجد مخرج آخر.



class ClassName {
 
    # 
    [void] Start () {
        #       .
        $q = [ClassName]::new()
        $q.GetDate()
    }
 
    #    
    [void] GetDate () {
        #        .Net
	  # ,   
        $Result = [DateTime]::UtcNow.ToString()
        Write-Host $Result
    }
}


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

تمت إضافة مُنشئ فئة إلى المثال لفهم قيود اللغة ، ولا ينبغي كتابة هذا الرمز بشكل عام.



هذه هي الطريقة التي حققنا بها أننا لم نغرق في Verbose ، أثناء عمل وظيفة باستخدام Void.



قائمة طرق الفصل



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



يمكنك سرد جميع طرق فئة الاهتمام على النحو التالي:



# ,   
$Love = [ClassName]::new()
 
#        .
foreach ($i in $Love | Get-Member -MemberType Method | Select-Object name) {
    [array]$array += $i.Name
}
 
#  ,  .
$Array | ForEach-Object {
    $Love.$_()
}


نرسل طلبات HTTP مع برنامج نصي (نبرر KDPV)



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



أولاً ، نصنع نموذج بيانات ونملأ البيانات في مثيل جديد.



#      
class DataModel {
    $Data
    $TimeStamp
}
 
#  
$i = [DataModel]::new()
 
# 
$i.Data = "My Message in string"
$i.TimeStamp = Get-Date


هذه هي الطريقة التي يبدو بها مثيل الفئة بعد ملء:



PS C:\> $i
 
Data                 TimeStamp
----                 ---------
My Message in string 30.07.2020 5:51:56


ثم يمكن تحويل هذا المثال إلى XML أو JSON أو حتى استعلام SQL. دعنا نتحدث عن JSON:



#   JSON
$Request = $i | ConvertTo-Json


هذا ما يبدو عليه JSON بعد تحويله:



PS C:\> $Request
{
  "Data": "My Message in string",
  "TimeStamp": "2020-07-30T05:51:56.6588729+03:00"
}


ونرسل:



# JSON
Invoke-WebRequest localhost -Body $Request -Method Post -UseBasicParsing


إذا كنت بحاجة إلى إرسال نفس ملف JSON 24/7 ، فيمكنك حفظه كملف وإرساله من الملف. على سبيل المثال ، لنأخذ نفس هذا $ Request.



#     JSON  
$Request | Set-Content C:\Users\User\Desktop\YourRequest.json
 
#     JSON
Invoke-WebRequest localhost -Body (Get-Content C:\Users\User\Desktop\YourRequest.json) -Method Post -UseBasicParsing


نتلقى طلبات HTTP مع برنامج نصي (نبرر KDPV 2)



المؤلف يكره ساعي البريد ، لماذا يحتاج أي شخص ساعي البريد عندما يكون لديه يد و PowerShell؟ (المؤلف متحيز تجاه هذا البرنامج ولا يبرر كراهيته بأي شيء.)

سنقوم ببديلنا باستخدام System.Net.HttpListener ، أي أننا سنبدأ الآن خادم ويب حقيقي من برنامج نصي.



#   
$http = [System.Net.HttpListener]::new()
 
# HTTP .     
$http.Prefixes.Add("http:/localhost/")
$http.Prefixes.Add("http://127.0.0.1/")
 
#  
$http.Start()
 
 
$http.Close()


هذه هي الطريقة التي يبدأ بها الفصل.



تم إنشاء مثيل للفئة وبدأت عمليتها ، يمكننا الاستماع إلى مخرجاتها. يتم تقديم الإخراج كـ System.Net.HttpListener.GetContext. في هذا المثال ، نقبل فقط طلب POST ونحوله.



while ($http.IsListening) {
 
    #GetContext       HttpListener
    $context = $http.GetContext()
 
    #     Request.HttpMethod 
    if ($context.Request.HttpMethod -eq 'POST') {
 
        #    GetContext
        #      
        [System.IO.StreamReader]::new($context.Request.InputStream).ReadToEnd() | ForEach-Object {
            
            #  System.Web.HttpUtility  urlDecore,     
            $DecodedContent = [System.Web.HttpUtility]::UrlDecode($_)
 
            #      
            $ConvertedForm = $DecodedContent | ConvertFrom-Json -ErrorAction SilentlyContinue
 
            #C   
            $ConvertedForm | Format-Table
           
        }
    }
} 


نص جاهز



باستخدام هذا البرنامج النصي ، يمكنك قبول الطلبات:



#   
$http = [System.Net.HttpListener]::new()
 
# HTTP .     
$http.Prefixes.Add("http://localhost/")
$http.Prefixes.Add("http://127.0.0.1/")



#  
$http.Start()
 
if ($http.IsListening) {
    Write-Host " "
}
 
while ($http.IsListening) {
 
    #GetContext       HttpListener
    $context = $http.GetContext()
 
    #     Request.HttpMethod 
    if ($context.Request.HttpMethod -eq 'POST') {
 
        #    GetContext
        #      
        [System.IO.StreamReader]::new($context.Request.InputStream).ReadToEnd() | ForEach-Object {
            
            #  System.Web.HttpUtility  urlDecore,     
            $DecodedContent = [System.Web.HttpUtility]::UrlDecode($_)
 
            #      
            $ConvertedForm = $DecodedContent | ConvertFrom-Json -ErrorAction SilentlyContinue
 
            #C   
            $ConvertedForm | Format-Table
           
        }
 
        #  200 OK   .
        $context.Response.Headers.Add("Content-Type", "text/plain")
        $context.Response.StatusCode = 200
        $ResponseBuffer = [System.Text.Encoding]::UTF8.GetBytes("")
        $context.Response.ContentLength64 = $ResponseBuffer.Length
        $context.Response.OutputStream.Write($ResponseBuffer, 0, $ResponseBuffer.Length)
        $context.Response.Close()
 
    }
    #C   
    $http.Close()
    break
}


سيتم تحويل البيانات تلقائيًا من JSON وإخراجها إلى الجهاز.



يأمل المؤلف في التخلص من Postman ، وكذلك GIT باستخدام واجهة المستخدم الرسومية.






All Articles