9
votes

Pourquoi invoque un bloc de script PowerShell avec .invoke () renvoyer une collection?

Il semble que l'appelant un bloc de script PowerShell (en invoquant le .invoke () méthode) produit toujours une collection. Plus précisément, une collection de type

system.collections.Objectmodel.collection`1 [[System.management.Automation.psObject, systeme.Management.Automation, version = 3.0.0.0, Culture = neutre, PublickeyToken = 31bf3856ad364E35]]

Invoquant même un bloc de script vide ( {}. Invoke () ) renvoie une collection. Invoquant le même bloc de script à l'aide de l'opérateur d'appel ( & ) produit la déclaration normalement attendue (un scalaire ou [objet []] ).

Cela s'avère être pratique si vous avez besoin d'une collection au lieu d'un tableau, mais cela semble un peu contre-intuitif.

Est-ce que quelqu'un sait pourquoi il se comporte de cette façon?

EDIT:

Je savais qu'il existe deux invocations différentes, .invoke () et .invokertaturnasis () à partir de la lecture de la langue de la langue. C'est j'ai été remarqué pour la première fois.

Je ne comprends tout simplement pas le raisonnement de la convention de dénomination et la manière dont la mécanique semble fonctionner. En regardant la documentation, ce que j'aurais pensé, la méthode d'invocation par défaut n'est pas ce qui est utilisé lorsque le script est invoqué dans PowerShell. Il semble que .invokertaturnasis () vient de renvoyer un flux d'objets, puis PowerShell enroule dans un tableau d'objet s'il y a plus d'un objet, en tant que scalaire s'il n'y a qu'un seul objet, ou crée un objet null. S'il n'y en a pas, comme s'il y a un pipeline implicite là-bas. En utilisant .invoke () renvoie une collection, toujours et PowerShell le laisse comme une collection.


0 commentaires

3 Réponses :


11
votes

semble être la différence entre ces deux méthodes:

invoke - invoque le bloc de script avec les arguments spécifiés, retourner les résultats comme objets psobjectés.

InvokeTeturnasis - exécute le bloc de script avec les arguments spécifiés. Cette méthode renvoie les objets de résultat bruts (non emballés) afin qu'il puisse être plus efficace.

http://msdn.microsoft.com/en-us/library/system.management.Automation.scriptBlock_Methods (v = vs.85) .aspx

invoquer xxx

sortie: xxx

InvokeTeturnasis xxx

sortie: xxx


0 commentaires

1
votes

Parce que c'est ce qu'il est conçu pour faire, et il y a une alternative!

Invoke - invoque le bloc de script avec les arguments spécifiés, renvoyant les résultats en tant que (collection d'objets) psobjectés.

InvokeTurnasis - exécute le bloc de script avec les arguments spécifiés. Cette méthode renvoie les objets de résultat bruts (non emballés) afin qu'il puisse être plus efficace.

Aussi, {}. invoquer () retourne null, donc je ne sais pas où vous avez les impressions que même qui renvoie une collection.

http : //msdn.microsoft.com/en-us/library/system.management.automation.scriptBlock.invokertaturnasis (v = vs.85) .aspx


2 commentaires

J'ai eu l'idée qu'il récupère comme collection quand je l'ai fait: ({} .invoke) .getType ()


get-member -inputObject ({} .invoke ()) montre qu'il renvoie trop une collection; Inversement, $ null -eq {} .invoke () retourne $ false . La collection renvoyée est vide , c'est pourquoi elle ne produit aucune sortie dans la console.