2010-09-19 12 views
3

Quelqu'un a des idées pour lesquelles le code suivant produirait une erreur, voir les commentaires supplémentaires après la fonction pour plus de détailserreur Powershell retour Hashtable

function callee ([Hashtable]$arg0) { 
    [Hashtable]$hashtable = @{} 
    $hashtable = $arg0 
    $hashtable.add('passed', $True) 
    # $hashtable       ######## toggle this line 
    $type = $hashtable.GetType() 
    Write-Host "$type" 
    return $hashtable 
} 

function caller { 
    [Hashtable]$hashtable = @{'00'='0'} 
    $hashtable = callee $hashtable  ##### returns error here 
    $hashtable.add('returned', $True) 
    $hashtable 
} 
caller 

message d'erreur: Impossible de convertir le « System.Object [] » valeur de type "System.Object []" pour taper "System.Collections.Hashtable".

Je reçois l'erreur sur une variété d'instances, j'ai essayé de la réduire à un exemple qui est facile à reproduire. Il semble qu'il change la hashtable en un tableau d'objets et c'est pourquoi il ne le retournera pas? Cela me permet de modifier la hashtable et de la renvoyer mais quand j'essaye de l'afficher ça la change? Est-ce le même effet que je reçois quand je commence à ajouter du code à la fonction de l'appelé?

Répondre

8

Lorsque vous décommentez # $hashtable, vous obtenez deux éléments de la fonction. Le résultat de la fonction est tout "sortie" de celui-ci, et PowerShell envelopper automatiquement plusieurs sorties dans un tableau. L'instruction return est une commodité de court-circuit et ne doit pas être confondue avec le seul moyen de renvoyer une valeur à partir de la fonction.

+0

Question similaire ici http://stackoverflow.com/questions/2158786/calling-echo-inside-a-function-pre-pends-echo-string-to-return-value-in-powershel –

+2

D'accord. Je recommande de ne pas utiliser l'idiome 'return ' dans PowerShell car il est trompeur. Il est fonctionnellement équivalent à 'Write-Output ; retour ». Mieux vaut juste mettre $ hashtable comme dernière ligne de la fonction et l'appeler bien (comme le fait la fonction * caller *). –