如何将PowerShell动态变量值传递给JSON

时间:2018-07-26 00:42:34

标签: json powershell variables

我正在一个项目上,让基于Windows的计算机运行计划的Powershell脚本,该脚本将以JSON结构化数据文件的形式发布主机状态。目的是使相同的脚本能够在任何Windows计算机上运行,​​而不必手动为脚本所放置的每台服务器键入变量值,例如主机名,IP地址等。

$hn = hostname
$ip = ipconfig
echo $hn
echo $ip
$params = '{
"host": "$(hn)",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
“ip": "$(ip)"
}'

Invoke-WebRequest -Uri http://yoursite.com:5550/ -Method POST -ContentType "application/json" -Body $params
#Invoke-RestMethod -Uri http://yoursite.com:5550/ -Method POST -ContentType "application/json" -Body $params

最后我得到以下输出的变化(注意主机名和ip变量保持不变):

HOSTNAME1
1.1.1.1
'{
"host": "$(hn)",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
“ip": "$(ip)"
}'

我希望输出看起来像这样:

HOSTNAME1
1.1.1.1
'{
"host": "HOSTNAME1",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
“ip": "1.1.1.1"
}'

我尝试了以下网站中提到的建议:

我尝试了双引号和单引号的组合,并使用@ {},@'{,并附加到参数即“ param + =”或“ param = +”。运气不好的方法,或者我可能错过了一些东西。

我能够从转换为JSON计数器部分的单个命令中获取详细信息,即

Get-WmiObject -Class Win32_ComputerSystem -Property Name | ConvertTo-Json

但是我很难将两个不同的信息合并到一个json文件中。另外,我在提取特定信息并填充json文件(即

)时遇到了困难。
(Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name | ConvertTo-Json

如果我滥用任何术语或未遵循任何发布准则,我深表歉意。如果我违反了任何条件,请告知我,我将进行必要的更改以遵守这些条件。如果我不清楚或错过任何重要信息,我深表歉意。在此先感谢您,我们将不胜感激。

2 个答案:

答案 0 :(得分:2)

您需要在JSON字符串中反引号。单撇号内的任何内容都不会被解析为包括可计算的内容。或者,可以使用如下所示的Here-String:

$params = @"
{
"host": "$hn",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
"ip": "$ip"
}
"@

PS :(可能)最好通过Powershell方法Get-NetIPAddress (params)| Select IPAddress来获取IP地址。

答案 1 :(得分:1)

您可以尝试一下。

  $params = '{
    "host": "'+$hn+'",
    "service": "APP_NAME",
    "annotation": "Service is looking dope!",
    “ip": "'+$ip+'"
    }'

这仅表明,由于您使用单引号,因此整个字符串会拆分为多个部分并串联(+)变量。另外,您可以在这里阅读: MSDN About Quoting Rules