Zum Inhalt wechseln


Foto

Codebeispiele + Erklärungen für foreach


  • Bitte melde dich an um zu Antworten
27 Antworten in diesem Thema

#1 schreckinger

schreckinger

    Junior Member

  • 73 Beiträge

 

Geschrieben 15. März 2012 - 07:37

Hallo Gemeinde

Meine Frage:

Besitzt jemand von euch einfach Codebeispiele für die Foreach Schleife + kleiner Erklräung

Wäre sehr dankbar dafür daher ich noch nicht dahinter gekommen bin wie diese Schleife funktioniert.

Danke

lg schreckinger

#2 PowerShellAdmin

PowerShellAdmin

    Board Veteran

  • 1.135 Beiträge

 

Geschrieben 15. März 2012 - 07:50

foreach($object in $ADuser)
{
$object.samaccountname
}

$ADUser ist eine Arrayliste die alle AD Benutzer enthält.
Die Foreachschleife arbeitet jetzt bei jedem Durchlauf ein Benutzer - bis EOF (bis Ende ist)- durch.
Der Inhalt wird in das Objekt $object geladen.
Im Schleifenkörper gebe ich den jeweiligen Samaccountname aus

Hinweis: $object wird bei jedem Durchlauf neu generiert und verfällt danach. Möchte man sich z.B. Daten raussuchen und aufbereiten, dann muss man diese wieder z.B. in eine Arrayliste oder anderes Listenobjekt schreiben.

about_Foreach - PowerShell

Ich sage das nur ungern, aber da gibt es zuhauf Informationen, ein wenig eigen Engagement kann man schon erwarten oder ? :)

#3 schreckinger

schreckinger

    Junior Member

  • 73 Beiträge

 

Geschrieben 15. März 2012 - 08:34

Hallo danke erstmals für deine Antwort.

Ja der Fleiß fehlt sicher nicht, bin die ganze Zeit daran am Lernen von dieser Powershell.

Aber zur Info ich komme aus dem Linux Bereich / Monitoring und daurch ich einen Jobwechsel machte, müss ich jetzt Powershell können.

Aber mit den erklärungen aus dem Netz ist es halt immer so eine Sache.

Bin wirklich dankbar wenn du dir ein wenig Zeit nimmst und mir die wichtigsten Dinge beibringst. Wäre auch bereit dich dafür zu entschädigen.
In Form von Hilfe bei anderen Dingen oder mit einer Paysafe Karte. :)

Folgendes.

Ich soll nämlich ein Script schreiben:

ich soll einen Odrner der auf C:\Filetyp liegt mit einem Ordner auf \\fileserver01\filetyp abgleichen.
Die Dateien sollen nach folgenden Punkten ausgewählt werden.
Also nur *.txt *.doc *.ppt sollen abgelichen werden.
Dann sollen alle Datei von C:\filetyp auf den Server kopiert werden.
Aber nur die Dateien die dem Fileserver fehlen
$a = dir -Path C:\\filetyp
# In der Variablen a steht jetzt der Inhalt vom Ordner 
$b = dir -Path \\fileserver\filetyp
# In der Variablen b steht jetzt der Inhalt vom Netzlaufwerk

Compare-Object -ReferenceObject $a -DifferenceObject $b | Format-Table
#diff -includeequal -excludedifferent -ReferenceObject ($a -r) -DifferenceObject ($b  -r)

$src = $a
$dst = $b

move-item -recurse $src $dst


Nur so wie ich mir das gedacht habe funktioniert das nicht.

Aufjedenfall wäre ich für Hilfe sehr dankbar.

Hoffentlich ist es verständlich geschrieben
Lg Schreckinger

#4 Dukel

Dukel

    Board Veteran

  • 9.240 Beiträge

 

Geschrieben 15. März 2012 - 09:04

Mache doch bei deinem Urspungsthread weiter:
http://www.mcseboard...ken-184912.html

Vielleicht ist es auch sinnvoller mit etwas abstrakten und keinem konkreten Problem anzufangen.

Willst du primär Powershell lernen oder dein Problem lösen?

#5 schreckinger

schreckinger

    Junior Member

  • 73 Beiträge

 

Geschrieben 15. März 2012 - 09:09

Hallo

Ich möchte Powershell können / verstehen / nutzen.

Aber mein Primäresziel ist es das Problem so schnell wie möglich zu lösen.

Ich glaube wenn ich ein dieses Beispiel gelöst ist, werde ich sicher mehr verstehen, daher ich dann mal sehe wie genau der Abgleich funktioniert.

Das Problem daran ist das mein Arbeitsgeber das Script schon benötigt und ich mich persönlich ein bisschen aus dem Fenster gelegt habe und ihm zuversichert habe das ich das Script bis am Freitag habe.

Mir geht einfach noch der Zusammen hang ein bisschen ab.
Oder besser gesagt die Richtige schreibweise.
ich glaube mein Script unten im Anhang ist schon mal nichtso flasch ?

Das mit neuen Thread dachte ich ist normal das man wieder einen neuen anlegt ? Sorry wird nicht wieder vorkommen...

#6 Dukel

Dukel

    Board Veteran

  • 9.240 Beiträge

 

Geschrieben 15. März 2012 - 09:34

Wenn's ums gleiche Thema geht (dieses Script) kann man das ruhig im selben Thread machen.
Um Tipps zum Powershell lernen oder ähnliches machen kannst du gerne einen neuen Thread aufmachen.

Ich würde das Script folgendermaßen machen:

#Quelle
$src = "C:\etc"
#Ziel
$dst = "D:\temp\etc"

