Ich habe die folgende PS-Funktion:
%Vor%Die meisten Funktionen wurden der Kürze halber entfernt. Das Problem, das ich habe, ist, wenn ich die Funktion wie folgt aufrufen:
[System.Data.DataTable] $buildData = GetBuildData
Ich erhalte den folgenden Fehler:
Der Wert "System.Object []" vom Typ "System.Object []" kann nicht konvertiert werden um "System.Data.DataTable" einzugeben.
Warum denkt Powershell, dass ich ein object [] -Array zurückgeben möchte, wenn es offensichtlich ist, dass die $ dt-Variable eine DataTable ist?
BEARBEITEN:
Ich habe es überprüft, und $dt
enthält Daten. Zum Beispiel ist die Anzahl von Rows.Count 1, was erwartet wird.
Ich weiß nicht, über welche anderen Themen die Leute reden, aber ich kann mir zwei mögliche Gründe vorstellen, warum Sie ein Object[]
zurückbekommen.
Es könnte sein, dass Sie eine nicht erfasste Ausgabe irgendwo anders in der Funktion haben. In Ihrem Fall gibt Fill
ein int
zurück. Fügen Sie dies am Ende Ihrer Funktionsaufrufe hinzu:
z. B.
%Vor%Wenn eine Anweisung einen Wert zurückgibt und Sie ihn nicht erfassen, wird die Ausgabe in Ihren Rückgabewert eingeschlossen, und da Sie zu diesem Zeitpunkt mehrere Rückgabewerte haben, stopft PowerShell sie alle in ein Array.
Die andere Möglichkeit besteht darin, dass PowerShell zurückgegebene Sammlungen aller Art in Object[]
s konvertiert. Verwenden Sie den Operator ,
, um den nicht verwalteten Wert zurückzugeben:
Das ,
erstellt ein Array, das nur den folgenden Wert enthält. So nah wie ich es erraten kann, bewirkt dies, dass PowerShell automatisch das äußerste Array auslöst und den Wert alleine belässt, da der tatsächliche Rückgabewert jetzt ein Array ist, das nur einen einzigen Wert enthält.
Das return
ist tatsächlich optional, da nicht erfasste Werte im Rückgabewert enthalten sind.
Gerade bin ich gestern selbst in diese geraten. Ich kann nicht für das Leben von mir herausfinden, warum irgendjemand denken würde, still zu Object[]
zu konvertieren ist nützlich.
Sie haben ein paar Probleme mit dem, was Sie gepostet haben. Da Sie explizit ein DataTable-Objekt mit New-Object System.Data.DataTable
erstellen, gibt es keinen Grund, es auch mit [System.Data.DataTable]
zum DataTable-Typ zu zwingen. Das gleiche gilt für den Aufruf der Funktion. Sie geben ein DataTable-Objekt zurück, so dass Sie zurück erhalten. Wenn Sie den Variablentyp angeben möchten, sollte zwischen dem Typbezeichner und dem Variablennamen kein Leerzeichen stehen. Unabhängig davon würden diese Probleme nicht das Verhalten verursachen, das Sie sehen. Ich habe diesen Code ausgeführt:
Und es hat gut funktioniert. Ich vermute, dass das Bit, das dein Problem verursacht, wahrscheinlich in dem Bit liegt, das du aus Gründen der Kürze ausgeschlossen hast. Shortcuts sind selten und Sie erhalten selten genaue Antworten von Teildaten.
Ein weiterer Faktor ist, dass Sie die Methoden zum Öffnen und Schließen nicht aufrufen, sondern stattdessen auf sie verweisen. PowerShell gibt einen Verweis auf diese Methoden sowie auf die Datentabelle aus (von der ich mir vorstellen kann, dass sie aufgrund der Tatsache, dass die Verbindung nicht geöffnet ist, nicht wirklich ausgefüllt ist).
Sie müssen die Klammern für die Methoden zum Öffnen / Schließen wie folgt einfügen:
%Vor%Sie müssen sich auch vor Methoden in Acht nehmen, die Werte zurückgeben (.Add () -Methoden sind dafür berüchtigt), die Sie nicht verbrauchen, indem Sie Variablen oder Pipes auf Null setzen.
Sie müssen nur alle Punktbefehle löschen, die nicht den Variablen zugewiesen sind
%Vor%Was Ihre Frage angeht Warum? ... Lesen Sie Keith Hill's Blog: Wie funktioniert Powershell zurück?
Tags und Links powershell function return-value