it-frosch
Goto Top

Powershell Array auslesen - Verständnisfehler

Hallo Kollegen,

ich arbeite mich seit einiger Zeit in Powershell ein und habe heute wieder mal ein Problem wo ich wie der Ochs vor dem Tor stehe.

Ich lasse mir mittels einer SQL Funktion alle gruppen ausgeben die zu einem user gehören und schreibe diese in ein Array.
SQL Funktion:
CREATE FUNCTION [dbo].[FUNC_AUFGABEN](
@VARCHAR_1 varchar(20),
@VARCHAR_2 varchar(20)
)
RETURNS Table
AS
RETURN
SELECT gruppennr FROM table where pk.WINDOMAENE=@VARCHAR_1 and pk.BENUTZER=@VARCHAR_2) 
and gruppennr between 10001 and 10009
GO


Ergebnis:
$aufgaben

gruppennr
---------
    10001
    10002
    10003
    10004
    10005
    10006
    10007
    10008
    10009

Jetzt möchte ich das Array auswerten und in Abhängigkeit vom Vorhandensein jeder der 9 gruppen einen Schalter einblenden. Gedacht habe ich mir das so:
$aufgaben -is [array]
true

if ($aufgaben[0..9] -contains 10001) {'vorhanden'} else {'fehlt'}  

Als Ergebnis bekomme ich immer:
if ($aufgaben[0..9] -contains 10001) {'vorhanden'} else {'fehlt'}  
fehlt


Ich habe schon versucht anstatt der Zahl 10001 den String '10001' abzufragen aber selbes Ergebnis.
Irgendwie habe ich den Verdacht, dass ich das Array falsch anspreche.

Kann mir bitte mal jemand den Weg weisen?

grüße vom it-frosch

Content-ID: 73208362483

Url: https://administrator.de/forum/powershell-array-auslesen-verstaendnisfehler-73208362483.html

Ausgedruckt am: 22.12.2024 um 01:12 Uhr

zaphod88
zaphod88 24.09.2023 um 14:24:32 Uhr
Goto Top
Moin.

Probiers mal mit

$aufgaben.gruppennr -contains
it-frosch
it-frosch 24.09.2023 um 14:49:02 Uhr
Goto Top
@zaphod88

$aufgaben.gruppennr gibt es nicht.

Ich gebe hier mit SQL einen Table zurück habe aber keine Ahnung wie ich den ansprechen muss.

Trotzdem danke.
mayho33
mayho33 24.09.2023 um 15:51:18 Uhr
Goto Top
Zitat von @it-frosch:

@zaphod88

$aufgaben.gruppennr gibt es nicht.

Doch die gibt es, bzw. bekommst du ein Object mit dem Property "gruppennr". Siehe oben dein Ergebnis.

Wenn du dir nicht sicher bist welchen Typ dein Array hat kannst du das prüfen indem du angibst:
$meinArry.Gettype()

Ich gebe hier mit SQL einen Table zurück habe aber keine Ahnung wie ich den ansprechen muss.
Wie @it-frisch schon geschrieben hat.
Also so:
$aufgaben.gruppennr

#bsp:
$aufgaben | where-object {$_.gruppennr -match "10001"}  

#den Begrenzer [1..5] brachst du nicht, außer du willst nicht alle Elemente prüfen.
it-frosch
it-frosch 24.09.2023 um 16:07:36 Uhr
Goto Top
@mayho33,

$aufgaben.Gettype() bringt mir

$aufgaben.Gettype()

IsPublic IsSerial Name                                     BaseType                                                                                                                                                                                   
-------- -------- ----                                     --------                                                                                                                                                                                   
True     True     Object[]                                 System.Array    

was mir aber nicht wirklich weiterhilft.

Ich hatte jetzt mehr durch Zufall herausgefunden das ich bei der Eingabe von
$aufgaben[0]. plötzlich GROUPNR angezeigt bekomme, warum auch immer.

Die Lösung ist, das Array so auszulesen:
if ($aufgaben[0..9].GROUPNR -contains 10001) {'vorhanden'} else {'fehlt'}  
vorhanden


Wenn mir das jetzt noch jemand erklären könnte wäre es toll. face-smile

Grüße vom it-frosch
mayho33
mayho33 24.09.2023 um 16:59:22 Uhr
Goto Top
Zitat von @it-frosch:

@mayho33,

$aufgaben.Gettype() bringt mir

$aufgaben.Gettype()

IsPublic IsSerial Name                                     BaseType                                                                                                                                                                                   
-------- -------- ----                                     --------                                                                                                                                                                                   
True     True     Object[]                                 System.Array    

was mir aber nicht wirklich weiterhilft.
Im Prinzip hilft das schon, aber das ginge mit jetzt zu weit das zu erklären.


Ich hatte jetzt mehr durch Zufall herausgefunden das ich bei der Eingabe von
$aufgaben[0]. plötzlich GROUPNR angezeigt bekomme, warum auch immer.

