2014-11-04 75 views
1

对不起,在这个新手,但我想了解一些有关发送PowerShell的结果到PHP页面以供日后处理。发送PowerShell的结果到HTTP

我试过这段代码:

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

的正常工作,PHP接收字符串测试在$ _ POST [ '测试']

但是当试图分析更多的数据,如:

$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空间进行测试,而是使用Exchange DB中的空白字符,但想法相同。

$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服务器来说效率更高。

+0

关于你的更新:只需创建一个具有多个值的散列表。例如:'$ params = @ {val1 = $ value1; VAL2 = $值2}” – Paul 2014-11-11 17:51:22

回答

0

从本质上讲,你的第一个例子可以强制为一个HTTP请求,因为它是一个简单的文本。然而,你的第二个例子产生了一个(猜测是什么?)System.Object对象。然后,PowerShell无法为您执行类型强制转换,因为HTTP有效内容必须是文本内容。如果你要做一些类似于$ test1 [0] .DeviceID.toString()的工作,那很可能会工作 - 对于第一个对象,至少。顺便说一句,.toString()可能不需要 - 它取决于DeviceID属性的“类型”。要确定这一点,请执行$ test1 [0] .DeviceID.GetType()。

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

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

1

这是因为$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网站上的数据进行工作的清洁的解决方案是将数据分割成多个参数,这样可以更方便地访问它们。