我被困在如何动态地从json文件中获取键值对的含义,而无需事先知道键值。
我有这个样本json文件,在实际的应用程序中,我有大约20个json文件以及数千个自动测试用例:
{
"runOnMachines": "SERVER-01",
"cases": [
{
"testName": "Google Chrome Install 84.0.4147.89",
"testDescription": "Verifies Google Chrome is Installed 84.0.4147.89",
"testFunction": "Find-ProgramVersion",
"args": [
{
"programName" : "Firefox",
"version" : "79.0"
}
],
"expectedResult": "true"
},
{
"testName": "Tera Term 4.105",
"testDescription": "Tera Term 4.105",
"testFunction": "Find-ProgramVersion",
"args": [
{
"programName" : "Tera Term",
"version" : "4.105"
}
],
"expectedResult": "true"
}
]
}
Find-ProgramVersion是一个辅助函数,用于搜索控制面板中安装的程序/通过注册表安装的程序,它返回true或false。(有关这方面的更多信息,Winster是我用来测试服务器上虚拟机的自动化框架的一部分。
长话短说,我有这个丑陋的代码,我想清理,但我找不到如何从json文件动态提取我的args的方法。到目前为止,我在Winster模块上编写的每个函数都必须使用此脚本,并使用正确的json属性手动添加。
if($jsonData[$i].testFunction -eq "Find-ProgramVersion")
{
$command = $jsonData[$i].testFunction + " " + $jsonData[$i].args.programName + " " +
$jsonData[$i].args.version
}
if($jsonData[$i].testFunction -eq "Find-ProgramVersionGrep")
{
$command = $jsonData[$i].testFunction + " " + $jsonData[$i].args.programName + " " +
$jsonData[$i].args.version
}
我尝试过转换jsonData[$i].args
为数组,也尝试过使用PsObject.Properties中的Name和Value,但这也提供了我不需要从PsObject继承的其他值
for($i=0; $i -lt $jsonData.Count; $i++)
{
$jsonData[$i].args.PSObject.Properties | ForEach-Object {
$_.Name
$_.Value
}
}
给我:
Count
1
Length
1
LongLength
1
Rank
1
SyncRoot
programName version
----------- -------
Firefox 79.0
IsReadOnly
False
IsFixedSize
True
IsSynchronized
False
Count
1
Length
1
LongLength
1
Rank
1
SyncRoot
Tera Term 4.105
IsReadOnly
False
IsFixedSize
True
IsSynchronized
False
我希望从jsonData [$ i] .args中得到的结果是某种可迭代的,可以在其中使用forloop,但是我无法使下面的PsObject可用。而且,由于某些函数具有不同数量的arg,因此无需事先知道args的名称。
@{programName=Firefox; version=79.0} @{programName=Tera Term; version=4.105}
(@'
{
"runOnMachines": "SERVER-01",
"cases": [
{
"testName": "Google Chrome Install 84.0.4147.89",
"testDescription": "Verifies Google Chrome is Installed 84.0.4147.89",
"testFunction": "Find-ProgramVersion",
"args": [
{
"programName" : "Firefox",
"version" : "79.0"
}
],
"expectedResult": "true"
},
{
"testName": "Tera Term 4.105",
"testDescription": "Tera Term 4.105",
"testFunction": "Find-ProgramVersion",
"args": [
{
"programName" : "Tera Term",
"version" : "4.105"
}
],
"expectedResult": "true"
}
]
}
'@ | ConvertFrom-Json).cases | ForEach-Object {
$_.testFunction + ' ' + (
$_.args.ForEach( {
$_.PSObject.Properties.Value.ForEach( {
if ($_.contains(' ')) {
# contains spaces -> double-quote
'"{0}"' -f $_
}
else {
$_
}
})
})
) -join ' '
}
以上返回以下内容:
Find-ProgramVersion Firefox 79.0
Find-ProgramVersion "Tera Term" 4.105
如果嵌入的 "
char有值,则需要做更多的工作。
$_.args.ForEach
遍历args
数组的所有元素。
$_.PSObject.Properties.Value.ForEach
遍历每个元素的所有属性值。
$_.contains(' ')
测试每个属性值是否存在至少一个空格字符,在这种情况下,该值用'"{0}"' -f $_
正在构造的整个命令行中的双引号()括起来(通过使用带有空格的值构成的字符串-join ' '
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句