将powershell结果发送到HTTP


Send powershell results to HTTP

很抱歉是这方面的新手,但我想了解一些关于将powershell结果发送到PHP页面以供稍后处理的知识。

我试过这个代码:

$test1 = "test"
$postParams = @{test=$test1}
Invoke-WebRequest -Uri http://bu01/stats/input.php -Method POST -Body $postParams

运行良好,PHP在$_POST['test']中接收字符串测试

但当试图解析更多数据时,比如:

$test1 = Get-WMIobject win32_logicaldisk | select-object DeviceID,FreeSpace,Size
$postParams = @{test=$test1}
Invoke-WebRequest -Uri http://bu01/stats/input.php -Method POST -Body $postParams

我得到的所有结果都是"System.Object[]"。

请解释如何将其发送到PHP。

谢谢!

更新:谢谢你的建议。我用foreach制作了以下脚本,将每个"行"发布在一个单独的web请求中。目前效果良好。不再使用hdd空间进行测试,而是使用ExchangeDB中的空白进行测试,但想法是一样的。

$dbs = Get-MailboxDatabase -Status | select-object Name, DatabaseSize, AvailableNewMailboxSpace 
foreach ($a in $dbs){
  $data = $a.Name+','+$a.DatabaseSize.ToKB()+','+$a.AvailableNewMailboxSpace.ToKB()
  $postParams = @{data=$data}
  Invoke-WebRequest -Uri http://bu01/stats/input.php -Method POST -Body $postParams
}

也许有人有一个很好的技巧可以把它转化为一个请求?这对于web服务器来说效率要高得多。

这是因为$test1System.Object数组,而不是字符串数据。一个快速而肮脏的解决方案是:
$test1 = Get-WMIobject win32_logicaldisk | select-object DeviceID,FreeSpace,Size
$postParams = @{test=($test1 | out-string)}
Invoke-WebRequest -Uri http://bu01/stats/input.php -Method POST -Body $postParams

如果你想在php网站上处理数据,更干净的解决方案是将数据拆分为多个参数,这样你就可以更容易地访问它们。

本质上,您的第一个示例可以被强制为HTTP请求,因为它只是一个简单的文本。然而,您的第二个例子产生了一个(你猜怎么着?)System.Object对象。PowerShell无法为您执行类型强制,因为HTTP负载需要是文本内容。如果您要执行类似$test1[0].DeviceID.toString()的操作,那么这很可能会奏效——至少对第一个对象有效。顺便说一句,可能不需要.toString()-它取决于DeviceID属性的"类型"。要确定这一点,请执行$test1[0].DeviceID.GetType().

如果需要处理WMI调用返回的每个实例,则需要使用Foreach Object{},分别发布每个实例。或者。。。使用Foreach对象{}连接相关信息,并将其作为一个适当分隔的文本字符串发布。

您可能还需要使用UrlEncode(.NET调用)对数据中的任何奇数字符进行编码。