假装用C#编写,但只能在Powershell中编写



Powershell是基于.net构建的便捷API。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)


我们创建该类的新实例并调用该方法,一切都很简单。



Powershell中是否有空隙



在编写复杂的脚本时,作者也提出了同样的问题。我该如何做一个虚空函数?



他们说您可以这样做:



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中,不可能将一个方法设为私有,也不能在同一类中调用一个方法,因此您必须对此类调用进行雕刻。

在示例中添加了一个类构造函数,以了解该语言的局限性,一般不应编写此类代码。



这是我们在使用Void制作函数时设法避免淹没Verbose的方法。



类方法列表



假设您需要编写一个程序,甚至可能需要使用您不知道的语言。您知道有一个类,但是它的方法记录很少。



您可以列出感兴趣的类的所有方法,如下所示:



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


我们使用脚本发送HTTP请求(我们证明KDPV合理)



使用类,我们可以表示数据并将其转换为不同的格式。例如,我们需要以JSON格式向网站发送POST请求。



首先,我们创建一个数据模型并将数据填充到新实例中。



#      
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进行替代,也就是说,现在我们将从脚本启动真正的Web服务器。



#   
$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以及带有GUI的GIT。






All Articles