Powershell - Where-Clause multiple JSON Array key



我找不到任何解决方案,为什么我的powershell中的where子句没有给我预期的输出。

我有一个 JSON 文件看起来像这样:

[
{
"name": "server1",
"tag": ["App", "Mid-Tier", "User"],
"domain": "domainname",
"alias": ["Alias3"],
"ip": null,
"tcp": 8080,
"active": false,
"apps": ["ARS", "Tomcat"],
"patch": null,
"hotfix": null
},
{
"name": "server2",
"tag": ["Reporting"],
"domain": "domainname",
"alias": ["Alias3"],
"ip": null,
"tcp": 8080,
"active": false,
"apps": ["ARS", "Tomcat"],
"patch": null,
"hotfix": null
},
{
"name": "server3",
"tag": ["DB"],
"domain": "domainname",
"alias": ["Alias1", "Alias2", "Alias3", "Alias4"],
"ip": null,
"tcp": 8080,
"active": true,
"apps": ["SQL"],
"patch": null,
"hotfix": null
},
{
"name": "server5",
"tag": ["Reporting"],
"domain": "domainname",
"alias": ["Alias1"],
"ip": null,
"tcp": 8080,
"active": false,
"apps": ["ARS", "Tomcat"],
"patch": null,
"hotfix": null
}
]

编辑/更新
好的,我必须为您提供更多详细信息,我试图完成/理解:

我有 3 个文件:
- 一个包含上述
数据的 JSON 文件 - 一个存储所有函数和变量
的脚本 - 一个主脚本

这是我的函数的样子:

function opl_GetHostList {
[CmdletBinding()]
param (
[parameter (
mandatory=$false,
HelpMessage = "Enter alias name.")]
[string[]]
$Aliasname,
[parameter (
mandatory=$false,
HelpMessage = "Enter tag name.")]
[string[]]
$Tagname,
[parameter (
mandatory=$false,
HelpMessage = "Enter app name.")]
[string[]]
$Appname,
[parameter (
mandatory=$false,
HelpMessage = "Enter Active State: Either false or true. Default = true")]
[bool]
$Active = $true,
[parameter (
mandatory=$false,
HelpMessage = "Choose selection Object.")]
[string[]]
$Select
)

$WhereArray = @()
# evaluate these with contains comparison
if ($Aliasname) {$WhereArray += '$Aliasname -contains $_.alias'}
#if ($Tagname) {$WhereArray += '$Tagname -contains $_.tag'}
#if ($Appname) {$WhereArray += '$Appname -contains $_.apps'}
# Build the where array into a string by joining each statement with -and
$WhereString = $WhereArray -Join " -and "
# Create the scriptblock with your final string            
$WhereBlock = [scriptblock]::Create($WhereString)
$opl_Hostlist | Where-Object {($WhereBlock.invoke()) -and $Active -eq $_.active} | Select-Object $Select

}

所以现在到了我不明白的部分。
如果我在 main.ps1 中使用以下:

$opl_Hostlist | Where-Object {$_.alias -contains "alias3"} | Select-Object name

输出:

name
----
server1
server2
server3

但是,如果我将它与我的函数一起使用:

opl_GetHostList -Aliasname alias3 -Select name

我得到这个输出:

name
----
server1
server2

那么,当我使用函数调用数据时,为什么没有使用第二种方法获取"server3"呢?

非常感谢任何帮助。

根据您发布的 JSON,您将收到ConvertFrom-Json : Invalid array passed in, extra trailing ','. (1018)错误。这是因为最后一项之后有不需要的逗号。

我建议使用-in而不是-match操作Alias因为属性是一个list。在您的比较中,左操作数是单个元素,右操作数是列表,因此您必须使用-in,否则-contains

if ($Aliasname) {
$Aliasname | ForEach-Object{ $WhereArray += "$_ -in `$_.alias"}
}
$WhereArray -Join '-or'

最新更新