2010-08-02 7 views
1

Le problème est donc que lorsque j'exécute mon script de base qui reflète simplement ce qui est passé sur la ligne de commande, les arguments ne sont pas séparés de la manière attendue.arguments de ligne de commande dans Powershell

le code de base est:

write-host "`$args`[0`] = $args[0]" 
write-host "`$args`[1`] = $args[1]" 
write-host "`$args`[2`] = $args[2]" 

et si j'appelle le script comme

./script apples oranges bananas 

je reçois

$args[0] = apples oranges bananas[0] 
$args[1] = apples oranges bananas[1] 
$args[2] = apples oranges bananas[2] 

S'il est important, je le fais en Powershell 2,0

Répondre

0

Wow, donc euh, gênant. Si vous retournez $ args [0], par exemple, entre guillemets, comme je l'ai fait ci-dessus, il va interpréter $ args et stop, n'atteignant jamais le [], et donc imprimer le $ arg, ou le tableau complet d'arguments de ligne de commande.

3

Vous devez envelopper la variable dans $(..) comme ceci:

write-host "`$args`[0`] = $($args[0])" 
write-host "`$args`[1`] = $($args[1])" 
write-host "`$args`[2`] = $($args[2])" 

Cela vaut pour toute expression qui n'est pas simple variable scalaire:

$date = get-date 
write-host "day: $($date.day)" 
write-host "so web page length: $($a = new-object Net.WebClient; $a.DownloadString('http://stackoverflow.com').Length)" 
write-host "$(if (1 -eq (2-1)) { 'is one' } else {'is not'})" 
1

est ici une fonction d'assistance que j'utilise dans mon profil :

function Echo-Args 
{ 
    for($i=0;$i -lt $args.length;$i++) 
    { 
     "Arg $i is <$($args[$i])>" 
    } 
} 

PS > Echo-Args apples oranges bananas 
Arg 0 is <apples> 
Arg 1 is <oranges> 
Arg 2 is <bananas> 
Questions connexes