0

При определении функции, как вы можете ссылаться на пользовательское перечисление?Как передать пользовательское перечисление функции в powershell

Вот что я хочу:

Add-Type -TypeDefinition @" 
    namespace JB 
    { 
     public enum InternetZones 
     { 
      Computer 
      ,LocalIntranet 
      ,TrustedSites 
      ,Internet 
      ,RestrictedSites 
     } 
    } 
"@ -Language CSharpVersion3 

function Get-InternetZoneLogonMode 
{ 
    [CmdletBinding()] 
    param 
    (
     [Parameter(Mandatory=$true)] 
     [JB.InterfaceZones]$zone 
    ) 
    [string]$regpath = ("HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\{0}" -f [int]$zone) 
    $regpath 
    #... 
    #Get-PropertyValue 
} 

Get-InternetZoneLogonMode -zone [JB.InternetZones]::TrustedSites 

Но это дает ошибку:

Get-ZoneLogonMode : Unable to find type [JB.InterfaceZones]. Make sure that the assembly that contains this type is loaded. 
At line:29 char:1 
+ Get-ZoneLogonMode -zone [JB.InternetZones]::TrustedSites 
+ ~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (JB.InterfaceZones:TypeName) [], RuntimeException 
    + FullyQualifiedErrorId : TypeNotFound 

NB: Я знаю, я мог бы использовать ValidateSet для подобной функциональности; однако имеет тот недостаток, что имеет только значение имени; в отличие от того, чтобы позволить мне программировать, используя дружественные имена, которые затем отображаются в ints в фоновом режиме (я мог бы написать код для этого, но перечисление представляется более подходящим, если это возможно).

Я использую Powershell v4, но в идеале я бы хотел использовать совместимое с PowerShell v2 решение, так как большинство пользователей на этой версии по умолчанию.

Update

Я исправил опечатку (спасибо PetSerAl, хорошо подмечено). [JB.InterfaceZones]$zone теперь изменен на [JB.InternetZones]$zone. ошибка Теперь я вижу:

Get-InternetZoneLogonMode : Cannot process argument transformation on parameter 'zone'. Cannot convert value "[JB.InternetZones]::TrustedSites" to type 
"JB.InternetZones". Error: "Unable to match the identifier name [JB.InternetZones]::TrustedSites to a valid enumerator name. Specify one of the following 
enumerator names and try again: Computer, LocalIntranet, TrustedSites, Internet, RestrictedSites" 
At line:80 char:33 
+ Get-InternetZoneLogonMode -zone [JB.InternetZones]::TrustedSites 
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidData: (:) [Get-InternetZoneLogonMode], ParameterBindingArgumentTransformationException 
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-InternetZoneLogonMode 
+2

Ваша функция объявляет '$ zone' как' [JB.InterfaceZones] 'не как' [JB.InternetZones] '. – PetSerAl

+0

Doh! Спасибо - хотя все еще получаю сообщение об ошибке (обновление сообщения) – JohnLBevan

+1

просто вызывайте его так: 'Get-InternetZoneLogonMode -zone TrustedSites' –

ответ

2

ИНО отдал этот далеко для меня, но ваш пытались синтаксис не был совершенно неправильно. Я смог сделать это и заставить его работать.

Get-InternetZoneLogonMode -Zone ([JB.InternetZones]::TrustedSites) 

Опять же, если вы посмотрите на выделение, вы увидите, как я пришел к такому выводу.

syntax highlighting

+0

Ах, хороший один - thankyou :) – JohnLBevan

0

Per комментарии по PetSerAl & CB:

  • Исправлена ​​опечатка в определении функции

    • от [JB.InterfaceZones]$zone
    • в [JB.InternetZones]$zone
  • Измененный вызов функции

    • от Get-InternetZoneLogonMode -zone [JB.InternetZones]::TrustedSites
    • в Get-InternetZoneLogonMode -zone TrustedSites