Beseitigen Sie den erfassten Ausgabe- / Rückgabewert in einer Powershell-Funktion

9

Gibt es eine Möglichkeit, die Rückgabewerte innerhalb einer Funktion zu löschen, damit ich garantieren kann, dass der Rückgabewert das ist, was ich vorhabe? Oder vielleicht deaktivieren Sie dieses Verhalten für die Funktion?

In diesem Beispiel erwarte ich, dass der Rückgabewert eine ArrayList ist, die ("Hello", "World") enthält

%Vor%

Die Ausgabe enthält jedoch den erfassten Wert aus den Add-Operationen.

%Vor%

Ich finde dieses "Feature" von Powershell sehr nervig, weil es es sehr einfach macht, Ihre Funktion zu unterbrechen, indem Sie einfach eine andere Funktion aufrufen, von der Sie nicht wussten, dass sie einen Wert zurückgegeben hat.

Aktualisieren

Ich verstehe, dass es Möglichkeiten gibt, zu verhindern, dass die Ausgabe erfasst wird (wie in einer der folgenden Antworten beschrieben), aber Sie müssen wissen, dass eine Funktion tatsächlich einen Wert zurückgibt. Wenn Sie eine andere Powershell-Funktion aufrufen, kann es sein, dass jemand in Zukunft diese Funktion ändert, um einen Wert zurückzugeben, der dann Ihren Code unterbricht.

    
Mas 03.07.2014, 08:31
quelle

6 Antworten

6

Pipe-Ausgabe an Out-Null , Weiterleitung der Ausgabe an $null oder Präfix der Funktionsaufrufe mit [void] :

%Vor%

oder

%Vor%

oder

%Vor%     
Raf 03.07.2014, 09:09
quelle
2

Ich habe auch genau diese Frustration! Ich hatte eine Funktion, bei der eine Variable $ <variablename> ++

hochzählen soll

Außer. Ich hatte das "++" am Ende in einer Iteration vergessen. Dadurch wurde der Wert der Variablen an den Ausgabepuffer gesendet. Es war sehr ärgerlich und zeitaufwendig zu finden! MS sollte mindestens die Möglichkeit bieten, den Ausgabepuffer zu leeren, bevor der Benutzer seinen gewünschten Rückgabewert zuweisen kann. Anywhow ... Ich glaube, ich habe eine Arbeit.

Da ich am Ende der Funktion einen Rückgabewert zugewiesen habe, ist mein gewünschter Wert immer der letzte Eintrag des Ausgabepuffer-Arrays. Also habe ich die Art geändert, wie ich meine Funktionen anrufe:

%Vor%

An:

%Vor%

Mein besonderes Szenario hat mich gebissen, als ich versuchte, eine Funktion $ False Return einzufangen. Wegen meines obigen Tippfehlers sah meine IF-Anweisung es als wahr an, wegen des Mülls in der Ausgabe, obwohl meine letzte Funktionsausgabe "Return $ False" war. Die letzte Ausgabe, die von der Funktion zugewiesen wurde, war der $ False-Wert aufgrund des Problems, das daraus resultierte, dass der Tippfehler eine falsche Berechnung verursachte. Also ändere ich meine Funktion Return Evaluation zu:

%Vor%

Hat den Trick gemacht, indem ich nur das letzte Element des Ausgabe-Arrays ausgewertet habe. Ich hoffe, das hilft anderen.

    
user1654962 20.03.2015 15:05
quelle
2

Ich wollte das nur posten, falls es hilft. Ich hatte mehrere Funktionen, die ich anrief. Jede Funktion hat eine 0 oder eine 1 zurückgegeben. Ich habe das verwendet, um zu sehen, ob alles funktioniert.

Also im Grunde ...

%Vor%

Alles lief gut, bis ich eine Funktion hinzufügte, die einige Copy-Items und solche Befehle enthielt.

Lange Geschichte kurz und eine Stunde oder zwei werde ich nie zurückkommen, ich entdeckte das gleiche Problem mit dieser verflixten Pipeline-Sache. Wie auch immer, mit der Hilfe von Seiten wie dieser, fand ich den saubersten Weg, um sicherzustellen, dass Sie Ihre "Return" und sonst nichts bekommen.

%Vor%     
da_jokker 08.04.2015 18:23
quelle
2

Mit den Informationen von user1654962 habe ich dieses PowerShell-Problem im Detail behandelt. Da, wenn Ausgabeinformationen vorhanden sind, PowerShell es als ein Array zurückgibt, entschied ich mich dafür zu sorgen, dass die Funktionsausgabe immer ein Array war. Dann kann die aufrufende Zeile [-1] verwenden, um das letzte Element des Arrays zu erhalten, und wir erhalten einen konsistenten Rückgabewert.

%Vor%     
Piper 04.01.2018 17:32
quelle
1

Ich stieß auf das gleiche Problem. In PS würde eine Funktion alle Informationen der Ausgangsleitung zurückgeben. Es wird schwierig, | Out-Null Rest des Codes in der Funktion. Ich habe daran gearbeitet, indem ich die Rückgabevariable als Referenzparameter [ref] übergeben habe. Dies funktioniert durchgängig. Überprüfen Sie den folgenden Beispielcode. Hinweis: Ein Teil der Syntax ist wichtig, um Fehler zu vermeiden. z.B. Parameter muss in Klammern ([ref]$result)

übergeben werden %Vor%     
Feru 16.03.2017 19:09
quelle
0

Warum nicht das Powershell Array -Objekt anstelle der .Net-ArrayList verwenden?

Sie könnten etwas tun wie:

%Vor%

Dies wird wie erwartet ein "sauberes" Array zurückgeben.

Wenn Sie wirklich eine System.collections.ArrayList benötigen, können Sie dies in zwei Schritten tun:

  • erstellt ein Powershell-Array wie oben erklärt
  • Konvertieren Sie Ihr Powershell-Array in einer .Net-ArrayListe auf diese Weise:

    %Vor%

Hoffentlich hilft das ein bisschen.

    
Gruntzy 03.07.2014 16:28
quelle

Tags und Links