Jump to content

Powershell: ForEach in Function frühzeitig verlassen


Direkt zur Lösung Gelöst von BOfH_666,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

ich hab eine größere PS die u.a. aus einer CSV ein paar Spalten ausliest. Aus der großen PS rufe ich den Import in einer eigenen Function auf:

 

$LehrgangNo = Lehrgang($PathToFile2)
Write-Host $LehrgangNo
#Und so weiter und so weiter

 

Function Lehrgang([string]$Path) {
    
    #Diese Funktion liest den Namen, das Datum von und bis des Lehrganges aus, dessen User importiert werden sollen.
        $int = 0
        
        import-csv -path $Path -Delimiter ';' | foreach {
        $int = $int + 1
        $Von = $_."von"
        $Bis = $_."bis"

        #Ausstieg bei zweiter Zeile.
        if($int -eq 2)
           {
            #Rückgabe an die aufrufende Variable.
            return "$Lehrgang+$V+$B"
            }

        #Lehrgangsbezeichnung, Leerzeichen entfernen
        $Lehrgang = $_.Lehrgangsnummer
        $Lehrgang= $Lehrgang.Replace(" ","")
        
        #Von Datum, Jahr, Monat und Tag extrahieren
        $VonJahr = $Von.substring($von.Length-4)
        $VonMonat = $von.Substring(3,2)
        $VonTag = $Von.Substring(0,2)

        #Bis Datum, Jahr, Monat und Tag extrahieren
        $BisJahr = $Bis.substring($Bis.Length-4)
        $BisMonat = $Bis.Substring(3,2)
        $BisTag = $Bis.Substring(0,2)

        #Zusammensetzen.
        $V = $VonJahr+$VonMonat+$VonTag
        $B = $BisJahr+$BisMonat+$BisTag
        
     }#import-csv -path $Path -Delimiter ';'| foreach {
    
    return $Lehrgang+$V+$B

    }#ENDE Function Lehrgang([string]$Path) {

 

Ich möchte die foreach Schleife frühzeitig verlassen, trotz Return xxx geht es munter bis zum Schluss weiter. Hat jemand einen Tipp?

 

Vielen Dank schon im Voraus.

 

bearbeitet von Sunny61
Link zu diesem Kommentar

... schon mit break versucht?

 

Vielleicht gibt es ja auch einen besseren Weg. Eine Schleife vorzeitig zu verlassen, fühlt sich für mich immer wie Koitus Interruptus an .... ich versuch's zu vermeiden.  ;-)  Wenn Du sowieso nur die ersten beiden Zeilen verarbeiten möchtest, kannst Du doch mit Select-Object -First 2 prima die Ausgabe darauf einschränken und brauchst nicht hinterher solche Klimmzüge machen.  ;-);-):D

bearbeitet von BOfH_666
Link zu diesem Kommentar

Im empfohlenen Link ist "break" beschrieben. In deinem Code sehe ich nur "return"

 

Warum liest du immer nur zwei Zeilen und brichst dann ab?

 

Warum nutzt du das Datum nicht als Datum, sondern baust kompliziert Texte zusammen?

 

Kannst du mal die ersten paar Zeilen aus der csv zeigen? Irgendwie fehlt mir die Idee was du überhaupt damit anstellen willst.

bearbeitet von tesso
Link zu diesem Kommentar

Danke für die Antworten. ;)

 

@BOfH_666

Break hatte ich auch vorher schon versucht, jetzt nochmal. Dabei bleibt der Prozess einfach nur stehen, sonst nichts.

An welcher Stelle müsste das Select-Object -First 2 dann hin? Aus https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object?view=powershell-6

werde ich nicht schlau.

 

In der CSV sind u.a Usernamen und Lehrgangsnummern, von und bis Datum. Ich brauche daraus die Lehrgangsnummer und mit dem formatierten Datum wird der Name einer OU erstellt. Die OU wird erstellt, die User in der OU angelegt. Das ist der Sinn dahinter. Leider werden die CSV noch manuell ergänzt, dann ist im Feld Lehrgangsnummer nichts drin oder es steht etwas unbrauchbares drin. Deshalb reichen mir die ersten 1 od. 2 Zeilen aus. Ich schau mir jeden anderen Weg sehr gerne an.

 

Die OU heißt dann z.B: L47112019022320190427 Deshalb wird das Datum so kompliziert formatiert.

