我找不到任何解决方案,为什么我的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'