Die Lösung ist, das Array so auszulesen:
if ($aufgaben[0..9].GROUPNR -contains 10001) {'vorhanden'} else {'fehlt'}  
vorhanden


Wenn mir das jetzt noch jemand erklären könnte wäre es toll. face-smile

Grüße vom it-frosch

Du musst den Begrenzer nicht angeben. Wäre ja quch total blöd wenn du die Elemente vorher zählen müsstest.

Bei deiner Frage oben hast du selbst die Rückgabe gepostet. Das ist das Objekt. Warum sollte jetzt plötzlich GROUPNR rauskommen?
7907292512
7907292512 24.09.2023 aktualisiert um 20:45:35 Uhr
Goto Top
Wie immer klärt das ganze
Get-Member sofort auf, welche Member ein Objekt tatsächlich besitzt ...
$aufgaben | Get-Member
Eigentlich eines der ersten CMDLets die man als Anfänger kennen sollte um sich selbst zu helfen.

Bei deiner Frage oben hast du selbst die Rückgabe gepostet. Das ist das Objekt. Warum sollte jetzt plötzlich GROUPNR rauskommen?
Weil es die Eigenschaften selbst gibt aber auch separate DisplaySpecifier die sich von den eigentlichen Eigenschaften unterscheiden können 😉,
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...
genauso wie man festlegen kann was per Default an Properties angezeigt wird
https://learn-powershell.net/2013/08/03/quick-hits-set-the-default-prope ...
Get-Member klärt das ganze aber sofort auf. Denke aber auch das das hier wohl PEBKAC war. Kann man hier ja leider nur raten weil der TO den Code der die Variable $aufgaben erzeugt, leider nicht gepostet hat.

Gruß sid
mayho33
Lösung mayho33 24.09.2023 um 22:41:40 Uhr
Goto Top
Zitat von @7907292512:
Bei deiner Frage oben hast du selbst die Rückgabe gepostet. Das ist das Objekt. Warum sollte jetzt plötzlich GROUPNR rauskommen?
Weil es die Eigenschaften selbst gibt aber auch separate DisplaySpecifier die sich von den eigentlichen Eigenschaften unterscheiden können 😉,
Na, das ist schon klar, aber die müssten entweder selbst definiert werden oder eben aufgrund der Rückgabe definiert sein. Etwa durch ein Flag. Sie ändern sich nicht einfach so.
Der TO hat oben ein Beispiel genannt mit dem wir gearbeitet haben.

Kann man hier ja leider nur raten weil der TO den Code der die Variable $aufgaben erzeugt, leider nicht gepostet hat.
Das stimmt. Nachdem er aber ein Beispiel der Ausgabe angegeben hat, isr es doch nicht falsch anzunehmen, dass genau das die Properties sind um die es geht oder?

Grüße, Mayho
it-frosch
it-frosch 25.09.2023 aktualisiert um 14:27:55 Uhr
Goto Top
@mayho33 @7907292512

Kann man hier ja leider nur raten weil der TO den Code der die Variable $aufgaben erzeugt, leider nicht gepostet hat.

Ich erzeuge so die Variable $aufgaben .

$aufgaben = (Invoke-Sqlcmd -ConnectionString "Data Source=$SqlServer; Initial Catalog=$Database; User Id=$SqlAuthLogin; Password =$SqlAuthPw ;Encrypt = false" -Query "select * from dbo.FUNC_BERECHTIGTE_AUFGABEN('$($user_dom)','$($user_name)')")  


So ist der Code der Funktion, falls das auch noch notwendig ist.

CREATE FUNCTION [dbo].[FUNC_BERECHTIGTE_AUFGABEN](
@VARCHAR_1 varchar(20),
@VARCHAR_2 varchar(20)
)
RETURNS @INFO Table(
GROUPNR int
)
AS

BEGIN
DECLARE @GROUPNR int;
DECLARE @ANZ int;
DECLARE @ZEIGER int;

SET @ANZ = (select count(*) from table1 where personalnr in (select pk.personalnr from table2 pk where pk.WINDOMAENE=@VARCHAR_1 and pk.WINBENUTZER=@VARCHAR_2) 
and gruppennr between 10001 and 10009)

SET @ZEIGER=10001

WHILE @ZEIGER<10010
	BEGIN
		SET @GROUPNR=(select gruppennr FROM table1 where personalnr in (select pk.personalnr from table2 pk where pk.WINDOMAENE=@VARCHAR_1 and pk.WINBENUTZER=@VARCHAR_2) 
		and gruppennr=@ZEIGER)
		IF (@GROUPNR is not NULL)
			BEGIN
				INSERT @INFO
				Select @GROUPNR
			END	
	SET @ZEIGER = @ZEIGER +1
	END

RETURN;
END;
GO


Wenn ich $aufgaben | Get-Member aufrufe bekomme ich:
$aufgaben | Get-Member



   TypeName: System.Data.DataRow

