2012-05-25 14 views
6

Czy istnieje sposób, aby niektóre parametry były obowiązkowe na podstawie pewnych warunków (na przykład: jeśli jeden z parametrów jest nieobecny lub fałszywy) w funkcji PowerShell?Parametry warunkowego powershell

Mój pomysł polega na tym, że można wywoływać funkcję na dwa sposoby. Konkretnym przykładem jest funkcja, która otrzymuje listę z programu sharepoint - powinienem móc wywołać ją za pomocą adresu URL (jedyny i jedyny parametr) LUB z adresem URL strony internetowej i nazwy wyświetlanej listy (dwa parametry, oba obowiązkowe, ale tylko w przypadku, gdy adres URL listy jest ustawiony nieużywany).

Mam nadzieję, że moje pytanie jest jasne.

Odpowiedz

9

Zgodnie z tym, co wskazał Christian, można tego dokonać za pomocą parametru ParameterSetNames. Spójrz na ten przykład:

function Get-MySPWeb { 
    [CmdletBinding(DefaultParameterSetName="set1")] 
    param (
     [parameter(ParameterSetName="set1")] $RelativeUrl, 
     [parameter(ParameterSetName="set2")] $WebUrl, 
     [parameter(ParameterSetName="set2", Mandatory=$true)] $DisplayName 
    ) 
    Write-Host ("Parameter set in action: " + $PSCmdlet.ParameterSetName) 
    Write-Host ("RelativeUrl: " + $RelativeUrl) 
    Write-Host ("WebUrl: " + $WebUrl) 
    Write-Host ("DisplayName: " + $DisplayName) 

} 

Jeśli uruchomić go z -RelativeUrl Foo będzie wiązać się z „zestaw1”. Jeśli wywołasz tę funkcję bez parametrów, również zostanie ona powiązana z "set1".

(Uwaga -gdy żaden z parametrów nie są w PowerShell v3 (z Windows 8 podglądu konsumentów) będzie wiązać się z „zestaw1”, jednak będzie od błędów wiąże w PowerShell v2 chyba dodawać [CmdletBinding(DefaultParameterSetName="set1")] do bloku param dzięki. @ x0n dla wskazówki DefaultParameterSetName!)

Jeśli spróbujesz uruchomić ją z wartością parametru z obu zestawów, pojawi się błąd.

Jeśli uruchomisz go z -WebUrl Bar, wyświetli się monit o podanie wartości parametru DisplayName, ponieważ jest to parametr obowiązkowy.

+0

To jest dokładnie to, czego potrzebowałem! Dziękuję Ci! Tylko jedna rzecz: kiedy uruchomię to bez żadnych parametrów, pojawia się błąd (ale chciałem tego w ten sposób). Jedno pytanie uzupełniające: podczas korzystania z zestawów parametrów należy użyć przełącznika ze zmienną $ PSCmdlet.ParameterSetName, prawda? – jumbo

+0

W prawo, '$ PSCmdlet.ParameterSetName' istnieje, abyś mógł podjąć odpowiednie działanie w oparciu o zestaw parametrów oceniony przez proces wiązania parametru. BTW to ciekawe, że masz błąd, wydaje się, że jest to różnica w zachowaniu między PSv2 i PSv3. –

+1

Sztuczka polegająca na tym, że działa jak wersja 3, to użycie domyślnej dyrektywy zestawu parametrów. Zmieniłem twoją odpowiedź, aby to pokazać. – x0n

1

Należy użyć Parameters Set naming. Możesz przypisać parametr exlusive do innej nazwy zestawu parametrów.

+0

Czy możesz dać mi mały przykład, w jaki sposób mogę osiągnąć to, co napisałem? – jumbo

+0

Przeczytaj tutaj http://blogs.technet.com/b/heyscriptingguy/archive/2011/06/30/use-parameter-sets-to-simplify-powershell-commands.aspx Jestem zbyt zajęty, aby napisać przykład ale link daje naprawdę dobre wyjaśnienie. –

+1

w komentarzach Kod wygląda źle ... ale: param ( [parametr (ParameterSetName = 'rel' Obowiązkowe = $ true)] [ciąg] $ RelativeUrl, [parametr (ParameterSetName = 'www', Obowiązkowe = $ true)] [string] $ WebUrl, [Parametr (ParameterSetName = 'web', Mandatory = $ true)] [string] $ DisplayName ) Teraz musisz ustawić parametry * sets *, po jednym dla każdego scenariusza. Parametr może przejść do wielu zestawów lub wszystkich zestawów (jeśli nie podano parametru nazwa_parametru). Więcej o pomocy about_Functions_Advanced_Parameters – BartekB

Powiązane problemy