Почему мой обязательный параметр хеш-таблицы не принимает мое значение - PullRequest
2 голосов
/ 24 сентября 2019

У меня есть функция с такими параметрами:

function foo {

    Param(
        [Parameter(Mandatory)]
        [string]$foo,

        [Parameter(Mandatory)]
        [hashtable]$bar
    )

}

, если я так ее называю, все работает нормально:

foo -foo "abc" -bar @{"a"="b"}

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

PS C:\Users\abc> foo
cmdlet foo at command pipeline position 1
Supply values for the following parameters:
foo: "abc"
bar: @{"a"="b"}
Cannot convert the "@{"a"="b"}" value of type "System.String" to type "System.Collections.Hashtable".

, почему PowerShell не принимает указанное мной значение?

Я также пытался написать это по-разному, например @{a=b}, "a"="b", @{a=b;}, @{"a"="b";} и т. Д.

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Когда вы помечаете параметр как Mandatory и не указываете значение (аргумент) для него при вызове, PowerShell автоматически запрашивает у вас значение.

К сожалению, этот механизм автоматического запросадля пропущенных обязательных значений параметров установлено значение нарушено (оно никогда не работало и по-прежнему не работает в PowerShell v7):

  • Вы в настоящее время не может в интерактивном режиме предоставить значение для любого из следующих типов :

    • [hashtable], [scriptblock], [bool], [switch] (последние два являютсянеобычны как обязательные параметры) - их буквальные формы @{ ... }, { ... } и $true / $false просто не распознаются.
    • Также нет способа интерактивно указать $null.
  • Кроме того, автоматические подсказки, когда они работают, неудобны (без завершения табуляции, повторного запроса при неверном вводе),и поэтому в настоящее время малопригодны.

  • Эти проблемыОбсуждаемый в этом выпуске GitHub .


Учитывая вышесказанное, лучше вообще обойти автоматические запросы и вместо этого выдавать ошибку, когда нетбыло предоставлено значение :

function foo {

    Param(
        # Use a default value that throws an error.
        [string] $foo = $(Throw "Please pass a value for -foo."),

        # Use a default value that throws an error.
        [hashtable] $bar = $(Throw "Please pass a value for -bar.")
    )

}

Обратите внимание, что [Parameter(Mandatory)] тогда не должно использоваться, так как это все равно вызовет автоматическое приглашение, несмотря на наличие значения по умолчанию.

0 голосов
/ 24 сентября 2019

Read-Host (который вызывается автоматически, когда это происходит) всегда возвращает строки.Если вы хотите получить такой ввод хеш-таблицы, вам нужно будет обработать его.Я бы сделал что-то вроде:

if ($foo -is [system.Collections.hashtable]) {
  //proceed
} else if ($foo -is [system.array]) {
  Foreach ($fooItem in $foo) {
    $myhash.add($key, $fooItem) 
  }
} else if ($foo -is [system.string]) {
  $fooItem = $foo.split(,)
  ...
} else { 
  //error
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...