2014-09-08 9 views
5

Czy robię coś głupiego tutaj?PowerShell nie może używać dopasowanego typu wyliczenia?

określić, że funkcja przyjmuje określony typ enum jako argument:

PS> add-type -AssemblyName System.ServiceProcess 
PS> function test([System.ServiceProcess.ServiceControllerStatus]$x) { Write-host $x $x.gettype() } 

Typ jest zdecydowanie w zakresie od może uzyskać dostęp do wystąpienia jego (i ręcznie importowane zespół)

PS> [System.ServiceProcess.ServiceControllerStatus]::Stopped 
Stopped 

Wtedy, gdy próbuję przekazać funkcję instancji enum powiedział, IT błędy oUT:

PS> test [System.ServiceProcess.ServiceControllerStatus]::Stopped 
test : Cannot process argument transformation on parameter 'x'. Cannot convert value 
"[System.ServiceProcess.ServiceControllerStatus]::Stopped" to type "System.ServiceProcess.ServiceControllerStatus". 
Error: "Unable to match the identifier name [System.ServiceProcess.ServiceControllerStatus]::Stopped to a valid 
enumerator name. Specify one of the following enumerator names and try again: Stopped, StartPending, StopPending, 
Running, ContinuePending, PausePending, Paused" 
At line:1 char:6 
+ test [System.ServiceProcess.ServiceControllerStatus]::Stopped 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidData: (:) [test], ParameterBindingArgumentTransformationException 
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,test 

to całkiem zadowolony zmuszanie ciąg, choć:

PS> test 'Stopped' 
Stopped System.ServiceProcess.ServiceControllerStatus 

Co się dzieje?

(komunikaty o błędach PowerShell są tak niechlujny wygląd. = /)

Odpowiedz

6

używasz do małego gotcha w zakresie trybów parsowania. Można umieścić nawiasów wokół argumentu i będzie działać:

test ([System.ServiceProcess.ServiceControllerStatus]::Stopped) 

Alternatywnie, konwersje z ciągiem do wyliczenia się naturalnie, więc można napisać:

test Stopped 

Oto kilka dobrych linków, które omawiają parsowania tryby:

http://technet.microsoft.com/en-us/library/hh847892.aspx http://rkeithhill.wordpress.com/2007/11/24/effective-powershell-item-10-understanding-powershell-parsing-modes/

0

Najwyraźniej PowerShell myśli przesyłam mu ciąg, a nie obiekt enum. Masz ten sam komunikat o błędzie, jeśli podać nazwę pełną:

PS> test '[System.ServiceProcess.ServiceControllerStatus]::Stopped' 
test : Cannot process argument transformation on parameter 'x'. Cannot convert value 
"[System.ServiceProcess.ServiceControllerStatus]::Stopped" to type "System.ServiceProcess.ServiceControllerStatus". 
Error: "Unable to match the identifier name [System.ServiceProcess.ServiceControllerStatus]::Stopped to a valid 
enumerator name. Specify one of the following enumerator names and try again: Stopped, StartPending, StopPending, 
Running, ContinuePending, PausePending, Paused" 
At line:1 char:6 
+ test '[System.ServiceProcess.ServiceControllerStatus]::Stopped' 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidData: (:) [test], ParameterBindingArgumentTransformationException 
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,test 

stawianie enum w nawiasach zmusić PowerShell ocenić najpierw załatwia sprawę:

PS> test ([System.ServiceProcess.ServiceControllerStatus]::Stopped) 
Stopped System.ServiceProcess.ServiceControllerStatus 
2

można przekazać wartość enum jako stri ale nie przekazujesz nazwy pliku jako części argumentu, np. to działa dobrze:

PS> test Stopped 
Stopped System.ServiceProcess.ServiceControllerStatus 

Powiedział, że kiedy dzwonię metody .NET wolę używać pełną wartość enum zamiast łańcucha. To dlatego, że metody .NET mają często wiele przeciążeń, a te, które pobierają ciągi, mogą pomylić PowerShell, gdy przychodzi do wybrania właściwego przeciążenia.

0

Nie podajesz poprawnie parametru $x. Musi być zawarty w wyrażeniu param().

function test 
{ 
    param(
     [ServiceProcess.ServiceControllerStatus] 
     $x 
    ) 
    Write-host $x $x.gettype() 
} 

Dodatkowo można pominąć część dowolnego typu pod nazwą .

+0

Jestem pewien, że to naprawdę stara rada z czasów PS1 czy coś takiego ... Jak widać w innych odpowiedziach, składnia w pytaniu działa zgodnie z oczekiwaniami. To połączenie ma pewne problemy z analizą. – jpmc26