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

7

我正在开展一个项目,让基于Windows的机器运行定时的powershell脚本,将主机状态作为JSON结构化数据文件进行POST。目标是使相同的脚本能够在任何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

如果我使用了不正确的术语或没有遵循任何帖子指南,我深表歉意。如果我违反了任何条件,请告诉我,我将进行必要的更改以遵守它们。如果我没有清楚地表达或错过了任何重要信息,请原谅。提前感谢您的帮助,非常感激。


要在PowerShell中获得字符串扩展(插值),请使用"..."字符串 - 相比之下,'...'字符串被视为_字面量_。要在"..."中嵌入",请使用\"`。 - mklement0
2个回答

9
你可以尝试一下这个。
  $params = '{
    "host": "'+$hn+'",
    "service": "APP_NAME",
    "annotation": "Service is looking dope!",
    “ip": "'+$ip+'"
    }'

这只是将整个字符串分割成部分并连接(+)变量,因为你使用的是单引号。此外,您可以在此处阅读更多信息: MSDN关于引用规则

你的脚本也起作用了!很遗憾我不能将你们两个的答案都标记为解决方案。谢谢大家。 - unitelife
1
别担心,伙计,有很多种方法可以解决这个问题的 ;) - CodeNagi

8

您需要在JSON字符串中反转引号。任何单引号内的内容都不会被解析为可计算的内容。或者,作为替代方案,可以使用类似于这样的Here-String:

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

PS: 获取IP地址的更好方式可能是使用Powershell:Get-NetIPAddress (params)| Select IPAddress


你的脚本运行成功了!但是,你怎么让 Get-NetIPAddress (params)| Select IPAddress 变量工作呢?当我使用 PowerShell 方法获取主机名时,我也遇到了类似的问题。谢谢。 - unitelife
请阅读Get-Help Get-NetIPAddress,并将(params)替换为适当的参数集合。 - Vesper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接