我正在一个项目上,让基于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"
}'
我尝试了以下网站中提到的建议:
How to make a POST request using Powershell if body have a parameter @type
https://hazzy.techanarchy.net/winadmin/windows/windows-powershell-elk-log-wash/
我尝试了双引号和单引号的组合,并使用@ {},@'{,并附加到参数即“ param + =”或“ param = +”。运气不好的方法,或者我可能错过了一些东西。
我能够从转换为JSON计数器部分的单个命令中获取详细信息,即
Get-WmiObject -Class Win32_ComputerSystem -Property Name | ConvertTo-Json
但是我很难将两个不同的信息合并到一个json文件中。另外,我在提取特定信息并填充json文件(即
)时遇到了困难。(Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name | ConvertTo-Json
如果我滥用任何术语或未遵循任何发布准则,我深表歉意。如果我违反了任何条件,请告知我,我将进行必要的更改以遵守这些条件。如果我不清楚或错过任何重要信息,我深表歉意。在此先感谢您,我们将不胜感激。
答案 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