很抱歉是这方面的新手,但我想了解一些关于将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服务器来说效率要高得多。
$test1
是System.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调用)对数据中的任何奇数字符进行编码。