Powershell - несколько ключей JSON Array для Where-Clause - PullRequest
0 голосов
/ 29 сентября 2018

Я не могу найти никакого решения, почему мое предложение where в моем powershell не дает ожидаемого результата.

У меня есть файл 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" с моимВторой метод, когда я вызываю данные с помощью моей функции?

Очень благодарен за любую помощь.

1 Ответ

0 голосов
/ 29 сентября 2018

Согласно 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...