none
Function in Foreach-Object aufrufen RRS feed

  • Frage

  • Hallo, 

    ich habe folgendes Problem 

    ich möchte in dem Forach-Object Schleife eine Methode aufrufen. 

    $newValue = Get-Content $liste |ForEach-Object {$_.replace($my, $MeinVariable)}
    
    $replaced = Get-Content $liste |ForEach-Object {$_.replace($my, MeinMethode())}
    
     

    Wie oben sieht ich möchte in der Schleife die Methode aufrufen also statt MeinVaraible mochte ich da MeinMethode() stehen

    Ich glaube ich macht man mit Pipe oder so was aber habe ich keine Ahnung. 

    Kann mir jemand Helfen? 

    Vielen Dank im Voraus. 

    Donnerstag, 17. Dezember 2020 21:28

Antworten

  • So sieht aus meine Code womit ich ersetzen mochte.

    Du könntest auch noch eine Hilfsvariable verwenden:

    $DasZuErsetzendesWort = "Microsoft.ActiveDirectory.Management.ADPropertyValueCollection"
    
    $CSVFile = "C:\Users\Administrator\Documents\list.csv"
    $Value01 = 
    Get-Content $CSVFile  | 
    ForEach-Object { 
        $ErsatzString = "Neues Passwort"
        $_.replace($DasZuErsetzendesWort , $ErsatzString) 
    } 
    Set-Content -Path "C:\Users\Administrator\Documents\list.csv" -Value $Value01


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert Arbeiter Freitag, 18. Dezember 2020 15:07
    Freitag, 18. Dezember 2020 14:50

