PowerShell создает хэш-таблицу, если она не существует, и добавляет значения

#powershell

#powershell

Вопрос:

В настоящее время я беру созданную вручную хэш-таблицу, чтобы я мог перебирать

 $aceList = @{
    "Domainjdoe" = "Change, Submit, GetPassword"
    "Domainssmith" = "Change, Submit, GetPassword"
    "Domainmsmith" = "Submit"
}
  

Однако это не позволяет мне абстрагироваться от нее больше.

В идеале я хотел бы что-то вроде этого без необходимости устанавливать $acl = @{} внешнюю часть функции?

 function Set-HashTable {
    Param(
        [String]$Identity,
        [String]$Access,
        [Hashtable]$ACL
    )
    $ACL.Add($Identity, $Access)
    return $ACL
}

$acl = @{}
$acl = Set-ACL -Identity "Domainjdoe" -Access "Change, Submit, GetPassword" -ACL $acl
$acl = Set-ACL -Identity "Domainssmith" -Access "Change, Submit, GetPassword" -ACL $acl
$acl = Set-ACL -Identity "Domainmsmith" -Access "Submit" -ACL $acl
  

Комментарии:

1. вы пробовали добавить функциональный тест, чтобы проверить, существует ли уже хеш-таблица? [ усмешка ]

2. Я. Я только что сделал это, все, что мне нужно сделать, это убедиться, что я очистил хеш-таблицу позже, чтобы избежать ее перегрузки.

3. похоже, вы просто меняете «сделать его 1-м» на «очистить его последним». [ усмешка ] я подозреваю, что у меня были бы New-AclTable и Add-ToAclTalbe … или просто сделайте это без какой-либо функции вообще.

4. [Hashtable]$ACL -> [Hashtable]$ACL = @{}

5. Кстати, я полагаю Set-ACL , что в вашем фрагменте кода это действительно должно быть Set-HashTable ? Потому что вы не должны переопределять встроенные командлеты.

Ответ №1:

Присвойте параметру $ACL значение по умолчанию, и вы сможете избежать передачи начальной пустой хеш-таблицы:

 function Set-HashTable {
    Param(
        [String]$Identity,
        [String]$Access,
        [Hashtable]$ACL = @{}
    )
    $ACL.Add($Identity, $Access)
    return $ACL
}

$acl = Set-HashTable -Identity 'Domainjdoe' -Access 'Change, Submit, GetPassword'
$acl = Set-HashTable -Identity 'Domainssmith' -Access 'Change, Submit, GetPassword' -ACL $acl
$acl = Set-HashTable -Identity 'Domainmsmith' -Access 'Submit' -ACL $acl
  

С учетом сказанного я не вижу преимущества инкапсуляции такой операции, как добавление пар ключ / значение в хеш-таблицу в функции. Сделать это напрямую гораздо проще, например:

 $acl = @{}
$acl.Add('Domainjdoe', 'Change, Submit, GetPassword')
$acl.Add('Domainssmith', 'Change, Submit, GetPassword')
$acl.Add('Domainmsmith', 'Submit')
  

или вот так:

 $acl = @{}
$acl['Domainjdoe']   = 'Change, Submit, GetPassword'
$acl['Domainssmith'] = 'Change, Submit, GetPassword'
$acl['Domainmsmith'] = 'Submit'