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
는 현재 cmdlet에 지정된 매개 변수와 해당 값의 해시 테이블입니다. - 스플래팅반대입니다
$PSBoundParameters
. 해시 테이블을 cmdlet에 대한 바인딩된 매개 변수로 사용합니다.
모든 것을 종합하면 Invoke-Expression
호출을 다음으로 대체하여 이름이 매개 변수 집합 이름인 cmdlet을 호출하고 모든 함수의 매개 변수를 전달합니다.
& $PSCmdlet.ParameterSetName @PSBoundParameters