2012-09-17 4 views
0

Je voudrais -h sans passer une valeur de travail ainsi que -h avec un paramètre: Cependant, je voudrais que les autres restent comment ils sont ... C'est, ils sont facultatifs, sauf si vous alias un paramètre et que vous devez fournir une valeur.paramètres vides utilisant alias dans powershell

Param(
$BadParam, 
[alias("h")][String]$Help, 
[alias("s")][String]$Server,  
[alias("d")][String]$DocRoot, 
[alias("c")][String]$Commit, 
[alias("b")][String]$Branch 
) 

Par exemple (faute de mieux):

if(!$Help) 
{ 
Write-Host "Here's the menu for how it works bro." 
} 

if($Help) 
{ 
Write-Host "Here's more info on that particular thing from the menu." 
} 

Comment j'attendre à ce que se comporter en coquille:

-> script.ps1 -s test -h 
-> Here's the menu for how it works bro. 

-> script.ps1 -s test -h server 
-> Here's more info on that particular thing from the menu. 

-> script.ps1 -s -h server 
-> You are missing a value for -e. 

Répondre

3

Powershell ne supporte pas vraiment quelque chose comme ça. Vous pouvez avoir un paramètre [switch] qui peut être spécifié sans valeur ou vous pouvez avoir un paramètre [string] qui doit être complètement absent ou fourni avec une valeur. Vous ne pouvez pas avoir de paramètre supportant l'absence, spécifié sans valeur et spécifié avec une valeur.

Une alternative est le rendre un [string], mais les utilisateurs passent $null, mais ce genre de craint.

Une autre alternative extrêmement hacky est la tromperie avec des positions de paramètres. -Help pourrait être un [switch], alors il pourrait y avoir un autre paramètre -ThingHelp placé juste après celui qui est un [string]. Ensuite, une invocation qui ressemble à -Help 'foo' ne définit pas $Help à 'foo' mais définit plutôt le commutateur $Help et attribue également $ThingHelp = 'foo'.

function ParamTest 
{ 
    param(
    [Parameter(Position = 0)] 
    [switch]$Help, 

    [Parameter(Position = 1)] 
    [string] $ThingHelp 

) 

    "Help is [$help]" 
    "ThingHelp is [$thingHelp]" 
} 

Cela prend en charge les éléments suivants:

PS> ParamTest    # $help = $false, $thingHelp = null 
PS> ParamTest -Help   # $help = $true, $thingHelp = null 
PS> ParamTest -Help 'foo' # $help = $true, $thingHelp = 'foo' 

Hacks comme celui-ci sont pas une bonne idée en général, car ils ont tendance à être à la fois fragile et confus. Vous devriez être en mesure de vous donner des scripts à un utilisateur moyen de PowerShell, et ils devraient immédiatement comprendre la signification et l'utilisation de vos paramètres. Si vous devez expliquer un tas de choses personnalisées qu'aucun des milliers d'autres cmdlets ne font, vous perdez probablement du temps. Et si vous implémentez littéralement un système d'aide/utilisation, arrêtez! Powershell fournit un système d'aide complet gratuitement. Vous pouvez documenter chaque paramètre, donner un exemple de code, etc, sans rien supplémentaire. Voir la documentation pour comment-based help.

Questions connexes