Хотите выполнить 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
Мы собираемся использовать три функции PowerShell:
- Оператор вызова,
&
, вызывает команду, имя которой может быть указано выражением. В отличие отInvoke-Expression
, он может обрабатывать связанные параметры без стрингификации всего. - Переменная
$PSBoundParameters
представляет собой хеш-таблицу параметров, указанных для текущего командлета, и их значений. - Шлепаньеэто как бы наоборот
$PSBoundParameters
: он использует хеш-таблицу в качестве привязанных параметров к командлету.
Собрав все вместе, мы заменяем ваш Invoke-Expression
вызов следующим образом: вызываем командлет, имя которого совпадает с именем набора параметров, и передаем ему все параметры функции:
& $PSCmdlet.ParameterSetName @PSBoundParameters