Berpura-pura menulis dalam C #, tetapi hanya di Powershell



Powershell adalah API praktis yang dibangun di atas .net. Powershell memungkinkan pengguna untuk menulis skrip tanpa perlu pemrograman sambil mendapatkan hasil yang serupa. Apa yang terjadi di KDVP, penulis akan menjelaskannya nanti di teks. Sekarang kita perlu berpura-pura bahwa kita sedang memprogram dalam C #.



TL; DR: Tukang pos tidak diperlukan jika Powershell tersedia. Tapi pertama-tama Anda harus pergi dari jauh.



Membuat kelas sederhana



Saya mendengar bahwa programmer keren melakukan semuanya melalui kelas dan metode mereka.

Karena PowerShell mengizinkannya, biarkan penulis menunjukkan kepada Anda bagaimana Anda dapat menambahkan 1 + 1 sambil berpura-pura memprogram.



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


Berikut adalah kelas ClassName kami dan metode Sum-nya. Sebuah instance dari kelas dapat dipanggil dengan cara yang persis sama seperti dalam bahasa pemrograman yang sebenarnya.



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


Kami membuat instance baru dari kelas dan memanggil metode ini, semuanya sederhana.



Apakah ada Void di Powershell



Saat menulis skrip yang kompleks, pertanyaan yang sama muncul dari penulis. Bagaimana cara membuat fungsi yang akan menjadi Void?



Mereka bilang Anda bisa melakukan ini:



Get-Date | Out-Null


Namun, | Out-Null juga menekan semua Verbose, ErrorAction dan tidak bekerja dengan Invoke-Command.



Jika Anda membutuhkan fungsi dengan [Void] - buat kelas baru, tidak ada jalan keluar lain.



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


Tidak mungkin membuat metode menjadi privat di dalam satu kelas, atau memanggil salah satu metode kelas di dalam kelas yang sama di PowerShell, jadi Anda harus memahat panggilan tersebut.

Sebuah konstruktor kelas telah ditambahkan ke contoh untuk memahami keterbatasan bahasa, dan kode seperti itu tidak boleh ditulis secara umum.



Inilah cara kami menghindari tenggelamnya Verbose, saat membuat fungsi dengan Void.



Daftar metode kelas



Katakanlah Anda perlu membuat program, bahkan mungkin dalam bahasa yang tidak Anda pahami. Anda tahu ada sebuah kelas, tetapi metodenya didokumentasikan dengan buruk.



Anda dapat membuat daftar semua metode kelas minat sebagai berikut:



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


Kami mengirim permintaan HTTP dengan skrip (kami membenarkan KDPV)



Dengan kelas, kita dapat merepresentasikan data dan mengubah data ini ke dalam format yang berbeda. Misalnya, kita perlu mengirim permintaan POST ke situs web dalam format JSON.



Pertama, kami membuat model data dan mengisi data tersebut ke dalam instance baru.



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


Seperti inilah tampilan instance kelas setelah diisi:



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


Kemudian instance ini dapat dikonversi ke XML atau JSON atau bahkan kueri SQL. Mari kita bahas JSON:



#   JSON
$Request = $i | ConvertTo-Json


Inilah tampilan JSON setelah mengubahnya:



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


Dan kami mengirim:



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


Jika Anda perlu mengirim file JSON yang sama 24/7, Anda dapat menyimpannya sebagai file dan mengirimkannya dari file. Sebagai contoh, mari kita ambil $ Request yang sama.



#     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


Kami menerima permintaan HTTP dengan skrip (kami membenarkan KDPV 2)



Penulis membenci Postman, mengapa ada orang yang membutuhkan Postman ketika mereka memiliki tangan dan PowerShell? (Penulis bias terhadap program ini dan ketidaksukaannya tidak dibenarkan oleh apapun.)

Kami akan melakukan alternatif kami menggunakan System.Net.HttpListener, yaitu, kami sekarang akan memulai server web nyata dari sebuah skrip.



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


Beginilah kelas dimulai.



Sebuah instance dari kelas telah dibuat dan prosesnya dimulai, kita dapat mendengarkan keluarannya. Outputnya disajikan sebagai System.Net.HttpListener.GetContext. Dalam contoh ini, kami hanya menerima dan mengonversi permintaan 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
           
        }
    }
} 


Skrip siap



Dengan skrip ini, Anda dapat menerima permintaan:



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


Data akan secara otomatis diubah dari JSON dan dikeluarkan ke terminal.



Penulis berharap Anda membuang Postman, serta GIT dengan GUI.






All Articles