将变量的值存储为类型
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
你明白这没有意义吗?
此外,将 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
好吧 - 真的很挑剔,但我讨厌将相同的代码写两次(即使此时它会节省我更多时间)
所以我正在编写一个 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
你明白这没有意义吗?
此外,将 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