首页 > 解决方案 > 如何将 PowerShell 动态变量值传递给 JSON

问题描述

我正在开发一个项目,让基于 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

如果我滥用任何术语或没有遵循任何发布指南,我深表歉意。如果我违反了任何条件,请告诉我,我将做出必要的更改以遵守这些条件。如果我不清楚或错过任何重要信息,我深表歉意。提前感谢您,非常感谢您的帮助。

标签: jsonpowershellvariables

解决方案


您需要反转 JSON 字符串中的引号。单个撇号内的任何内容都不会被解析为包含可计算的内容。或者,作为替代方案,使用 Here-String 如下:

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

PS:获取IP地址应该(可能)更好地通过Powershell方式完成:Get-NetIPAddress (params)| Select IPAddress.


推荐阅读