schnerpf

Powershell Array wird nicht richtig gefüllt

Hallo,
ich habe das Problem das mein Script abhängig von der Anzahl der gefunden Usern, das Array $CsvSortResult unterschiedlich füllt.
Wenn ich mehr als einen User habe tut, das Script was es soll. Habe ich nur einen User, wird der User "zerhackt"

$CsvSortResult=@(
				foreach($mem in $sortmembers) 
				{
                 			#Abfrage der Felder zu dem jeweiligen User aus der AD. Abgefragte Felder
					#in diesem Fall *name*, *samaccountname* und *distinguishedname*
					Get-ADObject -properties name, samaccountname, distinguishedname $Mem -Server $LDAPServer |
					## Ausgelesende Daten bekommen hier eine eigene Tabellenüberschrift (z.B. "Full Name" für den Namen) 
					Select-Object -property @{Name="Full Name";Expression={$_.Name}},  
                                                                               @{Name="Username";Expression={$_.samaccountname}},  
                                                                               @{Name="Distinguished Name";Expression={$_.distinguishedname}}   
				}
				)
$CsvSortResult.length
$CsvSortResult."Full Name"  
$CsvSortResult."Username"  
$CsvSortResult."Username"  
1
Muster Erwin Z12345
Z12345
Z

Ich erwarte anstelle von "Z" als Ausgabe von $CsvSortResult."Username", den vollständigen Usernamen "Z12345".
Was übersehe ich? Für jeden Hinweis dankbar.
Schnerpf
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 665088

Url: https://administrator.de/forum/powershell-array-wird-nicht-richtig-gefuellt-665088.html

Ausgedruckt am: 12.05.2025 um 06:05 Uhr

Doskias
Doskias 24.03.2021 um 16:11:06 Uhr
Goto Top
Moin,

es ist schwer deinen Posting zu verstehen. Benutze bitte Code-Tags damit wir besser sehen wo dein Code endet und wo das Ergebnis beginnt.

Allerdings verstehe ich nicht ganz was du meinst. Wenn $CsvSortResult."Username" nur Z ergibt, dann liegt es ggf. daran, dass du nur einen Wert in deiner Abfrage hast.

$var=gc C:\Temp\Test\test.txt
$var
Gibt das erste Zeichen an, solange in test.txt nur die erste Zeile beschrieben ist.

Enthält die Textdatei jedoch mehrere Zeilen, so gibt die gleiche Ausgabe die komplette Erste Zeile wieder. Denke du hast hier das selbe Verhalten, nur anders dargestellt.

Gruß
Doskias
MrCount
MrCount 24.03.2021 um 16:56:46 Uhr
Goto Top
Den vollständigen Usernamen hast du doch in

$CsvSortResult."Username"  


Mit
$CsvSortResult."Username"  
greifst du auf das erste Zeichen des Username zu.
Schnerpf
Schnerpf 25.03.2021 um 09:00:32 Uhr
Goto Top
Grüß Dich Doskias,
Du beschreibst genau mein Problem. Ich kann noch nicht genau sagen wann ich zum testen komme,
aber ich denke das ist genau mein Verständnisproblem. Ich melde mich wieder.
Vielen Dank.
Den Codeblock habe ich jetzt gesetzt.

Gruß, Schnerpf
Schnerpf
Schnerpf 26.03.2021 um 11:27:52 Uhr
Goto Top
Also da eigentliche Problem ist noch nicht gelöst.
Ich habe mittlerweile verstanden, das Powershell mit Arrays anders umgeht, als z.B. Perl.
Ich kann zwar jetzt Felder korrekt abfragen, aber weiter verarbeiten kann ich diese immer noch nicht, da mein eigentliches Problem immer noch besteht. Wie kann ich Powershell dazu bewegen, eine Variable immer als Array anzusehen?
Wenn ich ein ein gewünschtes Array nur mit einem Wert fülle, dann zerlegt mir diesen einen Wert, der eigentlich als ein Feld im Array zu betrachten ist, in viele Felder.
Hintergrund ist das ich eine "schöne" Ausgabe mit Usernamen haben will, die nach allen 10 Usern einen Zeilenumbruch hinzufügt.
Das Skript dazu funktioniert ohne Probleme, solange von der Abfrage mehr als ein User zurück kommt. Dann habe ich das oben beschriebene Problem. Ich könnte jetzt als Workarround das zu betrachtende Array standardmäßig immer mit einem Wert vorbelegen, dann die passenenden Abfragen Außen herum bauen, aber gefällt mir nicht.

$j=0
$Seperator = ";"  
$Glueline = ""  
for ($i=0; $i -lt $CsvSortResult.Username.Length; $i++)
    {
        #Nach 10 gefundenen Usern wird ein Zeilenumbruch eingebaut
        $j++       
        #echo $CsvSortResult.Username[$i]
        If ($j -eq 10)
            {
                $Glue = -join($CsvSortResult.Username[$i],$Seperator)
                $Glueline = -join($Glueline,$Glue) 
                #Ausgabe Monitor
				Write-Host $GlueLine
				#Ausgabe Datei
				Write-Output $GlueLine >> $Ausgabe
                #Write-Host -NoNewline ";" 
                $j=0; $GlueLine= ""                          #Zurücksetzen Zähler und auszugebende Zeile  
            }
        else
            {  
                $Glue = -join($CsvSortResult.Username[$i],$Seperator)
                $Glueline = -join($GlueLine,$Glue)
                #Write-Host "Glueline $Glueline" 
                #Write-Host -NoNewLine "."             
			}
		#In der Ausgabe alle 60 Zeichen ein CRLF
		$NewZeile = $i % 60
		if ($NewZeile -eq 0)
		{ 
         echo ""     
		}
    }

#Ausgabe Monitor angefangene Zeile
Write-Host $Glue

#Modulo Datensätze
#Hier wird überprüft ob die letzte Zeile noch angehängt werden muss, da diese weniger als 10 Datensätze enthält
$Mo = $j % 10
if ($Mo -ne 0)
{ 
    Write-Output $GlueLine >> $Ausgabe  
}
Doskias
Doskias 26.03.2021 um 12:24:02 Uhr
Goto Top
Ich kenne Perl nicht, daher kenne ich den Unterschied nicht. Der Trick ist deine Variable als Array zu definieren. Wenn du einfach die variable vewendest interpretiert PS diese nach dem jeweiligen ermessen. Da kann es dann zu unterschieden kommen. Gut erklärt hier:
https://blog.netwrix.de/2019/12/19/variablen-und-arrays-in-powershell/