Powershell - объединяет операторы switch и loop - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть фрагмент кода, представленный ниже, он принимает значения из файла json. Это массив строк -> $Json.Names. Я хотел бы избежать повторяющихся строк, таких как -> $Json.Names[0].Name {$Json.Names[0].Name; break}. Во втором случае массив Array $Json.Names может иметь разную длину, массив может содержать 6 и более или менее элементов. Я хочу сделать это заявление о переключении более эластичным. Я пытался использовать for loop и while loop, но в этом случае эти циклы мне не помогают. Есть ли какой-нибудь умный способ сделать этот код более сложным / эластичным и избежать дублирования упомянутых строк кода $Json.Names[0].Name {$Json.Names[0].Name; break}

$Json = Get-Content "$path" | out-string | ConvertFrom-Json
$Name = switch ($Member) {
    $Json.Names[0].Name  {$Json.Names[0].Name; break}
    $Json.Names[1].Name  {$Json.Names[1].Name; break}
    $Json.Names[2].Name  {$Json.Names[2].Name; break}
    $Json.Names[3].Name  {$Json.Names[3].Name; break}
    $Json.Names[4].Name  {$Json.Names[4].Name; break}
    $Json.Names[5].Name  {$Json.Names[5].Name; break}
    $Json.Names[6].Name  {$Json.Names[6].Name; break}
    default {"Unknown Name"}
}

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Предполагая эту структуру:

$json = [pscustomobject]@{names = [pscustomobject]@{name ='joe'},
  [pscustomobject]@{name ='john'},
  [pscustomobject]@{name ='james'}}

Предполагая, что $ member - это одно имя, вы можете сказать, что

$name = $json.names.name -eq $member # an array of one

$ name будет нулевым массивом, если совпадений нет.

if (! $name) { $name = 'Unknown Name' }

Или на языке предварительного просмотра 5 Powershell 7:

$name ??= 'Unknown Name'

Вы также можете создать хэш-таблицу имен.

1 голос
/ 06 ноября 2019

Вы можете воспользоваться перечислением свойств и значительно упростить свой код:

# define our default
$Name = "Unknown Name"

# define the list of names 
$Json = Get-Content "$path" | ConvertFrom-Json
$Names = $Json.Names.Name

# update $Name if applicable
if($Names -contains $member){
    $Name = $member
}
...