将变量的值存储为类型

时间:2018-12-03 18:10:00

标签: powershell powercli

好的-确实很挑剔,但是我讨厌写两次相同的代码(即使在这一点上它可以节省我更多的时间)

因此,我正在编写一个PowerCLI函数,该函数具有2个开关参数以查找打开或关闭事件。

function pGet-PowerEvent {

[cmdletbinding()]

PARAM (

[parameter(ValueFromPipeline=$true,
Mandatory=$true,
Position=0)]
[string[]]
$Entity,

[parameter(ValueFromPipeline=$true,
Mandatory=$false,
Position=1)]
[switch]
$onEvent,

[parameter(ValueFromPipeline=$true,
Mandatory=$false,
Position=2)]
[Switch]
$offEvent

)

if ($onEvent) {
$EventType = "VmPoweredOnEvent"
}

if ($offEvent) {
$EventType = "VmPoweredOffEvent"
}

$entity.ForEach{write-host $_; Get-VIEvent -Entity $_ -MaxSamples([int]::MaxValue) | ?{$_ -is [vmware.vim."$EventType"] | 
select createdtime, username }

}

并运行命令:

pGet-PowerEvent -Entity $vm -OnEvent

和错误:

Cannot convert the "[VMware.Vim.VmPoweredOffEvent]" value of type "System.String" to type "System.Type".

但是,当我运行此命令时-它会将[vmware.vim.vmpoweredoffevent]视为字符串,而不是类型。

但是我需要将变量作为类型。并将变量的值作为类型。

谢谢

1 个答案:

答案 0 :(得分:1)

我相信您想要其中一个:

Where-Object { $_.GetType().FullName -eq "vmware.vim.$EventType" }

或者:

Where-Object { $_ -is ([type]"vmware.vim.$EventType") }

或者这可能对您更好:

Where-Object { $_.GetType().Name -eq $EventType }

顺便说一句,您几乎可以肯定不希望所有三个参数都具有ValueFromPipeline=$true

如果运行此命令:

Get-VM $VMName | pGet-PowerEvent

与运行此命令基本相同:

$VM = Get-VM @VMParameters
pGet-PowerEvent -Entity $VM -onEvent:$VM -offEvent:$VM

您知道这没有什么意义吗?

此外,分配PositionMandatory=$false来切换参数实际上没有任何意义。您没有理由要这样做:

pGet-PowerEvent $VI $true $false

代替此:

pGet-PowerEvent $VI -onEvent

它更具可读性。如果您需要动态调用它,则可以执行以下操作:

$OnEventSetting = (Get-Date).DayOfWeek -eq [DayOfWeek]::Monday
$OffEventSetting = (Get-Date).DayOfWeek -eq [DayOfWeek]::Tuesday
pGet-PowerEvent $VI -onEvent:$OnEventSetting -offEvent:$OffEventSetting