Shifu高级功能:命令行中间件之HTTP 到 PowerShell 的中间件
# 引入Shifu模块
Import-Module Shifu
# 定义一个简单的HTTP服务器,用于接收从CLI发送的请求
$listener = Start-HttpListener -Uri "http://localhost:8080/"
# 定义PowerShell脚本块,用于处理请求并产生响应
$script = {
param($Request)
# 获取请求体中的数据
$data = $Request.Body
# 执行PowerShell脚本并返回结果
$result = Invoke-Expression $data
# 将结果转换为JSON格式
$resultJson = $result | ConvertTo-Json
# 返回响应
$response = [HttpListenerResponse] $Args[1]
$buffer = [System.Text.Encoding]::UTF8.GetBytes($resultJson)
$response.OutputStream.Write($buffer, 0, $buffer.Length)
$response.Close()
}
# 创建一个PowerShell运行空间,并注册定义好的脚本块
$runspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
$runspace.ApartmentState = "MTA"
$runspace.ThreadOptions = "ReuseThread"
$runspace.Open()
$psCmd = [System.Management.Automation.PowerShell]::Create()
$psCmd.Runspace = $runspace
$null = $psCmd.AddScript($script)
# 启动无限循环来处理进入的HTTP请求
while ($listener.IsListening) {
$context = $listener.GetContext()
$psCmd.Invoke($context)
}
# 清理资源
$psCmd.Dispose()
$runspace.Dispose()
$listener.Stop()
这段代码首先定义了一个HTTP服务器,然后定义了一个PowerShell脚本块,用于接收请求数据,执行PowerShell命令,并返回JSON格式的响应。通过创建一个多线程单元(MTA)和重用线程的选项,脚本块在接收到的每个请求上都在单个PowerShell运行空间中执行,以提高性能。最后,代码进入一个无限循环来处理进入的HTTP请求,并在请求处理完毕后清理资源。
评论已关闭