Alle Antworten

  • Hallo Arbeiter,

    da das Thema inhaltlich besser in das Forum "Powershell" passt, werde ich es dorthin verschieben.

    Vielen Dank für Dein Verständnis!

    Grüße,

    Michaela


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 18. Dezember 2020 09:43
    Moderator
  • Hier findest du ein Beispiel, wie du einer Variablen einen Funktionsaufruf mitgibst und dann ausführst:
    https://stackoverflow.com/questions/19849848/powershell-how-to-create-a-delegate

    D.h, dass du die $Action-Variable, die den Funktionskörper beinhaltet, dann einfach aufrufst.

    Freitag, 18. Dezember 2020 11:08
  • Ich versteh nicht wie in diesem Seite steht Bzw bei mir ist anders

    Ich habe Funktion random() ohne Übergabe Parameter

    [Action[String]]$meinVariable = {&random}

    und dann das habe ich in der replace Funktion $meinVariable.Invoke versucht

    Das ist eine von vielen was ich schon versucht habe. 

    Könntest du mir sagen wie ich in meinem Bespiel anwenden kann? 

     
    Freitag, 18. Dezember 2020 11:59
  • Im Prinzip, so wie das Bespiel beschreibt;-)

    [Action[int]]$action = {param($i) Write-Host "i is $i"}
    $action.Invoke(10)

    Das musst du dann analog als String definieren:

    [Action[string]]$action = {param($s) Write-Host "s is $s"}
    $var = "ABC"
    $action.Invoke($var)

    Der Typparameter von Action bezeichnet den zu übergebenen Typ an die Funktion, die du dann per "param" auslist.
    Statt eines bekannten Types kannst du auch z.B. "object" verwenden, wenn du komplexere Übergaben benötigst.
    Ich frage mich allerdings, warum du überhaupt variable Funktuionen/Methoden benötigst.

    Freitag, 18. Dezember 2020 12:14
  • [Action[string]]$action = &meinMethode

    ForEach-Object {$_.replace($my, $action.Invoke())}

    So ungefähr? Das funktioniert nicht 

    Invoke braucht auch eine Übergabe Parameter was soll ich da übergeben? 

    Freitag, 18. Dezember 2020 13:00
  • Dann verstehe ich deine Aufgabe nicht!
    &meinMethode ist ja kene Methode!
    Eine Methode ist beginnt mit { und endet mit }

    Was also genau willst du eigentlich tun?

    https://vexx32.github.io/2019/03/20/PowerShell-Replace-Operator/

    Freitag, 18. Dezember 2020 13:12
  • Ich mochte in dem CSV Datei Password Spalte mit zufällig generierte Passwörtern ersetzen 

    Weil da in dem Spalte jetzt shet so was "Microsoft.ActiveDirectory.Managment.ADPropertyValueCollectin"

    Diese Wörter mochte ich von dem Datei weg haben. 

    Und hoffentlich danach kann ich Benutzern einfach Anlegen.  

    Was soll ich Invoke Methode übergeben?
    • Bearbeitet Arbeiter Freitag, 18. Dezember 2020 13:23
    Freitag, 18. Dezember 2020 13:21
  • Ich mochte in dem CSV Datei Password Spalte mit zufällig generierte Passwörtern ersetzen

    Für CSV-Dateien ist Get-Content das falsche Werkzeug.

    Weil da in dem Spalte jetzt shet so was "Microsoft.ActiveDirectory.Managment.ADPropertyValueCollectin"

    Wie wär's, wenn Du uns den Code zeigst, wie Du zu der CSV-Datei kommst. Evtl. haben wir ja ne Idee, wie man das besser machen kann.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 18. Dezember 2020 13:39
  • Dann brauchst du das so nicht, sondern rufst direkt eine Function auf, die dir dann den Returnwert für den Replace liefert:

    $replaced = Get-Content $liste |ForEach-Object {$_.replace($my, MeineMethode($_))}
    
    function MeineMethode($text) 
    {
       // mach was
       $Ergebnis = .....
       return $Ergebnis
    }

    https://www.linetwork.de/powershell-funktionen/

    Freitag, 18. Dezember 2020 13:40
  • Hey Der Suchende, 

    Ich kenne dein Kanal bin ich auch Abonnent schon längst. 

    Du erzählst ganz gut.

    Meine Methode ist eine Radom Methode welche nur return Parameter hat und nicht Eingabe Parameter. Die Methode liefert  nur das sehr simple zufällig generiertes Passwörter. Was du mir vorgeschlagen hast diese Verbrauch ein Parameter. Das funktioniert nicht leider habe ich schon getestet.

    Diese Methode soll also auf jede durchlauf von Foreach-Object loop muss neues Passwort liefern. 

    Freitag, 18. Dezember 2020 14:01
  • Hier Auch   

    So sieht aus meine Code womit ich ersetzen mochte. 

                                             
    • Bearbeitet Arbeiter Freitag, 18. Dezember 2020 15:06
    Freitag, 18. Dezember 2020 14:10
  • So sieht aus meine Code womit ich ersetzen mochte.

    Das hatte ich verstanden. Ich meinte den Code, mit dem Du die CSV-Datei erzeugt hast.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 18. Dezember 2020 14:45
  • So sieht aus meine Code womit ich ersetzen mochte.

    Du könntest auch noch eine Hilfsvariable verwenden:

    $DasZuErsetzendesWort = "Microsoft.ActiveDirectory.Management.ADPropertyValueCollection"
    
    $CSVFile = "C:\Users\Administrator\Documents\list.csv"
    $Value01 = 
    Get-Content $CSVFile  | 
    ForEach-Object { 
        $ErsatzString = "Neues Passwort"
        $_.replace($DasZuErsetzendesWort , $ErsatzString) 
    } 
    Set-Content -Path "C:\Users\Administrator\Documents\list.csv" -Value $Value01


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert Arbeiter Freitag, 18. Dezember 2020 15:07
    Freitag, 18. Dezember 2020 14:50
  • So ungefähr erste Zeihe fehlt 

    War Code Hier :)

    Wenn ich das Password Atribut entfernen habe auch nicht diese Einträge aber danach weiß nicht mehr wie ich die Passwort Spalte anlege und  Zufällige Passwörter eingebe. 

    Oder einfach beim Importieren von Benutzern dann einfach diese Methode anwenden. 


    • Bearbeitet Arbeiter Freitag, 18. Dezember 2020 15:06
    Freitag, 18. Dezember 2020 14:53
  • vxvxcDu könntest auch noch eine Hilfsvariable verwenden:

    $DasZuErsetzendesWort = "Microsoft.ActiveDirectory.Management.ADPropertyValueCollection"
    
    $CSVFile = "C:\Users\Administrator\Documents\list.csv"
    $Value01 = 
    Get-Content $CSVFile  | 
    ForEach-Object { 
        $ErsatzString = "Neues Passwort"
        $_.replace($DasZuErsetzendesWort , $ErsatzString) 
    } 
    Set-Content -Path "C:\Users\Administrator\Documents\list.csv" -Value $Value01

    Also eine riesen Dank mein virtualer Helfer. Das funktioniert Einwandfrei.

    Ich muss jetzt noch Import Skript und noch ein Skript um die Benutzern in der Gruppen zu einteilen schreiben.

    Ich werde noch heute noch was Posten.  

    Freitag, 18. Dezember 2020 15:12