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).
Моя проблема в том, что каждый раз, когда я запускаю этот код, я получаю следующую ошибку:
Набор параметров не может быть разрешен с использованием указанных именованных параметров
Итак, очевидно, что мне что-то не хватает, не могли бы вы помочь мне в этой теме?
Спасибо заранее...
Ответы
Ответ 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 параметра будет достаточно. Как и в большинстве случаев, разочарование было бессмысленным, потому что это была моя вина. Я не знал достаточно о наборах параметров.
После некоторых исследований документации я понял, в чем проблема. Зная, как следует использовать наборы параметров, я разработал простой общий подход к решению этой проблемы. Требуется карандаш и лист бумаги, лучше редактор электронных таблиц.
- Запишите все возможные способы использования командлета => пользовательские истории.
- Продолжайте добавлять параметры со значимыми именами и отмечайте использование параметров, пока у вас не будет уникального набора наборов => нет повторяющейся комбинации параметров.
- Реализуйте наборы параметров в своем коде.
- Подготовьте тесты для всех возможных пользовательских историй.
- Запустите тесты (большой сюрприз, верно?). IDE не проверяет коллизию наборов параметров, тесты могут сэкономить много хлопот после одной.
Пример:
![Unique parameter binding resolution approach.]()
Практический пример можно увидеть здесь over here.
Кстати: уникальность параметров в наборах параметров является причиной, по которой свойство ParameterSetName
не поддерживает [String[]]
. Это не имеет никакого смысла.