Подтвердить что ты не робот

Invoke-Command error "Набор параметров не может быть решен с использованием указанных именованных параметров"

Надеюсь, вы можете помочь мне с проблемой, связанной с попыткой выполнить блок script с альтернативными учетными данными на локальном компьютере. Я тщательно искал на форумах и делал некоторые поисковые запросы и нашел два возможных подхода к решению моей проблемы:

  • Использовать Invoke-Command
  • Использовать Start-Job

Использование подхода # 1 У меня был этот код:

$res = Invoke-Command -Credential $migratorCreds -ScriptBlock {param($one, $two) Get-LocalUsers -parentNodeXML $one -migratorUser $two } -ArgumentList $xmlPRE,$migratorCreds

где Get-LocalUsers - это настраиваемая функция, хранящаяся в настраиваемом модуле (*.psm1).

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

Набор параметров не может быть разрешен с использованием указанных именованных параметров

Итак, очевидно, что мне что-то не хватает, не могли бы вы помочь мне в этой теме?

Спасибо заранее...

4b9b3361

Ответ 1

У вас есть ошибка, потому что -credential без -computername не может существовать.

Вы можете попробовать следующим образом:

Invoke-Command -Credential $migratorCreds  -ScriptBlock ${function:Get-LocalUsers} -ArgumentList $xmlPRE,$migratorCreds -computername YOURCOMPUTERNAME

Ответ 2

Принятый ответ является правильным в отношении командлета Invoke-Command, но в более широком смысле командлеты могут иметь наборы параметров, в которых определены группы входных параметров, так что вы не можете использовать два параметра, которые не являются членами одного и того же набора параметров.

Если вы столкнулись с этой ошибкой с помощью любого другого командлета, посмотрите документацию Microsoft и посмотрите, есть ли в верхней части страницы различные наборы параметров. Например, документация для Set-AzureDeployment определяет три набора в верхней части страницы.

Ответ 3

Довольно новый для использования PowerShell, думаю, что я могу помочь. Не могли бы вы попробовать это?

Я считаю, что вы не получите правильные параметры для своего блока script:

param([string]$one, [string]$two)
$res = Invoke-Command -Credential $migratorCreds -ScriptBlock {Get-LocalUsers -parentNodeXML $args[0] -migratorUser $args[1] } -ArgumentList $xmlPRE, $migratorCreds

Ответ 4

Недавно я решал ту же проблему. Я разрабатывал командлет записи для моего модуля Subtitle. У меня было шесть разных пользовательских историй:

  • Только субтитры
  • Подзаголовок и путь (используется оригинальное имя файла)
  • Подзаголовок и новое имя файла (используется оригинальный путь)
  • Используется подзаголовок и суффикс имени (используется исходный путь и измененное имя).
  • Используется субтиль, новый путь и новое имя файла.
  • Используются субтитры, новый путь и суффикс.

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

После некоторых исследований документации я понял, в чем проблема. Зная, как следует использовать наборы параметров, я разработал простой общий подход к решению этой проблемы. Требуется карандаш и лист бумаги, лучше редактор электронных таблиц.

  1. Запишите все возможные способы использования командлета => пользовательские истории.
  2. Продолжайте добавлять параметры со значимыми именами и отмечайте использование параметров, пока у вас не будет уникального набора наборов => нет повторяющейся комбинации параметров.
  3. Реализуйте наборы параметров в своем коде.
  4. Подготовьте тесты для всех возможных пользовательских историй.
  5. Запустите тесты (большой сюрприз, верно?). IDE не проверяет коллизию наборов параметров, тесты могут сэкономить много хлопот после одной.

Пример:

Unique parameter binding resolution approach.

Практический пример можно увидеть здесь over here.

Кстати: уникальность параметров в наборах параметров является причиной, по которой свойство ParameterSetName не поддерживает [String[]]. Это не имеет никакого смысла.