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

uni*_*ife 6 variables 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
Run Code Online (Sandbox Code Playgroud)

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

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

我希望输出如下所示:

HOSTNAME1
1.1.1.1
'{
"host": "HOSTNAME1",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
“ip": "1.1.1.1"
}'
Run Code Online (Sandbox Code Playgroud)

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

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

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

Get-WmiObject -Class Win32_ComputerSystem -Property Name | ConvertTo-Json
Run Code Online (Sandbox Code Playgroud)

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

(Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name | ConvertTo-Json
Run Code Online (Sandbox Code Playgroud)

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

Ves*_*per 6

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

$params = @"
{
"host": "$hn",
"service": "APP_NAME",
"annotation": "Service is looking dope!",
"ip": "$ip"
}
"@
Run Code Online (Sandbox Code Playgroud)

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


小智 5

你可以试试这个。

  $params = '{
    "host": "'+$hn+'",
    "service": "APP_NAME",
    "annotation": "Service is looking dope!",
    “ip": "'+$ip+'"
    }'
Run Code Online (Sandbox Code Playgroud)

这只是表明整个字符串拆分为多个部分并连接( +) 变量,因为您使用的是单引号。此外,您可以在这里阅读: MSDN About Quoting Rules