Вызвать / выполнить команду с неизвестным количеством параметров в PowerShell

456
igor

Хотите выполнить Invoke-Expressionс параметрами, которые могут варьироваться в зависимости от ввода

Возникли проблемы с $MyArgsлогикой. Он должен содержать только введенные параметры

Вход (пример):

./foo.ps1 -Name aa -Server bb -Datastore cc 

Выход:

Get-VM -Name aa -Server bb -Datastore cc 

Код:

 [cmdletbinding(DefaultParameterSetName='Get-VM')] Param( #Common params [Parameter(ParameterSetName='Get-VM')] [Parameter(ParameterSetName='Get-Datastore')] [Parameter(Position = 0)] [String]$Name,   [Parameter(ParameterSetName='Get-VM')] [Parameter(ParameterSetName='Get-Datastore')] [Parameter(Position = 1)] [String]$Server,  #Get-VM params [Parameter(ParameterSetName='Get-VM')] [String]$Datastore, [Parameter(ParameterSetName='Get-VM')] . . .  #Get-Datastore params [Parameter(ParameterSetName='Get-Datastore')] [String]$Datacenter,  . . . )  Invoke-Expression -Command "$PSCmdlet.ParameterSetName $MyArgs" \\ <--- here is my problem 
1
Я мог бы использовать `Command`, но выполнение будет на localhost igor 5 лет назад 0

1 ответ на вопрос

1
Ben N

Мы собираемся использовать три функции PowerShell:

  • Оператор вызова &, вызывает команду, имя которой может быть указано выражением. В отличие от этого Invoke-Expression, он может обрабатывать связанные параметры, не разбирая все.
  • $PSBoundParametersПеременный является Хешем параметров, указанных в текущий командлет и их значение.
  • Splatting похож на обратную $PSBoundParameters: он использует хеш-таблицу в качестве параметров привязки к командлету.

Собрав все это вместе, мы заменим ваш Invoke-Expressionвызов этим, вызывая командлет, имя которого является именем набора параметров, и передавая ему все параметры функции:

& $PSCmdlet.ParameterSetName @PSBoundParameters 
Круто, работает, как и ожидалось, простота гениальна :) Просто учусь использовать параметры в PowerShell, поэтому очень благодарен за дополнительную информацию и пояснения igor 5 лет назад 0