vargsvart
Goto Top

PowerShell Variablenname in einer Schleife hochzählen - geht das?

Guten Tag,

um User aus einer .csv ins Active Directory einzufügen, soll ich ein PowerShell Skript erstellen. Dieses habe ich auch soweit erledigt, nur möchte ich es etwas "verschönern".

Ich habe fünf Variablen, welche $Gruppe1 - 5 heißen, in welchen die Gruppen der einzelnen User hinterlegt sind um diese anzulegen.
Sollte die Gruppe noch nicht existieren, wird sie angelegt, ansonsten wird mit der nächsten Gruppe weiter gemacht.

Nun möchte ich gerne, anstatt für jede Gruppe eine eigene Schleife zu erstellen, alles in einer erledigen.

Dies soll theoretisch so aussehen:


$j = 1
	 #Solange $j !=5 ist, soll die Schleife durchlaufen werden
	while($j -ne 5)
	{
		#$G soll aus $Gruppe + Wert von $j zusammengesetzt werden und dadurch 
		#dann die Variablen $Gruppe1 - 5 bilden, welche die Gruppennnamen enthalten
		$G = $Gruppe+$j[$i]
		#$error auf null setzen
		$error = $null
		#Überprüfen ob Gruppe bereits existiert
		$nul = [ADSI] "LDAP://testsrvas1/CN=$G,CN=Users,DC=testad,DC=int"  
		#Wenn nicht, Gruppe anlegen
		if($error)
		{
			$NewGroup = $AD.Create("group", "CN=$G")  
			$NewGroup.psbase.InvokeSet("groupType", -2147483648 + 2)  
			$NewGroup.SetInfo()
			#$j um 1 erhöhen
			$j++
		}
		#Existiert Gruppe bereits, $j um 1 erhöhen
		else{$j++}
	}
	#$i ist der Wert, der den aktuell zu erstellenden User bestimmt und wird 
	#innerhalb einer übergeordneten Schleife erhöht
	$i++

Bitte bedenkt, dass das so nicht funktioniert und ich gerne wissen würde ob (und wenn ja, dann wie) das funktionieren könnte.

Ich bedanke mich jetzt schon einmal bei jedem der versucht zu helfen.

Gruß

Varg

Content-Key: 144278

Url: https://administrator.de/contentid/144278

Printed on: April 25, 2024 at 23:04 o'clock

Mitglied: 77559
77559 Jun 07, 2010 at 10:41:07 (UTC)
Goto Top
Hallo Varg,

dein Vorhaben erinnert aber mehr an c als an powershell.

$varname = '_test'  
for ($cnt=1; $cnt -le 5; $cnt++)
  {$cnt | select -outvariable $varname$cnt >$Null}

ls variable:$varname* | sort name
Ausgabe
Name                           Value
----                           -----
_test1                         {1}
_test2                         {2}
_test3                         {3}
_test4                         {4}
_test5                         {5}

Die Idee stammt aus diesem Blog

Gruß
LotPings
Member: Vargsvart
Vargsvart Jun 07, 2010 at 11:03:01 (UTC)
Goto Top
Das klingt schon mal ganz gut, aber wie könnte ich damit dann realisieren, dass der Inhalt der "hochgezählten" Variable verwendet wird?

Also im Ansatz so:

$G = 'Gruppe'  

$Gruppe1 = "Oh"  
$Gruppe2 = "du"  
$Gruppe3 = "schöne"  
$Gruppe4 = "neue"  
$Gruppe5 = "Welt"  

for($i = 1; $i -le 5; $i++)
{
	$i | select -outvariable $G$i >$Null
	
	#Hier soll eine Ausgabe der Variablen
	#$Gruppe1 bis $Gruppe5 stehen
	
}
Mitglied: 77559
77559 Jun 07, 2010 at 11:20:30 (UTC)
Goto Top
Äh,
die Schleife in Z09-Z11 überschreibt doch die Variableninhalte mit dem Zähler.

Ersetze Zeile 9 einfach mit
ls variable:$G* |sort name| foreach {echo $_.value}
Oder, wenn es in einer Zeile stehen soll.
$Ausgabe = ""  
ls variable:$G* |sort name| foreach {$Ausgabe = $Ausgabe+$_.value+" "}  
$Ausgabe

Edit: gezielter wäre der Zugriff per Schleife auf den Variablen-Inhalt mit Get-Item (der sort ist bei mehr als 10 Werten nicht numerisch)
$G = 'Gruppe'  

$Gruppe1 = "Oh"  
$Gruppe2 = "du"  
$Gruppe3 = "schöne"  
$Gruppe4 = "neue"  
$Gruppe5 = "Welt"  

$Ausgabe = ""  
for ($i=1; $i -le 5; $i++){get-item variable:$G$i | foreach{ $Ausgabe+=$_.value+" "}}  
$Ausgabe

Gruß
LotPings
Member: Vargsvart
Vargsvart Jun 07, 2010 at 11:56:00 (UTC)
Goto Top
Auch hierfür bedanke ich mich schon einmal.

