使用PowerShell将Windows环境变量添加到JSON对象

时间:2018-08-07 15:23:05

标签: json powershell

我对Powershell还是很陌生,只需要一个小任务就可以使用它,所以请原谅我完全不适合该语言。我想知道是否有可能基于环境变量和早先在脚本中声明的变量来形成json对象。已经声明的变量基于名为optionsConfig.json的json配置,并且该文件的内容在此处。

{"test1": ["options_size", "options_connection", "options_object"],
 "test2":["options_customArgs", "options_noUDP", "options_noName"]}

下面的代码中$Options变量的目的是获取相应测试的列表值中的每个元素,并假定这些元素是系统中的环境变量,然后查找它们的值并形成字典将在json中使用的对象。

这是我到目前为止所拥有的。

# Read the JSON file into a custom object.
$configObj = Get-Content -Raw optionsConfig.json | 
ConvertFrom-Json

# Retrieve the environment variables whose
# names are listed in the $env:test property
# as name-value pairs.
Get-Item -Path env:* -Include $configObj.$env:testTool

$Options = Get-Item -Path env:* -Include $configObj.$env:testTool |
  % {$hash = @{}} {$hash[$_.Name]=$_.Value} {$hash}

$Options变量在转换为json时看起来像这样

{
    "options_size":  "default",
    "options_object":  "forward open",
    "options_connection":  "connected"
}

我还有其他一些环境变量值,我想成为json对象的一部分。下面列出了我想要的其他3个环境变量。

$Env.testTool  = "test1"
$Env.RecordName = "Record1"
$Env.Target = "Target1"

我将如何构造powershell语句来获取要格式化的json对象? -

 data = {"test": $Env.testTool, "target": "$Env.Target",
        "options": "$Options", "RecordName': "$Env.RecordName"}

键都是预定义的字符串,而$ Options是上方的dict对象。我可以在Powershell中形成这样的Json对象吗?任何帮助,将不胜感激。这似乎是我与powershell斗争的最后一步。

这就是我所做的。

$jObj = [ordered]@{test= $Env:testTool}

当我将此变量更改为$jObj = [ordered]@{test= $Env:testTool,options= $Options}时,我收到一条错误消息,提示missing expression after ','

2 个答案:

答案 0 :(得分:1)

  

当我将此变量更改为$jObj = [ordered]@{test= $Env:testTool,options= $Options}时,我收到一条错误消息,提示missing expression after ','

哈希表文字的条目@{ ... },或以[ordered] @{ ... }的有序形式)必须分开

  • 通过换行符(每个条目均在其行中)

  • ;如果放在同一行,则按;

因此,以下文字是等效的:

# Multiline form
@{
  test= $env:testTool
  RecordName= $env:RecordName
  Target= $env.Target
  options=$Options
}

# Single-line form; separator is ";"
@{ test= $env:testTool; RecordName= $env:RecordName; Target= $env.Target; options=$Options }

Get-Help about_Hashtables有更多信息。

答案 1 :(得分:0)

$jObj = @{test= $env:testTool
 RecordName= $env:RecordName
 Target= $env.Target
 options=$Options}

$jObj | ConvertTo-Json | Set-Content jsonStuff.json

JsonStuff.json是新json对象的新json文件。形成$jObj的语法似乎可以解决问题。