请原谅这个看似简单的问题,因为我对powershell知之甚少,只需要完成一个很小的任务即可。
我有一个名为optionsConfig.json的json配置文件。键是可能的环境变量,如果脚本运行时该键存在,则与该键关联的列表元素也将被视为环境变量。 问题在于列表中的一个或多个元素可能不存在,因此该值将为空(其逻辑在下面)。我认为if / else语句可以捕获该错误并将其从列表中删除,但是我不确定如何执行此操作。有人可以帮忙吗?
这是optionsConfig.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:test
$Options = Get-Item -Path env:* -Include $configObj.$env:test |
% {$hash = @{}} {$hash[$_.Name]=$_.Value} {$hash}
$jObj = @{test= $env:test
RECORD= $env:Record
HASH= $Env:hash
target= $env:Target
options=$Options
}
$jObj | ConvertTo-Json | Set-Content "C:\Test\jsonStuff.json"
我在新json文件jsonStuff.json
中的最终Json对象看起来像这样
{
"options_size": "default",
"options_object": "obj1",
"options_connection": "connected"
}
不幸的是,如果其中一个环境变量不存在,则可能看起来像这样。
{
"options_size": "default",
"options_object": null,
"options_connection": "connected"
}
是否有任何方法可以根据值是否为null从此新形成的Json对象中删除它们的密钥,甚至不将其添加到json对象中?感谢您对我不了解的Powershell知识的了解
[EDIT]谢谢大家的帮助。但是,更新的代码不起作用。我不确定原因是什么。代码
# Read the JSON file into a custom object.
$configObj = Get-Content -Raw C:\TestWare\security_test\optionsConfig.json | ConvertFrom-Json
# Retrieve the environment variables whose
# names are listed in the $env:tool property
# as name-value pairs.
Get-Item -Path env:* -Include $configObj.$env:test
$Options = Get-Item -Path env:* -Include $configObj.$env:test |
% {$hash = @{}} {$hash[$_.Name]=$_.Value} {$hash}
$Options | ForEach-Object {
$NonEmptyProperties = $_.psobject.Properties | Where-Object {$null -ne $_.Value} | Select-Object -ExpandProperty Name
$_ | Select-Object -Property $NonEmptyProperties | ConvertTo-Json -Compress
}
$jObj = @{test= $env:test
Record= $env:Record
HASH= $Env:hash
target= $env:Target
options=$Options
}
$jObj | ConvertTo-Json | Set-Content "C:\Test\jsonStuff.json"
将按预期运行,并在json文件位于其自己的powershell文件中时进行填充。当在powershell窗口中运行时,它还会产生此额外的输出,
{"IsReadOnly":false,"IsFixedSize":false,"IsSynchronized":false,"Keys":
["options_size","options_object","options_connection"],"Values":["default","obj1","connnected"],"SyncRoot":{},"Count":4}
我将相同的代码放在另一个稍大的powershell文件中,该文件完成了我认为不会影响该代码的其他一些事情,并且代码显示options = System.Collections.Hashtable
。我知道这几乎意味着那里有某种dict或map,但是我不确定为什么它会在一个文件而不是另一个文件中正确生成一个json obj。我没有在ForEach-Object循环中正确指定我的值吗?