2010-05-21 5 views
3

Cette tâche est très simple dans toutes les langues que j'ai jamais utilisées, mais je n'arrive pas à la comprendre dans PowerShell. Un exemple de ce que je parle en C:comment utiliser les expressions en tant que paramètres de fonction dans powershell

abs(x + y) 

L'expression x + y est évaluée et le résultat transmis à abs comme paramètre ... comment puis-je faire dans PowerShell? La seule façon dont j'ai compris jusqu'ici est de créer une variable temporaire pour stocker le résultat de l'expression, et passer cela.

PowerShell semble avoir des règles de grammaire et d'analyse très étranges qui me surprennent constamment, tout comme cette situation. Quelqu'un sait-il de la documentation ou un tutoriel qui explique la théorie sous-jacente de base de la langue? Je ne peux pas croire que ce sont tous des cas spéciaux, il doit y avoir une rime ou une raison qu'aucun tutoriel que j'ai lu ne l'explique. Et oui, j'ai lu this question, et tous ces tutoriels sont horribles. J'ai été plutôt relégué à apprendre du code existant.

Répondre

6

Dans votre cas, entourer simplement l'expression avec des parenthèses vous permettra de la passer à votre fonction.


Vous devez effectuer cette opération car PowerShell a plusieurs modes d'analyse en fonction du début de la commande.

Le mode expression est similaire à la plupart des autres langages d'analyse - les nombres sont des nombres et des chaînes de caractères.

Le mode de commande traite tout comme une chaîne à l'exception des variables et des parenthèses. Les cordes ici n'ont pas besoin d'être citées.

1+2   Expression mode - starts with number 
"string"  Expression mode - starts with quote 
string  Command mode - starts with letter 
& "string" Command mode - starts with & 
. "string" Command mode - starts with . and a space 
.123   Expression mode - starts with . and number (without space) 
.string  Command mode - starts with a . that is part of a command name 

Vous pouvez mélanger les modes sur une seule ligne en incluant les commandes avec des parenthèses.

Vous pouvez voir cet effet si vous définissez abs fonction de la manière suivante:

function Abs($value) 
{ 
    Write-Host $args 
    if($value -lt 0) { -$value } else { $value } 
} 

Abs 1 + 2 
#Prints: + 2 
#Returns: 1 

Abs 1+2 
#Prints: 
#Returns: 1+2 

Abs (1 + 2) 
#Prints: 
#Returns: 3 

Abs (1+2) 
#Prints: 
#Returns: 3 
+0

merci pour expliquer les modes. Je n'avais aucune idée qu'il avait même des modes différents, car aucun des tutoriels que j'ai trouvé jusqu'à présent mentionné une telle chose. Je n'ai pas essayé parens parce que j'ai déjà rencontré un problème en appelant une fonction avec parens où il passait un seul tableau de tous les arguments (en tant que premier argument) au lieu des arguments à leur place. – rmeador

+1

@rmeador PowerShell in Action est fortement recommandé :) Les modes y sont également expliqués. C'est le livre # 1. – stej

3

Je ne suis pas certain de suivre exactement le problème que vous rencontrez. L'exemple suivant montre que cela fonctionne comme prévu dans PowerShell:

PS> function abs($val) {Write-Host "`$val is $val"; if ($val -ge 0) {$val} ` 
                else {-$val}} 
PS> abs (3+4) 
$val is 7 
7 

En ce qui concerne les meilleurs documents sur la langue, je recommande fortement Windows PowerShell in Action par Bruce Payette (il est le gars derrière la grammaire). Si vous pouvez attendre encore quelques mois (ou si vous êtes d'accord avec une copie électronique), il y a une deuxième édition qui a été mise à jour cet été pour PowerShell 2.0.

Vous pouvez également trouver ma série Effective PowerShell utile. Commander l'article # 10 sur PowerShell Parsing Modes.

Questions connexes