【问题标题】:How to Pass A PowerShell Dynamic Variable Value to JSON如何将 PowerShell 动态变量值传递给 JSON
【发布时间】:2018-07-26 17:51:50
【问题描述】:

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

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

【问题讨论】:

  • 要在 PowerShell 中获取字符串扩展(插值),请使用 "..." 字符串 - 相比之下,'...' 字符串被视为 文字。要将" 嵌入"...",请使用`"

标签: json powershell variables


【解决方案1】:

您需要反转 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) 替换为适当的参数集合。
【解决方案2】:

你可以试试这个。

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

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

【讨论】:

  • 您的脚本也有效!不幸的是,我不能将您的两个答案都标记为解决方案。谢谢大家。
  • 别担心,给猫剥皮的方法还有很多;)
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 2012-11-07
相关资源
最近更新 更多