Warum kann ich nicht call Enthält eine Methode aus meinem array?
Arrrg!Habe ich das, was ich fühle, ist eine dumme Frage mit einem einfachen script, das ich Schreibe, in der powershell. Ich bin auf ein sql-Befehl, der ruft eine gespeicherte Prozedur, mit der die Ergebnisse Stelle ich es ein array. Die Ergebnisse wie folgt Aussehen:
Status ProcessStartTime ProcessEndTime
------ ---------------- --------------
Expired May 22 2010 8:31PM May 22 2010 8:32PM
Was ich versuche zu tun, ist if($s.Contains("Expired"))
Berichts fehlgeschlagen. Einfach...? 🙁 Problem ist ich in ist wie es aussieht Enthält die Methode wird nicht geladen, da bekomme ich eine Fehlermeldung wie diese:
Methode-Aufruf ist fehlgeschlagen, da [System.Object[]] keine Elemente enthält, die eine Methode mit dem Namen 'Enthält'. Bei Zeile:1 char:12
+ $en.Enthält <<<< ("Abgelaufen")
+ CategoryInfo : InvalidOperation: (Enthält:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
So, was kann ich tun, um zu stoppen powershell aus entrollt es zu string? Tatsächliche ps-Skript -
$s = @(Invoke-Sqlcmd -Query "USE DB
GO
exec Monitor_TEST_ps 'EXPORT_RUN',NULL,20" `
-ServerInstance testdb002\testdb_002
)
if ($s.Contains("Expired"))
{
Write-Host "Expired found, FAIL."
}
else
{
Write-Host "Not found, OK."
}
InformationsquelleAutor xbnevan | 2010-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum Sie sehen, die Methode ist Get-Member powershell ist versucht hilfreich zu sein und abrollen der Sammlung. Wenn Sie ein array mit mehreren Arten von Elementen, zeigt es Ihnen die Mitglieder für jeden Typ (wie, wenn du 'ls' (Get-ChildItem), und es gibt FileInfos und DirectoryInfos in das Verzeichnis, das Sie sind, und leiten Sie ls | gm, es wird Ihnen zeigen Mitglieder von FileInfos und auch eine andere Gruppe von Mitgliedern, die von DirectoryInfos):
Dem, was ich normalerweise tun, um sicherzustellen, dass ich bin nicht auf der Suche an der ent-Mitglieder, versuchen Sie “$s".GetType().Name" zuerst, um zu sehen, was ich bin den Umgang mit. In deinem Fall ist es ganz klar und array, da Sie initialisiert es wie "$s = @(Invo" (@- = es ist ein array.)
Um herauszufinden, ob ein array ein Element enthält, können Sie mit der -operator "enthält" verwendet:
Ich glaube, du hast ein array von strings, so dass Sie können verwenden Sie ein string-literal, wie:
Aber wenn die abgelaufen ist nicht eine genaue übereinstimmung an (Sie waren auf der Suche für ein element enthält, abgelaufen, wie "Verbindung Abgelaufen 1/1/2010"), die Sie benötigen zu finden, entspricht, und überprüfen Sie die Anzahl, denke ich:
In diesem Fall, es ist nur ein Spiel, so powershell rollte es zu einem string. Ruck. Wenn es mehr als 1 entspricht, jedoch:
Nun ist es ein array.
Glücklicherweise beide Strings und Arrays haben eine length-Eigenschaft:
So können Sie die Länge Ihrer Ergebnisse, die "Abgelaufen", um zu sehen, ob es irgendwelche abgelaufen ist:
(vielleicht hat ja jemand einen besseren Weg, um zu überprüfen, ob eine collection ein Element enthält, dass satisifies einige Prädikat (wie LINQ ist?)
InformationsquelleAutor Chris Bilson
Einfach ausgedrückt, $s ein .NET array (bist du Verwendung
@()
sorgt) und man versucht, eine Methode aufzurufen (Enthält), die nicht existieren .NET-Typ.Der einfachste Weg, um Ihr problem zu lösen, ist die Verwendung der PowerShell
-contains
Betreiber, die die Vorteile der Arbeit mit arrays direkt und dabei Fall-insenstive vergleicht z.B.:Einfach und auf den Punkt. Genau das, was ich brauchte. Ich war die Entwicklung auf der PS 3-system dann versucht meinen code auf der PS 2. Ich habe diesen Fehler und das ist eine einfache Lösung um das Problem zu beheben.
InformationsquelleAutor Keith Hill