#Schleife über Dateisystem. -iclude definiert die Dateitypen, die durchsucht gehören
foreach($file in (Get-ChildItem $src -Recurse -include *.xml,*.exe)){

	#Dateiname im Ziel
	$dstfile = $file.FullName.replace("$src","$dst")

	#Ordner im Ziel
	$dstfolder = $dstfile.split('\')[0..($dstfile.split('\').length-2)] -join '\'

	#Testen ob diese Datei NICHT existiert
	if(!(test-path $dstfile)){

		#Testen ob ein Ordner existiert
		if(!(test-path $dstfolder)){

			#Wenn er nicht existiert, dann an anlegen
			new-item $dstfolder -type directory -recurse

		}

		#Wenn die Datei nicht existiert von der Quelle kopieren
		copy-item $file.FullName $dstfolder
				
	}
}


#7 schreckinger

schreckinger

    Junior Member

  • 73 Beiträge

 

Geschrieben 15. März 2012 - 09:44

Okay danke, i probier das gleich mal aus mit deinem Script.

Und nohcmals ein Fettes DANKE genau so erklärt das ich es Verstehen kann :D

DANKE DANKE


Aber ich bin sehr Wissen gierig :D

Frage:

#Ordner im Ziel
$dstfolder = $dstfile.split('\')[0..($dstfile.split('\').length-2)] -join '\'

was macht dieser Befehl ?

Als erster defierst du dir die Varaible dstfolder und dann müss ich ehrlich sagen Bahnhof ? machst du ihr eine vergleich oder wie ?

Und wie gesagt besten dank;)

#8 schreckinger

schreckinger

    Junior Member

  • 73 Beiträge

 

Geschrieben 15. März 2012 - 10:40

Ein Problem hat sich mir noch aufgtan.

Also beim Befehl:

if(!(test-path $dstfile))

spring er mir immer raus ?
Frage für was steht das ! in der ersten Klammer....

danke

#9 Dukel

Dukel

    Board Veteran

  • 9.240 Beiträge

 

Geschrieben 15. März 2012 - 10:55

! heißt "nicht".
D.h. wenn der Pfad NICHT existiert, dann soll er das im If Zweig machen.

Das Code Stück $dstfile.split('\')[0..($dstfile.split('\').length-2)] -join '\' entfernt aus dem kompletten Pfad mit Dateinamen den Dateinamen so dass nur noch der Pfad übrig bleibt.

#10 blub

blub

    Moderator

  • 7.605 Beiträge

 

Geschrieben 15. März 2012 - 11:12

Das Code Stück $dstfile.split('\')[0..($dstfile.split('\').length-2)] -join '\' entfernt aus dem kompletten Pfad mit Dateinamen den Dateinamen so dass nur noch der Pfad übrig bleibt.


ginge auch mit "split-path -parent"
Split-Path

blub

Ein Kluger bemerkt alles, Ein Dummer macht über alles eine Bemerkung. (Heinrich Heine)


#11 Dukel

Dukel

    Board Veteran

  • 9.240 Beiträge

 

Geschrieben 15. März 2012 - 11:53

Stimmt. Damit geht das auch. Split-Path kannte ich bisher noch nicht.

#12 schreckinger

schreckinger

    Junior Member

  • 73 Beiträge

 

Geschrieben 15. März 2012 - 13:34

was ich noch nicht daran verstehe

#Quelle
$src = "C:\Benutzer\filetyp"
#Ziel
$dst = "\\fileserver01\filetyp"

#Schleife über Dateisystem.
foreach($file in (Get-ChildItem $src -Recurse -include *.txt,*.doc,*.ppt)){

	#Dateiname im Ziel
	$dstfile = $file.FullName.replace("$src","$dst")

	#Ordner im Ziel
	$dstfolder = $dstfile.split('\')[0..($dstfile.split('\').length-2)] -join '\'

	#Testen ob diese Datei NICHT existiert
	if(!(test-path $dstfile)){

		#Testen ob ein Ordner existiert
		if(!(test-path $dstfolder)){

			#Wenn er nicht existiert, dann an anlegen
			new-item $dstfolder -type directory -recurse

		}

		#Wenn die Datei nicht existiert von der Quelle kopieren
		copy-item $file.FullName $dstfolder
				
	}
}

aber ab der ersten if schleife bliebt er mir hängen ? Also ich verwende den PowerGUI Skript Editor dafür beim Schritt-weißen ausführe sehe ich es


eine weiter Frage stellt sich mir ?

Wie kann ich den am besten einen Fehlercode ermittelung einbauen sprich das er mir genau mit Protokoliert was er macht ?

Danke nochmals
:)

#13 Dukel

Dukel

    Board Veteran

  • 9.240 Beiträge

 

Geschrieben 15. März 2012 - 13:45

Was meinst du mit bleibt hängen? Kommt in der Konsole eine Fehlermeldung?

#14 schreckinger

schreckinger

    Junior Member

  • 73 Beiträge

 

Geschrieben 15. März 2012 - 14:00

Hallo

ja er spring mir ab der ersten if raus.

und kopiert wird auch nix ?

Obwohl ich die richten Quelle und Soruce ja angebe ?

Danke nochmals

#15 schreckinger

schreckinger

    Junior Member

  • 73 Beiträge

 

Geschrieben 15. März 2012 - 14:12

foreach($file in (Get-ChildItem $src -Recurse -include *.txt,*.doc,*.ppt)){
$dstfile = $file.FullName.replace("$src","$dst")
if(!(Test-Path $dstfile))
copy-item $file.FullName $dstfolder
}
Missing statement block after if ( condition ).
At line:4 char:1
+ <<<< copy-item $file.FullName $dstfolder
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingStatementBlock

Die Meldung bekomme ich wenn ich es dirket in der Powershell Konsole ausprobiere

Danke nochmals :)