
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。
