将变量的值存储为类型

Storing value of a variable as a type

好吧 - 真的很挑剔,但我讨厌将相同的代码写两次(即使此时它会节省我更多时间)

所以我正在编写一个 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] 视为一个字符串,而不是一个类型。

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

谢谢

我相信你想要:

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