web-dev-qa-db-fra.com

Créer une fonction avec des variables d'appel facultatives

Existe-t-il un moyen de créer un paramètre dans une fonction PowerShell où vous devez l'appeler pour qu'il soit pris en compte?

Un exemple donné par commandlet (le gras étant ce que je veux faire):

Invoke-Command-computernameServer01-Scriptblock{...}

Voici un exemple de ce que je veux faire avec la fonction

Function DoStuff($computername, -arg2, -domain $domain)
    Test-parameter(-domain) if (-domain -eq $true) {
        use $domain
    }
    Else {
        $domain = "Domain1"
    }
    test-parameter($arg2) {
        if ($arg2 -eq $true) {
            Do something
        }
        else {
            Do the opposite
        }
    }

Donc en résumé:

Si "-arg2" est présent, je veux que quelque chose se passe dans le script. Si "-Domain" est présent et contient un argument, je souhaite qu'il soit utilisé plutôt que l'argument set.

19
user100541

Powershell fournit une grande quantité de support intégré pour les scénarios de paramètres courants, y compris les paramètres obligatoires, les paramètres facultatifs, les paramètres "switch" (aka flag) et les "ensembles de paramètres".

Par défaut, tous les paramètres sont facultatifs. L'approche la plus élémentaire consiste à simplement vérifier chacun pour $null, puis implémentez la logique que vous souhaitez à partir de là. C'est essentiellement ce que vous avez déjà montré dans votre exemple de code.

Si vous souhaitez en savoir plus sur tout le soutien spécial que Powershell peut vous apporter, consultez ces liens:

about_Functions

about_Functions_Advanced

about_Functions_Advanced_Parameters

29
latkin

Je ne pense pas que votre question soit très claire, ce code suppose que si vous voulez inclure le paramètre -domain, il est toujours 'nommé' (c'est-à-dire dostuff computername arg2 -domain domain); cela rend également le paramètre computername obligatoire.

Function DoStuff(){
    param(
        [Parameter(Mandatory=$true)][string]$computername,
        [Parameter(Mandatory=$false)][string]$arg2,
        [Parameter(Mandatory=$false)][string]$domain
    )
    if(!($domain)){
        $domain = 'domain1'
    }
    write-Host $domain
    if($arg2){
        write-Host "arg2 present... executing script block"
    }
    else{
        write-Host "arg2 missing... exiting or whatever"
    }
}
17
nimizen

Je ne suis pas sûr d'avoir bien compris la question.

D'après ce que je comprends, vous voulez pouvoir attribuer une valeur à Domain si elle est nulle et aussi quoi vérifier si $ args2 est fourni et selon la valeur, exécuter un certain code?

J'ai changé le code pour réassembler les hypothèses faites ci-dessus.

Function DoStuff($computername, $arg2, $domain)
{
    if($domain -ne $null)
    {
        $domain = "Domain1"
    }

    if($arg2 -eq $null)
    {
    }
    else
    {
    }
}

DoStuff -computername "Test" -arg2 "" -domain "Domain2"
DoStuff -computername "Test" -arg2 "Test"  -domain ""
DoStuff -computername "Test" -domain "Domain2"
DoStuff -computername "Test" -arg2 "Domain2"

Cela vous a-t-il aidé?

6
user983965