Хранение значения переменной как типа - PullRequest
0 голосов
/ 03 декабря 2018

Хорошо - действительно придирчиво, но я НЕНАВИЖУ писать один и тот же код дважды (даже если бы в этот момент это сэкономило бы мне больше времени)

Так что я пишу функцию PowerCLI, которая имеет 2 параметра переключения длялибо найдите событие poweredon или poweredoff.

вот

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 голосов
/ 03 декабря 2018

Я полагаю, вы хотите либо:

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
...