Leider bringt dies immer noch nicht das gewünschte Ergebnis, bzw. komme ich nicht dazu es richtig anzupassen.

In der Realität handelt es sich bei Gruppe1 bis 5 ja um Arrays (Es tut mir leid, falls dies vorher nicht offensichtlich war). Also sollte die Schleife in etwa so aussehen:

$Gruppe1 = "Oh","Dies"  
$Gruppe2 = "du","ist"  
$Gruppe3 = "schöne","ein"  
$Gruppe4 = "neue","kleiner"  
$Gruppe5 = "Welt","Test"  

for($i = 0; $i -le 1; $i++)
{
ls variable:$G* | foreach {echo $_.value[$i]}
}

Dies bringt mir zwar das Gewünschte Ergebnis, allerdings umrandet von einer Menge, für mich nicht nachvollziehbaren, Fehlermeldungen und wirren Ausgaben.
Mitglied: 77559
77559 Jun 07, 2010 at 12:11:42 (UTC)
Goto Top
Wenn ich bei dieser Variante vorne noch $G = "Gruppe" einfüge und in Zeile 09 den sort name dazwischenschiebe bekomme ich hier diese Ausgabe:
(Ich fange immer mit einer neuen Shell an, um Seiteneffekte alter Variableninhalte auszuschließen)
Oh
du
schöne
neue
Welt
Dies
ist
ein
kleiner
Test

Gruß
LotPings
Member: Vargsvart
Vargsvart Jun 07, 2010 at 12:16:24 (UTC)
Goto Top
Ja, du hast Recht! So funktioniert es (auch ohne "sort name").

Ich frage mich grad nur noch warum das $G = "Gruppe" den gewünschten Effekt bringt?
Wir verwenden es doch garnicht, oder?

Vielen, vielen Dank!
Mitglied: 77559
77559 Jun 07, 2010 at 12:40:12 (UTC)
Goto Top
Zitat von @Vargsvart:
Ich frage mich grad nur noch warum das $G = "Gruppe" den gewünschten Effekt bringt?
Wir verwenden es doch garnicht, oder?
Doch im ls .

Um das Thema abzuschliessen, hier mal ein Vergleich (bei mir ist der sort nötig, aber Variante 3 mit get-item ist sowieso vorzuziehen).

# C:\Test\2010-06\07\Test.ps1
$G = "Gruppe"  
$Gruppe1 = "Oh","Dies"  
$Gruppe2 = "du","ist"  
$Gruppe3 = "schöne","ein"  
$Gruppe4 = "neue","kleiner"  
$Gruppe5 = "Welt","Test"  
write-host -foregroundcolor yellow "---------- ohne Sort"  
for($i = 0; $i -le 1; $i++){
  $Ausgabe=""  
  ls variable:$G* | foreach {$Ausgabe+=$_.value[$i]+" "}  
  $Ausgabe
}
write-host -foregroundcolor yellow "---------- mit  Sort"  

for($i = 0; $i -le 1; $i++){
  $Ausgabe=""  
  ls variable:$G* | sort name | foreach {$Ausgabe+=$_.value[$i]+" "}  
  $Ausgabe
}
write-host -foregroundcolor yellow "---------- mit Get-Item statt ls variable:"  
for($i = 0; $i -le 1; $i++){
  $Ausgabe=""  
  for($j = 1; $j -le 5; $j++){
    Get-Item variable:$G$j | foreach {$Ausgabe+=$_.value[$i]+" "}  
  }
  $Ausgabe
}
PS C:\Test\2010-06\07> C:\Test\2010-06\07\Test.ps1
---------- ohne Sort
du schöne Welt neue Oh
ist ein Test kleiner Dies
---------- mit  Sort
Oh du schöne neue Welt
Dies ist ein kleiner Test
---------- mit Get-Item statt ls variable:
Oh du schöne neue Welt
Dies ist ein kleiner Test
PS C:\Test\2010-06\07>

Wenn alle Fragen geklärt sind, wäre es schön wenn du den Beitrag auf gelöst setzt.

Gruß
LotPings
Member: Vargsvart
Vargsvart Jun 07, 2010 at 13:01:25 (UTC)
Goto Top
Alle Fragen sind geklärt und damit ist das Thema gelöst. face-smile

So siehts nun übrigens aus:

	#Gruppen anlegen
	Get-Item variable:$G* | foreach `
	{
		$Grp = $_.value[$i]
		$error = $null
		$nul = [ADSI] "LDAP://testsrvas1/CN=$Grp,CN=Users,DC=testad,DC=int"  
		if(!($error))
		{
			$NewGroup = $AD.Create("group", "CN=$Grp")  
			$NewGroup.psbase.InvokeSet("groupType", -2147483648 + 2)  
			$NewGroup.SetInfo()
		}
	}

Ich bedanke mich für deine Hilfe.

Gruß

Varg