Stellen Sie sich vor, Sie schreiben in C #, aber nur in Powershell



Powershell ist eine praktische API, die auf .net basiert. Mit Powershell können Benutzer Skripte schreiben, ohne programmieren zu müssen, und ähnliche Ergebnisse erzielen. Der Autor wird später im Text erklären, was beim KDVP passiert. Jetzt müssen wir dringend so tun, als würden wir in C # programmieren.



TL; DR: Postbote wird nicht benötigt, wenn Powershell verfügbar ist. Aber zuerst müssen Sie aus der Ferne gehen.



Eine einfache Klasse machen



Ich habe gehört, dass coole Programmierer alles durch Klassen und ihre Methoden machen.

Da PowerShell dies zulässt, lässt sich der Autor zeigen, wie Sie 1 + 1 hinzufügen können, während Sie so tun, als würden Sie programmieren.



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


Hier ist unsere ClassName-Klasse und ihre Summenmethode. Eine Instanz einer Klasse kann genauso aufgerufen werden wie in echten Programmiersprachen.



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


Wir erstellen eine neue Instanz der Klasse und rufen die Methode auf, alles ist einfach.



Gibt es eine Leere in Powershell?



Beim Schreiben komplexer Skripte stellte sich dem Autor dieselbe Frage. Wie mache ich eine Funktion, die nichtig ist?



Sie sagen, dass Sie dies tun können:



Get-Date | Out-Null


Jedoch | Out-Null unterdrückt auch alle Verbose, ErrorAction und funktioniert nicht mit Invoke-Command.



Wenn Sie eine Funktion mit [Void] benötigen - erstellen Sie eine neue Klasse, gibt es keinen anderen Ausweg.



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


Es ist unmöglich, eine Methode innerhalb einer Klasse privat zu machen oder eine der Klassenmethoden innerhalb derselben Klasse in PowerShell aufzurufen, daher müssen Sie solche Aufrufe formen.

Der Klassenkonstruktor wurde dem Beispiel hinzugefügt, um die Einschränkungen der Sprache zu verstehen, und ein solcher Code sollte nicht allgemein geschrieben werden.



Auf diese Weise haben wir es geschafft, das Ertrinken von Verbose zu vermeiden, während wir mit Void eine Funktion erstellt haben.



Liste der Klassenmethoden



Angenommen, Sie müssen ein Programm erstellen, vielleicht sogar in einer Sprache, die Sie nicht kennen. Sie wissen, dass es eine Klasse gibt, aber ihre Methoden sind schlecht dokumentiert.



Sie können alle Methoden der interessierenden Klasse wie folgt auflisten:



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


Wir senden HTTP-Anfragen mit einem Skript (wir begründen KDPV)



Mit Klassen können wir Daten darstellen und diese Daten in verschiedene Formate konvertieren. Zum Beispiel müssen wir eine POST-Anfrage an eine Website im JSON-Format senden.



Zuerst erstellen wir ein Datenmodell und füllen die Daten in eine neue Instanz.



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


So sieht die Klasseninstanz nach dem Füllen aus:



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


Dann kann diese Instanz in XML oder JSON oder sogar eine SQL-Abfrage konvertiert werden. Lassen Sie uns auf JSON eingehen:



#   JSON
$Request = $i | ConvertTo-Json


So sieht der JSON nach der Konvertierung aus:



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


Und wir senden:



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


Wenn Sie dieselbe JSON-Datei rund um die Uhr senden müssen, können Sie sie als Datei speichern und aus der Datei senden. Nehmen wir zum Beispiel dieselbe $ 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


Wir erhalten HTTP-Anfragen mit einem Skript (wir begründen KDPV 2)



Der Autor hasst Postman, warum sollte jemand Postman brauchen, wenn er Hände und PowerShell hat? (Der Autor ist voreingenommen gegenüber diesem Programm und seine Abneigung ist ungerechtfertigt.)

Wir werden unsere Alternative mit System.Net.HttpListener durchführen, dh wir werden jetzt einen echten Webserver von einem Skript aus starten.



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


So beginnt der Unterricht.



Eine Instanz der Klasse wurde erstellt und ihr Prozess gestartet. Wir können ihre Ausgabe abhören. Die Ausgabe wird als System.Net.HttpListener.GetContext dargestellt. In diesem Beispiel akzeptieren und konvertieren wir nur eine POST-Anfrage.



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


Bereites Skript



Mit diesem Skript können Sie Anfragen annehmen:



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


Die Daten werden automatisch von JSON konvertiert und an das Terminal ausgegeben.



Der Autor hofft, dass Sie Postman sowie GIT mit einer GUI rauswerfen.






All Articles