bearbeitet von Sunny61
Link zu diesem Kommentar
  • Beste Lösung

Oooops ... ich muss zu meiner Schande gestehen, dass ich aufgrund der Fragestellung gar nicht genau hingeschaut hatte. Mit break kann man, wie man auch in der Hilfe nachlesen kann, nur aus Loops oder Swich-Statements ausbrechen (also For, While, Do oder Foreach - Loops). Foreach-Object gehört da nicht dazu ...  genau deswegen plädiere ich immer dafür in Scripten so ausführlich wie möglich zu coden und Aliasse auf jeden Fall zu vermeiden.

Aber wie schon erwähnt ... es gibt eine andere Lösung:

Import-Csv -Path $Path -Delimiter ';' | Select-Object -First 2

... wirft nur die ersten beiden Zeilen der CSV-Datei aus.

 

Davon abgesehen, bin ich auch bei tesso. Der Code sieht umständlich aus. Vielleicht lässt Du uns mal ein paar Zeilen Deiner CSV-Datei sehen (natürllich um sensible Informationen bereinigt) und erklärst kurz, was das eigentliche Ziel ist. Da kann man bestimmt was verbessern.  ;-):D

 

Edit:

Noch vergessen - Thema Datum formatieren:

Get-Date -Format 'yyyyMMdd'

;-):D

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor einer Stunde schrieb BOfH_666:

Aber wie schon erwähnt ... es gibt eine andere Lösung:


Import-Csv -Path $Path -Delimiter ';' | Select-Object -First 2

... wirft nur die ersten beiden Zeilen der CSV-Datei aus.

Danke, das probier ich morgen gleich mal aus. Jetzt hab ich es auch verstanden. ;)

 

vor einer Stunde schrieb BOfH_666:

Davon abgesehen, bin ich auch bei Sunny61. Der Code sieht umständlich aus. Vielleicht lässt Du uns mal ein paar Zeilen Deiner CSV-Datei sehen (natürllich um sensible Informationen bereinigt) und erklärst kurz, was das eigentliche Ziel ist. Da kann man bestimmt was verbessern.  ;-):D

 

Edit:

Noch vergessen - Thema Datum formatieren:


Get-Date -Format 'yyyyMMdd'

Was ist an der ForEach Schleife umständlich? An dieser Stelle reicht mir die Nummer und das Datum von und bis völlig. Anschließend wird die OU angelegt, im nächsten Schritt dann die User in der OU. Das gezeigte ist nur ein kleiner Teil des Ganzen. ;) Außerdem ist die Schleife morgen vermutlich Geschichte. In der CSV steht ein Datum, das formatiere ich um, das aktuelle Datum brauch ich nicht.

bearbeitet von Sunny61
Link zu diesem Kommentar

... ich meinte, dass ich bei tesso bin ...  ;-)

Zitat

 das aktuelle Datum brauch ich nicht.

Das war doch nur ein Beispiel :shock2::aha2: ... natürlich nimmst Du das Datum aus der CSV-Datei  ... Du kannst jedes beliebige Datum benutzen ... z.B. so

$BeipsielDatumAusDerCSVDatei = '31.12.2018'
Get-Date -Date $BeipsielDatumAusDerCSVDatei -Format 'yyyyMMdd'

Das meinte ich mit "umständlich" ... Du brauchst viele Zeilen Code und könntest vieles stark verkürzen ...  statt

$Lehrgang = $_.Lehrgangsnummer
$Lehrgang= $Lehrgang.Replace(" ","")

... genügt z.B. auch eine Zeile ...

$Lehrgang = $_.Lehrgangsnummer -replace '\s*'

...

Musst Du das Datum für jeden einzelenen User zusammenbauen oder gilt das Datum für alle User eines Lehrgangs?  ;-)

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor einer Stunde schrieb daabm:

Olaf, laß ihm doch die Chance, sich auf einer Lernkurve zu verbessern.

Na darum ging's mir doch ... war ich zu subtil?  :D

vor einer Stunde schrieb daabm:

Ich hab vor ner Woche auch Code von mir angeschaut, den ich vor 2 Jahren produziert habe. Oha.... :-) Splatting war mir damals noch fremd, also Backticks :-( Nur ein Beispiel...

Das kenn' ich. Wenn ich mir meine ganz alten Sachen angucke, denke ich mir manchmal nur "Gott sei Dank sieht das niemand außer mir selbst"  ;-):D

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...