Name              MemberType            Definition                                                                                                                                                                                                    
----              ----------            ----------                                                                                                                                                                                                    
AcceptChanges     Method                void AcceptChanges()                                                                                                                                                                                          
BeginEdit         Method                void BeginEdit()                                                                                                                                                                                              
CancelEdit        Method                void CancelEdit()                                                                                                                                                                                             
ClearErrors       Method                void ClearErrors()                                                                                                                                                                                            
Delete            Method                void Delete()                                                                                                                                                                                                 
EndEdit           Method                void EndEdit()                                                                                                                                                                                                
Equals            Method                bool Equals(System.Object obj)                                                                                                                                                                                
GetChildRows      Method                System.Data.DataRow[] GetChildRows(string relationName), System.Data.DataRow[] GetChildRows(string relationName, System.Data.DataRowVersion version), System.Data.DataRow[] GetChildRows(System.Data.DataRe...
GetColumnError    Method                string GetColumnError(int columnIndex), string GetColumnError(string columnName), string GetColumnError(System.Data.DataColumn column)                                                                        
GetColumnsInError Method                System.Data.DataColumn[] GetColumnsInError()                                                                                                                                                                  
GetHashCode       Method                int GetHashCode()                                                                                                                                                                                             
GetParentRow      Method                System.Data.DataRow GetParentRow(string relationName), System.Data.DataRow GetParentRow(string relationName, System.Data.DataRowVersion version), System.Data.DataRow GetParentRow(System.Data.DataRelation...
GetParentRows     Method                System.Data.DataRow[] GetParentRows(string relationName), System.Data.DataRow[] GetParentRows(string relationName, System.Data.DataRowVersion version), System.Data.DataRow[] GetParentRows(System.Data.Dat...
GetType           Method                type GetType()                                                                                                                                                                                                
HasVersion        Method                bool HasVersion(System.Data.DataRowVersion version)                                                                                                                                                           
IsNull            Method                bool IsNull(int columnIndex), bool IsNull(string columnName), bool IsNull(System.Data.DataColumn column), bool IsNull(System.Data.DataColumn column, System.Data.DataRowVersion version)                      
RejectChanges     Method                void RejectChanges()                                                                                                                                                                                          
SetAdded          Method                void SetAdded()                                                                                                                                                                                               
SetColumnError    Method                void SetColumnError(int columnIndex, string error), void SetColumnError(string columnName, string error), void SetColumnError(System.Data.DataColumn column, string error)                                    
SetModified       Method                void SetModified()                                                                                                                                                                                            
SetParentRow      Method                void SetParentRow(System.Data.DataRow parentRow), void SetParentRow(System.Data.DataRow parentRow, System.Data.DataRelation relation)                                                                         
ToString          Method                string ToString()                                                                                                                                                                                             
Item              ParameterizedProperty System.Object Item(int columnIndex) {get;set;}, System.Object Item(string columnName) {get;set;}, System.Object Item(System.Data.DataColumn column) {get;set;}, System.Object Item(int columnIndex, System....
GROUPNR           Property              int GROUPNR {get;set;}  


Wenn ich in der ISE $aufgaben. eingebe bekomme ich nicht GROUPNR angeboten.
7907292512
Lösung 7907292512 25.09.2023 aktualisiert um 14:20:40 Uhr
Goto Top
Zitat von @it-frosch:
Ich erzeuge so die Variable $aufgaben .
OK!
Wenn ich $aufgaben | Get-Member aufrufe bekomme ich:
Works as designed du gibst ja selbst nur die Eigenschaft GROUPNR aus dem SQL-Clause in der DataRow zurück, also alles OK.
Select @groupnr

GROUPNR Property int GROUPNR {get;set;}

Es reicht also wie oben schon gesagt
if ($aufgaben.GROUPNR -contains 10001) {'vorhanden'} else {'fehlt'}  
oder alternativ auch
if (10001 -in $aufgaben.GROUPNR) {'vorhanden'} else {'fehlt'}  

Bitte dann noch den Haken dran.

sid,
it-frosch
it-frosch 25.09.2023 aktualisiert um 14:32:35 Uhr
Goto Top
@7907292512

mein Denkfehler war also gewesen, dass ich gedacht habe, was ich nicht angezeigt bekomme, das gibt es nicht. :D

Get-Member zeigt dir übrigends nichts wenn die Variable leer ist.
Das war wahrscheinlich eine weiterer Stolperstein.

Danke euch für die Mühe.

Grüße vom it-frosch
mayho33
mayho33 25.09.2023 um 18:24:11 Uhr
Goto Top
BEGIN
SET @GROUPNR=(select gruppennr FROM table1 where personalnr in (select pk.personalnr from table2 pk where pk.WINDOMAENE=@VARCHAR_1 and pk.WINBENUTZER=@VARCHAR_2) 
and gruppennr=@ZEIGER)
...
...

Aha! Und da findet sich ja auch die GruppenNr.
Aber Sql ist wirklich nicht meine Stärke. Keine Ahnung warum da gruppennr=@ZEIGER ...🤷‍♂️🤷‍♂️

Hauptsache es lüft jetzt 😁