好的-确实很挑剔,但是我讨厌写两次相同的代码(即使在这一点上它可以节省我更多的时间)
因此,我正在编写一个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]视为字符串,而不是类型。
但是我需要将变量作为类型。并将变量的值作为类型。
谢谢
答案 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
您知道这没有什么意义吗?
此外,分配Position
或Mandatory=$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