none
Bestimmte Zeilen von einer TXT Datei in eine andere schreiben

    Frage

  • Hallo Zusammen

    Ich habe mich heute den ganzen Tag abgemüht mich in Powershell zurechtzufinden und mein kleines Problem zulösen. Ich kenne mich ein Stück weit mit Programmierung aus, grösstenteils ist das jedoch mit SPS, in ERP Systemen und anderen "einfachen" Programmiersprachen wie Fortran. Mein Problem hier übersteigt mein Wissen leider mehr als ich gedacht habe.

    Nun zum Problem. 

    Ich habe mehrere .txt Dateien aus 2 unterschiedlichen Systemen (cee1.txt, cee2.txt, etc. und aba1.txt, aba2.txt, etc  (die txt Dateien haben eine Lange nr. folge als Name, diese hier sind nur einfachheitshalber so bennant)) und eine Liste (liste.txt) in welcher steht welche Dateien zueinander gehören.

    Beispiel ABA1

    nr                           650123
    typ                         42
    subtyp                    3

    Beispiel CEE1

    topnr                       1800200593

    typa                         5

    typb                         2

    Liste

    aba1 cee1

    aba2 cee2

    aba3 cee3

    etc

    Ich versuche die Liste einzulesen und die einzelnen Zeilen zu trennen um damit die Dateien (cee & aba) einzulesen. Aus der cee1.txt sollen Zeilen die ein gewisses Kriterium erfüllen eingelesen und in einzelne Variabeln geschrieben werden.

    Die dazugehörige Datei aus dem zweiten System (aba1.txt) soll nun eingelesen werden. Mehrere Zeilen sollen nun mit Hilfe der Variabeln ersetzt werden. 

    Mit dem obigen Beispiel Inhalt müsste folgendes passieren: 

    Aus der cee1.txt werden die variablen $topnr = topnr                       1800200593, $typa = typa                         2 erstellt.

    Diese sollen in der aba1.txt "nr                           650123" & "typ                         42" überschreiben. Zu guter letzt soll das ganze in einem anderen Ordner unter dem Namen der cee1.txt abgelegt werden (soweit bin ich bis jetzt nicht gekommen)

    Danach soll das nächste paar auf der Liste abgearbeitet werden. Ich hoffe das ist verständlich. 

    Nun zu dem was ich alles Versucht habe.

    #Das ist wohl mein bis jetzt bester Versuch. 
    #Das Problem hierbei ist das in $_ noch die gesamte Datei enthalten ist. Ich bekomme das einfach nicht richtig aufgetrennt
    
    Get-Content "P:\Users\fabio\Desktop\cee2.txt" | ForEach-Object {
    
    if ($_ -match 'topnr' ){$topNR = $_}
    if ($_ -match 'typ' ){$typ = $_}
    if ($_ -match 'subtyp' ){$subtyp = $_}
    
    
    Get-Content "P:\Users\fabio\Desktop\aba1.txt" | ForEach-Object {
    if ($_ -match 'nr' ){$_ -replace "nr* *[0-9]*" , $topNR}else{ $_ }  } | Set-Content "P:\Users\fabio\Desktop\aba2.txt" 
    #if ($_ -match 'typ' ){$_ -replace "typ* *[0-9]*" , $typ}else{ $_ }  } | Set-Content "P:\Users\fabio\Desktop\aba2.txt" 
    
    }
    
    
    


    #Die Liste bekomme ich zerlegt
    
    $list = get-content "P:\Users\fabio\Desktop\list.txt" | ConvertFrom-String -PropertyNames aba, cee
    $cee = $list.cee
    $cee
    $aba
    


    #Ich habe es mit einem Index versucht, diesen habe ich aber nie zum laufen bekommen
    
    $list = get-content "P:\Users\fabio\Desktop\list.txt" | ConvertFrom-String -PropertyNames aba, cee
    $cee = $list.cee
    
    $line = Get-Content P:\Users\fabio\Desktop\list.txt | Measure-Object –Line | Out-String
    foreach($i in $cee){
    $txtcee = get-content "P:\Users\fabio\Desktop\$cee.txt"
    $txtcee
    }
    


    #Das hier habe ich aus dem Netz un versucht auf meine Bedürfnisse anzupassen aber auch das ein Fehlschlag
    
    Get-Content "P:\Users\fabio\Desktop\cee2.txt" | ForEach-Object {
    
    if ($_ -match 'topnr' ){$topNR = $_}
    if ($_ -match 'typ' ){$typ = $_}
    if ($_ -match 'subtyp' ){$subtyp = $_}
    
    
    ForEach($Datei in Get-ChildItem "P:\Users\fabio\Desktop\aba1.txt") {
        
    
    
        $Zeilen =  Get-Content -Path $Datei.Fullname
    
    
    
        $ZeilenZähler = 1
    
        # jede Zeile abarbeiten
        foreach($Zeile in $Zeilen)
        {
            # Hier findet meine Dateiveränderung statt.
            $Zeile = $Zeile -replace "nr* *[0-9]*", $topNR
            $Zeile = $Zeile -replace "typ* *[0-9]*", $typ
            $Zeile = $Zeile -replace "subtyp* *[0-9]*", $subtyp
            
            #Veränderte Zeile anzeigen lassen
            Write-Host "Geänderte Zeile in Datei $($Datei.Fullname)"
            Write-Host $Zeile
    
            # Nur bei der ersten Zeile wird die Alte Datei ("leer") neu angelegt (überschrieben)!
            If($ZeilenZähler -eq 1 ) {
               Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force
            }
            Else {
                # jede weiter Zeile an die neue erstellte Datei anhängen (Parameter Append)
                Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force -Append
            }
            
            # Zeilenzähler hochsetzen
            $ZeilenZähler++
        }
    }
    }

    Ich hoffe irgend jemand hier versteht was ich versuche umzusetzen und erbarmt sich mir zu helfen.

    Gruss

    Fabio

    Sonntag, 4. März 2018 19:08

Antworten

  • Fabio,

    erstmal willkommen im deutschen Powershell Forum. Dann - wow - da hast Du Dir ja gleich was ausgesucht.  ;-)
    Es ist mit der Powershell relativ einfach mit strukturierten Daten umzugehen. CSV-Dateien z.B. lassen sich super verarbeiten. Deine Daten sehen relativ unstrukturiert aus. Auch wenn sie immer die gleich Struktur in den Dateien haben, die Kombination "Name Wert" ist für Powershell quasi nicht als Struktur "erkennbar". 

    Deine Datei "Liste" scheint einer CSV-Datei noch am ähnlichsten zu sein. Du könntest sie also mit Import-CSV einlesen und in einer Schleife die jeweils zusammengehörigen Dateien verarbeiten.  Zum Einlesen Deiner anderen Dateien könntest Du dann sowas hier verwenden.

    $Path = 'C:\sample'
    $Listpath = Join-Path $Path -ChildPath 'list.txt'
    $List = Import-csv -Path $Listpath -Delimiter ' ' -Header 'aba','cee'
    $List  # nur zur Veranschaulichung, das kann im produktiven Code entfallen
    
    Foreach($item in $List){
        $abaPath = Join-Path -Path 'Pfad' -ChildPath $item.aba
        Get-Content -Path $abaPath | 
            ForEach-Object{$abaData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$abaData[$matches.Name]=$matches.Value;}}
        $abaData  # nur zur Veranschaulichung, das kann im produktiven Code entfallen
    
        $ceePath = Join-Path -Path 'Pfad' -ChildPath $item.cee
        Get-Content -Path $ceePath | 
            ForEach-Object{$ceeData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$ceeData[$matches.Name]=$matches.Value;}}
        $ceeData  # nur zur Veranschaulichung, das kann im produktiven Code entfallen
    
        # und hier kommt jetzt dann das richtig coole Zeug, was Du aber erst noch bauen musst.
    }
    

    Ich habe ein paar Annahmen gemacht, weil Deine Angaben zum Teil ungenau oder widersprüchlich waren - das musst Du dann entsprechend präzisieren. So aufbereitet kannst Du die Daten mit entsprechenden Bedingungen (IF oder Switch) einfacher weiterverarbeiten.

    Ich hoffe, das bringt Dich erstmal auf den Weg. Spiel ein bissl mit dem Code und wenn Du nicht weiterkommst, weißt Du ja jetzt, wo Du Hilfe findest.

    Zum Schluss möchte ich Dir noch empfehlen, wenn das kein einmaliges Projekt mit Powershell werden soll, Dir die Grundlagen von Powershell auf eine strukturierte Art anzueignen. Das geht auch völlig kostenlos, Du musst nur etwas Zeit investieren. z.B. hier mit einem Video-Kurs der Microsoft Virtual Academy: Getting Started with Powershell - sehr zu empfehlen!  ;-)

    Viel Spaß!


    Best regards,

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

    • Als Antwort markiert FabioMeh Donnerstag, 8. März 2018 07:37
    Montag, 5. März 2018 01:28
  • Ich habe das mal kopiert und meinen Pfad eingetragen. Danach bekam ich lauter Fehlermeldungen im Stile von:

    Das ist bei manchen Kollegen hier bestimmt anders, aber mir fließt der Code leider nicht aus den Fingern. Je nach Aufgabenstellung probiere ich mal dies oder das, dann fällt mir noch was anderes ein oder ich google etwas und kombiniere es mit dem was ich schon habe und so kommt es schon mal vor, dass da ein bissl was durcheinander gerät. Aber so konntest Du schon Deine ersten Debugging-Erfahrungen sammeln und hast die Situation mit Bravour gemeistert. Ich bin stolz auf Dich. :-)

    Das heisst also das: .... jede Zeile in .... aufgeteilt und gespeichert wird

    Jein. Damit wird jeweils eine Hashtable erzeugt. Also eine Datenstruktur aus Schlüssel-Wert-Paaren, deren Werte über den Schlüssel angesprochen werden können. In anderen Sprachen heißt das auch gern mal Dictionary.

    Ich merke gerade das -match eigentlich gar nicht der richtige befehl dafür ist. Eigentlich müsste ich das ja über Select-String machen

    Es gibt natrülich fast immer mehrere Wege ans Ziel zu kommen. Es schadet auf jeden Fall nicht, ausreichend verschiedene Wege zu kennen. Dann fällt es leichter, den jeweils (für sich) richtigen auszuwählen.

    Zu guter letzt soll das ganze in einem anderen Ordner unter dem Namen der cee1.txt abgelegt werden

    Da Du das ganze also sowieso in einer anderen Datei in einem anderen Ordner ablegen willst, kannst Du es auch gleich neu erstellen. Ich habe da mal was zusammengezimmert, was eigentlich funktionieren sollte. Du musst natürlich die Pfade und Namen noch anpassen (oder Du benutzt zum Testen einfach mal Dateien und Pfade, die zu meinem Code passen )     ;-)

    $InputPath = 'C:\sample'
    $OutputPath = 'D:\sample'
    $Listpath = Join-Path $InputPath -ChildPath 'list.txt'
    $List = Import-csv -Path $Listpath -Delimiter ' ' -Header 'aba', 'cee'
    
    Foreach ($item in $List) {
        $abaPath = Join-Path -Path $InputPath -ChildPath ($item.aba + '.txt')
        Get-Content -Path $abaPath | 
            ForEach-Object {$abaData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$abaData[$matches.Name] = $matches.Value; }}
    
        $ceePath = Join-Path -Path $InputPath -ChildPath ($item.cee + '.txt')
        Get-Content -Path $ceePath | 
            ForEach-Object {$ceeData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$ceeData[$matches.Name] = $matches.Value; }}
    
        $Result = "topnr $($ceedata.topnr)`n"
        $Result += "typa $($ceedata.typa)`n"
        $Result += "subtyp $($abadata.subtyp)"
    
        $OutputFileName = Join-Path -Path $OutputPath -ChildPath ($item.cee + '.txt')
        $Result | Out-File -FilePath $OutputFileName
    } 

    Die Quell-Dateien werden also aus dem $InputPath eingelesen und verarbeitet und die Ausgabe-Dateien werden dann nach $OutputPath geschrieben. Der sollte schon existieren - das wird im Script nicht geprüft.

    Viel Spaß beim Basteln.


    Best regards,

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



    • Bearbeitet BOfH_666 Dienstag, 6. März 2018 01:32 Code korrigiert
    • Als Antwort markiert FabioMeh Donnerstag, 8. März 2018 07:37
    Dienstag, 6. März 2018 00:21
  • Fabio, Fabio, Du wolltest mich testen, oder? ;-) :-D ... aber ich hab's gemerkt. In den letzten Beispieldateien, die Du hier gepostet hast, fehlten die Einträge, die Du in Deiner ursprünglichen Anfrage geändert haben wolltest ... Du Schlingel. :-o

    Also denn ... ich glaub, ich hab was Funktionierendes hinbekommen - vielleicht nicht die allergeilste Lösung, aber es sollte wenigstens den Job erledigen.  ... und ein bissl flexibel und relativ leicht anzupassen isses auch noch.

    $InputPath = 'D:\sample\abacee' $OutputPath = 'D:\sample\output' $ListFile = Join-Path $InputPath -ChildPath 'list.txt' $List = Import-csv -Path $ListFile -Delimiter ' ' -Header 'aba', 'cee' $ReplacelistFile = Join-Path $InputPath -ChildPath 'replacelist.csv' $Replacelist = Import-Csv -Path $ReplacelistFile -Delimiter ';' Foreach ($item in $List) { $abaPath = Join-Path -Path $InputPath -ChildPath ($item.aba + '.txt') $ceePath = Join-Path -Path $InputPath -ChildPath ($item.cee + '.txt') $abaContent = Get-Content -Path $abaPath $ceeContent = Get-Content -Path $ceePath $OutputFileName = Join-Path -Path $OutputPath -ChildPath ($item.cee + '.txt') Foreach($line in $abaContent){ $line -match '^(\w+)\s+' | Out-Null If($Matches[1] -in $Replacelist.before){ $ceePatern = $Replacelist.Where({$PSItem.before -eq $Matches[1]}).after Foreach($line in $ceeContent){ $line -match '^(\w+)\s+' | Out-Null If($Matches[1] -eq $ceePatern){ $line | Out-File -FilePath $OutputFileName -Append } } } else{ $line | Out-File -FilePath $OutputFileName -Append } } }

    Dir von mir benutzte Datei replacelist.csv sieht dann so aus:

    before;after
    nr;topnr
    typ;typa

    Jetzt zur Funktion:

    In der CSV-Datei stehen die Pärchen, die Du gegeneinander austauschen willst. Also in der Spalte before, die Sachen, die in der aba-Datei mit entsprechenden Sachen aus der cee-Datei ersetzt werden sollen und in der Spalte after eben genau die.

    Das Script schnappt sich eine aba-Datei nach der anderen (das hatten wir ja schon) und prüft jede einzelne Zeile, ob sie mit einem Bezeichner beginnt, der in der replacelist in der Spalte before enthalten ist.

    Ist das nicht der Fall - das ist dann im Script der else-Zweig - wird die Zeile einfach direkt in die Ausgabedatei geschrieben.

    Wird eine Zeile gefunden, deren Bezeichner in der replacelist enthalten ist, wird ermittelt welcher Eintrag in der Spalte after zu dem in der Spalte before gefundenen gehört. Dieser wird in der Variablen $ceePatern zwischengespeichert.

    Jetzt wird in der zur aba-Datei gehörenden cee-Datei nach der Zeile gesucht, deren Bezeichner dem $ceePatern entspricht. Diese wird dann statt der ursprünglichen Zeile aus der aba-Datei in die Ausgedatei geschrieben.

    War doch einfach, oder?  :-D


    Best regards,

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





    • Bearbeitet BOfH_666 Freitag, 9. März 2018 01:36
    • Als Antwort markiert FabioMeh Freitag, 9. März 2018 09:25
    Freitag, 9. März 2018 00:57

Alle Antworten

  • Fabio,

    erstmal willkommen im deutschen Powershell Forum. Dann - wow - da hast Du Dir ja gleich was ausgesucht.  ;-)
    Es ist mit der Powershell relativ einfach mit strukturierten Daten umzugehen. CSV-Dateien z.B. lassen sich super verarbeiten. Deine Daten sehen relativ unstrukturiert aus. Auch wenn sie immer die gleich Struktur in den Dateien haben, die Kombination "Name Wert" ist für Powershell quasi nicht als Struktur "erkennbar". 

    Deine Datei "Liste" scheint einer CSV-Datei noch am ähnlichsten zu sein. Du könntest sie also mit Import-CSV einlesen und in einer Schleife die jeweils zusammengehörigen Dateien verarbeiten.  Zum Einlesen Deiner anderen Dateien könntest Du dann sowas hier verwenden.

    $Path = 'C:\sample'
    $Listpath = Join-Path $Path -ChildPath 'list.txt'
    $List = Import-csv -Path $Listpath -Delimiter ' ' -Header 'aba','cee'
    $List  # nur zur Veranschaulichung, das kann im produktiven Code entfallen
    
    Foreach($item in $List){
        $abaPath = Join-Path -Path 'Pfad' -ChildPath $item.aba
        Get-Content -Path $abaPath | 
            ForEach-Object{$abaData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$abaData[$matches.Name]=$matches.Value;}}
        $abaData  # nur zur Veranschaulichung, das kann im produktiven Code entfallen
    
        $ceePath = Join-Path -Path 'Pfad' -ChildPath $item.cee
        Get-Content -Path $ceePath | 
            ForEach-Object{$ceeData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$ceeData[$matches.Name]=$matches.Value;}}
        $ceeData  # nur zur Veranschaulichung, das kann im produktiven Code entfallen
    
        # und hier kommt jetzt dann das richtig coole Zeug, was Du aber erst noch bauen musst.
    }
    

    Ich habe ein paar Annahmen gemacht, weil Deine Angaben zum Teil ungenau oder widersprüchlich waren - das musst Du dann entsprechend präzisieren. So aufbereitet kannst Du die Daten mit entsprechenden Bedingungen (IF oder Switch) einfacher weiterverarbeiten.

    Ich hoffe, das bringt Dich erstmal auf den Weg. Spiel ein bissl mit dem Code und wenn Du nicht weiterkommst, weißt Du ja jetzt, wo Du Hilfe findest.

    Zum Schluss möchte ich Dir noch empfehlen, wenn das kein einmaliges Projekt mit Powershell werden soll, Dir die Grundlagen von Powershell auf eine strukturierte Art anzueignen. Das geht auch völlig kostenlos, Du musst nur etwas Zeit investieren. z.B. hier mit einem Video-Kurs der Microsoft Virtual Academy: Getting Started with Powershell - sehr zu empfehlen!  ;-)

    Viel Spaß!


    Best regards,

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

    • Als Antwort markiert FabioMeh Donnerstag, 8. März 2018 07:37
    Montag, 5. März 2018 01:28
  • Hi 

    Danke dir erst einmal für die mühe dich in mein Problem einzudenken!

    Das ist richtig. Die Liste ist die einzige TXT in der die Spalten einem Wert zugeordnet ist. Mit den Cee & aba Daten werden indirekt Maschinen angesteuert.

    Ich habe das mal kopiert und meinen Pfad eingetragen. Danach bekam ich lauter Fehlermeldungen im Stile von:

    Get-Content : Der Pfad "C:\WINDOWS\system32\Pfad\aba3" kann nicht gefunden werden, da er nicht vorhanden ist.

    Also habe ich in Zeile 8 & 13 'Pfad' durch $Path ersetzten. Nun funktioniert es fast, ich muss nun nur doch das Suffix .txt hinzufügen oder in der Liste die Dateinamen mit Suffix eintragen aber das dürfte kein Problem sein.

    $ceePath = Join-Path -Path 'Pfad' -ChildPath $item.cee
    
    $ceePath = Join-Path -Path $Path -ChildPath $item.cee


    Wieso hast du da 'Pfad' geschrieben? Wenn ich das recht verstehe ist das was in ' ' steht ein Text. Darum dann auch "Pfad\aba3". Ich steig da nicht dahinter, vorallem weil es dann nicht auf einen Pfad weist. Einen Tippfehler schliesse ich aus da das eine Deutsch und das andere Englisch ist. Aus irgend einem grund hast du das ja so geschrieben.

    Mein nächstes grosses Problem sind diese Regulären Ausdrücke (RegEx). Da habe mich gestern schon abgemüht zu verstehen wie das Funktioniert. Kannst du mir sagen nach was du mit folgendem Ausdruck suchst? Ein bisschen finde ich mich damit schon zurecht, ich denke es würde mir helfen wenn ich weiss was diese Ausdruck bedeutet.

    '^(?<Name>\w+)\s+(?<Value>\d+)'

    ForEach-Object{$ceeData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$ceeData[$matches.Name]=$matches.Value;}}

    Eigentlich wird hier doch nach einem Namen und einem Wert gesucht. Aber nach was für einem "Name" und "Value"

    ^ hier beginnt die Zeichenfolge; ? hier kann alles stehen gefolgt von "Name" 

    Was bedeuten die Buchstaben gefolgt vom + (w+ ; s+ ; d+)?

    Die Virtual Academy ist ein guter Tipp, danke! Werde mir das bei Gelegenheit zu Gemüte führen. Eher früher als später merke ich gerade. Mir sind viel zu viele einfach Funktionen in Powershell unbekannt. Viele Fragen würden sich wohl erübrigen..


    Gruss und nochmals Danke

    Fabio


    • Bearbeitet FabioMeh Montag, 5. März 2018 11:27
    Montag, 5. März 2018 11:27
  • Reguläre Ausdrücke sind sehr mächtig, erfordern aber gewisse Grundlagenkenntnisse.

    ^ ist der String-Anfang, wenn es nicht in [] steht. Steht es in [], würde es "nicht" bedeuten.

    (?<NAME>AUSDRUCK) benennt einen Teil des Pattern (AUSDRUCK) mit dem Namen NAME. Dadurch kann man über $matches.NAME auf den Treffer zugreifen.

    \w steht für ein beliebiges alphanumierisches Zeichen (Buchstabe oder Zahl).

    + bedeutet, dass das vorherige Zeichen/Metazeichen mindestens einmal wiederholt wird. \w+ sind damit beliebig viele Buchstaben und Zahlen, aber mindestens einer.

    \s ist ein Leerzeichen bzw. WhiteSpace

    Eine relativ einfache Einleitung zu RegEx findet man z.B. auch in der Wikipedia: https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Regul%C3%A4re_Ausdr%C3%BCcke_in_der_Praxis

    Viele Grüße

    Christoph

    PS: Ohne Olaf vorgreifen zu wollen: Wahrscheinlich solltest du bei 'Path' einfach nur deinen Pfad reinschreiben. Wir liefern hier keine fertigen Skripte, die 100%ig funktionieren, sondern nur Anregungen.
    • Bearbeitet hpotsirhc Montag, 5. März 2018 11:39
    Montag, 5. März 2018 11:37
  • Das heisst also das: "ForEach-Object{$ceeData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$ceeData[$matches.Name]=$matches.Value;}}" jede Zeile in $matches.Name & $matches.Value aufgeteilt und gespeichert wird. 

    Somit kann ich über $abaData[$matches.Name] pro Zeile den ersten Wert der Zeile auslesen. Mit meinen Test Daten und folgendem befehle für die Ausgabe liefert mir das aber nur die Werte in der zweiten Spalte zurück. Und nur aus der zweiten Zeile.

    #cee
        $ceePath
        $ceeData[$matches.Name]
        $ceeData[$matches.Value]
     #aba 
        $abaPath
        $abaData[$matches.Name]
        $abaData[$matches.Value]

    C:\Users\user\Desktop\script\cee1.txt
    2
    C:\Users\user\Desktop\script\aba1.txt
    3
    C:\Users\user\Desktop\script\cee2.txt
    2
    C:\Users\user\Desktop\script\aba2.txt
    3
    C:\Users\user\Desktop\script\cee3.txt
    2
    C:\Users\user\Desktop\script\aba3.txt
    3

    Der Wert 2 & 3 aus den cee & aba Daten stammt aus der zweiten Zeile, zweite Spalte stehen jetzt aber in der $matches.Name. In $matches.Value steht nichts drin.

    Die Bedingung trifft jetzt also nur auf diesen Wert zu. Wenn ich das richtig verstanden habe müsste er aber Zeile für Zeile in diese Werte schreiben. 

    Ich habe dann versucht mir jede Zeile komplett in $matches.Line zu übergeben. Das bekomme ich irgend wie nicht hin. Kann mir hier jemand auf die Sprünge helfen wie der RedEx aussehen müsste um mir komplette Zeilen rauszuschreiben?

    Danach kann ich die zutreffenden Zeilen ja mit Switch in eigenen Variablen schreiben. So oder so ähnlich: 

    switch -regex($ceeData$matches.Line){ '^nr*' {$abaData$matches.Line = $NR} '^typ*' {$abaData$matches.Line = $TYP} }

    #ich denke fast das es anstatt '^nr*' eher '^nr\w+' sein müsste

    Wie bekomme ich eigentlich alles bis zum Zeilenende in eine Variable?

    Die Zeilen danach auszutauschen dürfte kein so grosses Problem mehr sein.

    Gruss

    Fabio

    EDIT

    Ich merke gerade das -match eigentlich gar nicht der richtige befehl dafür ist. Eigentlich müsste ich das ja über Select-String machen gepaart mit -Allmatches da -match nach dem ersten Treffer abbricht. Daher kommt auch das Problem das ich nur ein Ergebnis pro Datei bekomme. Ich denke ich muss mich nun erst mal noch in Select-String einarbeiten


    • Bearbeitet FabioMeh Montag, 5. März 2018 16:48 Select-String hinzugefügt & Switch geändert
    Montag, 5. März 2018 15:53
  • Ich habe das mal kopiert und meinen Pfad eingetragen. Danach bekam ich lauter Fehlermeldungen im Stile von:

    Das ist bei manchen Kollegen hier bestimmt anders, aber mir fließt der Code leider nicht aus den Fingern. Je nach Aufgabenstellung probiere ich mal dies oder das, dann fällt mir noch was anderes ein oder ich google etwas und kombiniere es mit dem was ich schon habe und so kommt es schon mal vor, dass da ein bissl was durcheinander gerät. Aber so konntest Du schon Deine ersten Debugging-Erfahrungen sammeln und hast die Situation mit Bravour gemeistert. Ich bin stolz auf Dich. :-)

    Das heisst also das: .... jede Zeile in .... aufgeteilt und gespeichert wird

    Jein. Damit wird jeweils eine Hashtable erzeugt. Also eine Datenstruktur aus Schlüssel-Wert-Paaren, deren Werte über den Schlüssel angesprochen werden können. In anderen Sprachen heißt das auch gern mal Dictionary.

    Ich merke gerade das -match eigentlich gar nicht der richtige befehl dafür ist. Eigentlich müsste ich das ja über Select-String machen

    Es gibt natrülich fast immer mehrere Wege ans Ziel zu kommen. Es schadet auf jeden Fall nicht, ausreichend verschiedene Wege zu kennen. Dann fällt es leichter, den jeweils (für sich) richtigen auszuwählen.

    Zu guter letzt soll das ganze in einem anderen Ordner unter dem Namen der cee1.txt abgelegt werden

    Da Du das ganze also sowieso in einer anderen Datei in einem anderen Ordner ablegen willst, kannst Du es auch gleich neu erstellen. Ich habe da mal was zusammengezimmert, was eigentlich funktionieren sollte. Du musst natürlich die Pfade und Namen noch anpassen (oder Du benutzt zum Testen einfach mal Dateien und Pfade, die zu meinem Code passen )     ;-)

    $InputPath = 'C:\sample'
    $OutputPath = 'D:\sample'
    $Listpath = Join-Path $InputPath -ChildPath 'list.txt'
    $List = Import-csv -Path $Listpath -Delimiter ' ' -Header 'aba', 'cee'
    
    Foreach ($item in $List) {
        $abaPath = Join-Path -Path $InputPath -ChildPath ($item.aba + '.txt')
        Get-Content -Path $abaPath | 
            ForEach-Object {$abaData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$abaData[$matches.Name] = $matches.Value; }}
    
        $ceePath = Join-Path -Path $InputPath -ChildPath ($item.cee + '.txt')
        Get-Content -Path $ceePath | 
            ForEach-Object {$ceeData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$ceeData[$matches.Name] = $matches.Value; }}
    
        $Result = "topnr $($ceedata.topnr)`n"
        $Result += "typa $($ceedata.typa)`n"
        $Result += "subtyp $($abadata.subtyp)"
    
        $OutputFileName = Join-Path -Path $OutputPath -ChildPath ($item.cee + '.txt')
        $Result | Out-File -FilePath $OutputFileName
    } 

    Die Quell-Dateien werden also aus dem $InputPath eingelesen und verarbeitet und die Ausgabe-Dateien werden dann nach $OutputPath geschrieben. Der sollte schon existieren - das wird im Script nicht geprüft.

    Viel Spaß beim Basteln.


    Best regards,

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



    • Bearbeitet BOfH_666 Dienstag, 6. März 2018 01:32 Code korrigiert
    • Als Antwort markiert FabioMeh Donnerstag, 8. März 2018 07:37
    Dienstag, 6. März 2018 00:21
  • Hallo Zusammen

    Danke erstmal für die sehr hilfreichen Antworten.

    Langsam bin ich in Powershell ein wenig drin. Ich habs schonmal hinbekommen das er mir nur gewisse Zeilen ersetzt aber ich habe das Problem das ich es nicht hinbekomme jede Zeile in die Variable zu schrieben.

    Über 

    {$ceeData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$ceeData[$matches.Name] = $matches.Value; }}

    bekomme ich nur den Wert der in der zweiten Spalte der Zeile steht unter dem Namen der in der ersten Spalte steht. Ich habe nun versucht das so umzuschreiben das er mir das zwar immer noch unter dem Namen in der ersten Spalte schreibt aber das dann als Wert die komplette Zeile inklusive der Leerzeichen genommen wird.

    Also aus: nr                  1646546465 

    kann ich aktuell mit $($ceeData.nr) folgendes auslesen:

    1646546465

    Ich würde das aber gerne so ändern das ich mit $($ceeData.nr) folgendes auslese:

    nr                  1646546465 

    Ich habe einerseits versucht die Regex zuändern das er mir alles mitnimmt:

    '^(?<Name>\w+)\s+(?<Name>\w+?<Value>\d+)'        liefert kein Ergebnis aber auch keine Fehlermeldung, alles andere was ich hier versucht habe endet immer mit einer Fehlermeldung

    Das andere was ich versucht habe ist am ende der Zeile Name und Nr zusamen zusetzten:

    {$ceeData[$matches.Name] = $machtes.Name + $matches.Value; }}     das liefert mir das gleiche Ergebnis wie wenn ich "$matches.Name +" weglasse

    Ich habe es nicht nur bei diesen zwei Möglichkeiten belassen sondern habe div Variationen und Idee aus dem Netz ausprobiert, leider ohne Erfolg.

    Kann mir hier noch einmal jemand auf die Sprünge helfen?

    Donnerstag, 8. März 2018 10:44
  • Zum Debuggen lohnt es sich, den Code etwas anders zu designen. Olaf hat einen eher pipeline-orientierten Stil verwendet, man kann es aber auch ehr variablen-orientiert machen.

    Statt

      Get-Content -Path $abaPath | 
            ForEach-Object {$abaData = @{}} {if ($_ -match '^(?<Name>\w+)\s+(?<Value>\d+)') {$abaData[$matches.Name] = $matches.Value; }}
    
    schreibt man
    $content = Get-Content -Path $abaPath 
    
    $abaDaten = @{}
    foreach($c in $content){
      if($c -match "..."){
        $name, $wert = $matches.Name, $matches.Value
        $abaDaten[$name] = $wert
      }
    }
    
    
    Auf diese Weise kannst du dir Stoppmarken (F9) setzen und in die Schleife springen. Oder du kannst $content laden und danach $c = $content[0] setzen. An diesem $c kannst du dann den Regulären Ausdruck einfach ausprobieren, bis er passt.
    Donnerstag, 8. März 2018 11:04
  • Und zu deinem speziellen Problem: Du scheibst etwas cryptisch, mir ist nicht ganz klar, was du willst.

    Momentan legst du Objekte an, die als Eigenschaften die Zeilen-Feldnamen deiner Datei haben. Die Werte dieser Eigenschaften sind jeweils die Werte in den Zeilen. Deine Eigenschaften heißen konkret: nr, typ und subtyp.

    Dadurch bekommst du durch $ceeData.nr natürlich den Wert der Eigenschaft "nr" im Objekt, das in der Variablen $ceeData gespeichert ist. 

    Warum möchtest du in einer Objekt-Eigenschaft noch einmal den Namen der Eigenschaft speichern? Das ist eine redundante Information. 

    Ich kann dir nur raten, dich inhaltlich intensiver mit den Grundlagen zu befassen. Du scheinst den Vorgang immer noch als Textverarbeitung zu interpretieren. Dein Problem "Daten einlesen", ist ein Textverarbeitungsproblem, weil dein Eingabeformat so ungünstig ist. Dieses ist aber mit der Lösung von Olaf gelöst. Was jetzt kommt, ist ein Datenverarbeitungsproblem. Dafür solltest du dich gedanklich vom zeilenweisen Vorgehen und der Textverarbeitung lösen. Ab jetzt arbeitest du mit Datensätzen (Objekten) und Datenfeldern (deren Eigenschaften).




    • Bearbeitet hpotsirhc Donnerstag, 8. März 2018 11:18
    Donnerstag, 8. März 2018 11:16
  • Fabio,

    hast Du den Code denn mal getestet? Tut er was er soll?

    Das Konstrukt, was im Code benutzt wird nennt sich HashTable - eine Datenstruktur aus Schlüssel-Wert-Paaren. Die Werte kannst Du über die Schlüsselnamen "ansprechen". Man kann sich natürlich auch die Schlüssel (Keys) ausgeben lassen. hier mal ein Beispiel - spiel ein bissl damit und schau Dir vielleicht die Hilfe mal an:

    $HashTable = @{
        SchluesselNr1 = 'WertNrEins'
        SchluesselNr2 = 15
        SchluesselNr3 = $false
    }
    
    $HashTable.Keys
    $HashTable.Values
    
    $HashTable.SchluesselNr2
    
    Get-Help about_Hash_Table

    Wieviel Informationen stecken denn in der quasi neu zu erzeugenden Datei? Sind es wirklich nur die 3 von Dir bezueichneten Werte? Dann könntest Du doch mit dem Ansatz, den ich in meinem Codebeispiel gezeigt habe, loslegen.  ODer hast Du uns etwa noch entscheidende INformationen vorenthalten?? ;-) :-D


    Best regards,

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

    Donnerstag, 8. März 2018 12:16
  • Ok ich versuche das mal so einfach wie möglich herunterzubrechen.

    Eigentlich möchte ich nur einige Zeilen aus der ersten Datei in die zweite schreiben. Die Zeilen sollen aber nicht einfach an die zweite Datei angehängt werden sondern sollen eine ganze Zeile überschrieben. 

    Vlt. hilft auch ein bisschen Hintergrund wissen um meine Erklärungsversuche zu verstehen.

    Die Dateien enthalten zwischen 30-40 Zeilen wovon ich ca. 4-6 Zeilen von einer in die andere Datei schreiben möchte.

    Die erste Datei kommt aus dem neuen ERP (cee), die andere Datei aus dem alten ERP(aba). Gewisse Aufträge werden immer noch über das alte ERP(aba) abgewickelt.

    Da sich mit dem neuen ERP(CEE) auch Auftragsnummer und ähnliches geändert haben möchte ich ein Script schreiben das mit Hilfe einer Liste in allen TXT Dateien aus dem alten ERP(aba) die Auftrgasnummer aus der dazugehörigen TXT Dateien vom neuen ERP(cee) schreibt.

    Zusätzlich muss die Nr die in der zweiten Spalte steht exakt an der 30. Stelle beginnen (Daher die vielen Leerzeichen dazwischen und daher auch meine Idee die ganze Zeile in eine Variable zu schreiben).

    Einige Wert können einfach an die bestehende aba Datei angehängt werden, andere müssen eine vorhandene Zeile ersetzen.

    Damit das vlt noch ein bisschen klarer wird habe ich die ersten paar Zeilen dieser Dateien und Beispiele die später auch so verwendet werden angehängt.

    Beispiel ersetzten: Die "aufnr" muss in der aba Datei durch die in der cee Datei überschrieben werden.

    Beispiel ergänzen: Die Zeile mit "topaufnr" muss so wie sie ist in die aba Datei geschrieben werden ohne etwas zu überschreiben.

    So sieht eine Datei aus CEE aus:

    aufnr                         031859
    aufrnr                        0
    posnr                         1
    menge                         1
    zargentyp                     3013
    zargenart                     1
    prodart                       2
    topaufnr                      600-1800014574
    toppaqty                      1
    toppaart                      ZS-SM6659
    vaordernr                     600-180500026-10
    mat                           BLEZ14


    Und so eine aus aba

    aufnr                         659802
    aufrnr                        0
    posnr                         1
    menge                         1
    zargentyp                     SCH-IW-2
    zargenart                     1
    prodart                       3
    plannr                        T7572.S15
    mat                           BLEZ14
    durchlauf                     ST2S
    tuernr                        1
    protyp                        012
    typ                           20
    subtyp                        T7572

    Beim abschicken wird die Formatierung der Codeblöcke durcheinander gebracht. Die Werte in der zweiten Spalte stehen eigentlich sauber untereinander. Ein Screenshot darf ich leider noch nicht anhängen..

    @Olaf

    Den Code den ich habe überschreibt im Moment noch die komplette Datei mit den Werten die ich aus der cee Datei herausgepickt habe. Mit Hilfe von vielen Leerzeichen und einem Text sehe diese Zeilen schon richtig aus, z.B.: "topnr                        $($ceedata.topnr)`r`n" Ich dacht ich könne es mir einfacher machen und direkt die ganze Zeile mit nur einer Variablen überschreiben. 

    Mit suchen und ersetzten bin ich in einem einzelnen Script mit vorgefühlten Variabel und Array am Testen und rumspielen wie ich die Änderung und das ergänzen hinbekomme. Irgend was muss ich auch noch selber rausfinden ;) Zumal mir das deutlich leichter fällt als gross mit der Pipe und Regex rumzuspielen. 

    Die neue Datei enthält alles was in der aba Datei steht mit den Änderungen und Ergänzungen die im Script gemacht werden.

    So viel ich weiss nicht aber ich kann mir gut vorstellen das meine Erklärungen nicht immer ganz so einfach verständlich wahren wie ich mir das beim schreiben gedacht habe.



    • Bearbeitet FabioMeh Donnerstag, 8. März 2018 15:36
    Donnerstag, 8. März 2018 14:08
  • Ok ich versuche das mal so einfach wie möglich herunterzubrechen.

    Super ... wir sind ja auch nicht mehr die Jüngsten .... :-D

    Eigentlich möchte ich nur einige Zeilen aus der ersten Datei in die zweite schreiben. Die Zeilen sollen aber nicht einfach an die zweite Datei angehängt werden sondern sollen eine ganze Zeile überschrieben. 

    Vlt. hilft auch ein bisschen Hintergrund wissen um meine Erklärungsversuche zu verstehen.

    Immer.

    Die Dateien enthalten zwischen 30-40 Zeilen wovon ich ca. 4-6 Zeilen von einer in die andere Datei schreiben möchte.

    DAS hat mir bisher gefehlt. Es geht also nicht nur um die 3 Zeilen, die Du anfänglich beschrieben hattest - OK. ... und vermutlich sind die 4 bis 6 zu ändernden Zeilen auch nicht zusammehängend, richtig?

    So sieht eine Datei aus CEE aus:

    aufnr                         031859
    aufrnr                        0
    posnr                         1
    menge                         1
    zargentyp                     3013
    zargenart                     1
    prodart                       2
    topaufnr                      600-1800014574
    toppaqty                      1
    toppaart                      ZS-SM6659
    vaordernr                     600-180500026-10
    mat                           BLEZ14

    Bei der Formatierung hier im Forum muss man manchmal ein bissl tricksen, damit es vernünftig aussieht. ;-) (Die Ansicht auf HTML umschalten und dann den HTML-Tag tweaken)

    Ich dacht ich könne es mir einfacher machen und direkt die ganze Zeile mit nur einer Variablen überschreiben.

    Mit den jetzt erhaltenen Erklärungen, macht das dann sogar Sinn. ;-)

    So viel ich weiss nicht aber ich kann mir gut vorstellen das meine Erklärungen nicht immer ganz so einfach verständlich wahren wie ich mir das beim schreiben gedacht habe.

    Manche Sachverhalte sind eben auch nicht einfach zu erklären, ohne sie zeigen zu können. ;-) Wir tasten uns einfach langsam ran. Ich hab jetzt ad hoc nicht genug Zeit, aber ich schaue mir das heute Abend zu Hause noch mal an und vielleicht kriegen wir noch was Cooleres hin.

    Best regards,

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

    Donnerstag, 8. März 2018 15:06
  • Fabio, Fabio, Du wolltest mich testen, oder? ;-) :-D ... aber ich hab's gemerkt. In den letzten Beispieldateien, die Du hier gepostet hast, fehlten die Einträge, die Du in Deiner ursprünglichen Anfrage geändert haben wolltest ... Du Schlingel. :-o

    Also denn ... ich glaub, ich hab was Funktionierendes hinbekommen - vielleicht nicht die allergeilste Lösung, aber es sollte wenigstens den Job erledigen.  ... und ein bissl flexibel und relativ leicht anzupassen isses auch noch.

    $InputPath = 'D:\sample\abacee' $OutputPath = 'D:\sample\output' $ListFile = Join-Path $InputPath -ChildPath 'list.txt' $List = Import-csv -Path $ListFile -Delimiter ' ' -Header 'aba', 'cee' $ReplacelistFile = Join-Path $InputPath -ChildPath 'replacelist.csv' $Replacelist = Import-Csv -Path $ReplacelistFile -Delimiter ';' Foreach ($item in $List) { $abaPath = Join-Path -Path $InputPath -ChildPath ($item.aba + '.txt') $ceePath = Join-Path -Path $InputPath -ChildPath ($item.cee + '.txt') $abaContent = Get-Content -Path $abaPath $ceeContent = Get-Content -Path $ceePath $OutputFileName = Join-Path -Path $OutputPath -ChildPath ($item.cee + '.txt') Foreach($line in $abaContent){ $line -match '^(\w+)\s+' | Out-Null If($Matches[1] -in $Replacelist.before){ $ceePatern = $Replacelist.Where({$PSItem.before -eq $Matches[1]}).after Foreach($line in $ceeContent){ $line -match '^(\w+)\s+' | Out-Null If($Matches[1] -eq $ceePatern){ $line | Out-File -FilePath $OutputFileName -Append } } } else{ $line | Out-File -FilePath $OutputFileName -Append } } }

    Dir von mir benutzte Datei replacelist.csv sieht dann so aus:

    before;after
    nr;topnr
    typ;typa

    Jetzt zur Funktion:

    In der CSV-Datei stehen die Pärchen, die Du gegeneinander austauschen willst. Also in der Spalte before, die Sachen, die in der aba-Datei mit entsprechenden Sachen aus der cee-Datei ersetzt werden sollen und in der Spalte after eben genau die.

    Das Script schnappt sich eine aba-Datei nach der anderen (das hatten wir ja schon) und prüft jede einzelne Zeile, ob sie mit einem Bezeichner beginnt, der in der replacelist in der Spalte before enthalten ist.

    Ist das nicht der Fall - das ist dann im Script der else-Zweig - wird die Zeile einfach direkt in die Ausgabedatei geschrieben.

    Wird eine Zeile gefunden, deren Bezeichner in der replacelist enthalten ist, wird ermittelt welcher Eintrag in der Spalte after zu dem in der Spalte before gefundenen gehört. Dieser wird in der Variablen $ceePatern zwischengespeichert.

    Jetzt wird in der zur aba-Datei gehörenden cee-Datei nach der Zeile gesucht, deren Bezeichner dem $ceePatern entspricht. Diese wird dann statt der ursprünglichen Zeile aus der aba-Datei in die Ausgedatei geschrieben.

    War doch einfach, oder?  :-D


    Best regards,

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





    • Bearbeitet BOfH_666 Freitag, 9. März 2018 01:36
    • Als Antwort markiert FabioMeh Freitag, 9. März 2018 09:25
    Freitag, 9. März 2018 00:57
  • Hi Olaf

    Zuerst einmal wow, auf das währe ich wohl noch lange nicht gekommen. Vielen vielen Danke, dafür.

    Sorry ich wollte hier niemanden verwirren. Die Beispieldaten im ersten Post sind wirklich nur reine Beispiele die ich kurz erstellt habe. Die Daten aus dem letzten Post sind effektive Produktionsdateien die so verwendet werden.

    Ich bin noch immer daran deinen Code bis ins letzte Detail zu verstehen. 

    Das "Where" in Zeile 13 macht Powershell mühe.

      $ceePatern = $Replacelist.Where({$PSItem.before -eq $Matches[1]}).after

    Ich bekomme da folgenden Fehler:

    "Fehler beim Aufrufen der Methode, da [System.Management.Automation.PSCustomObject] keine Methode mit dem Namen "Where" enthält."

    Nach mir müsste das entweder "before" oder "after" sein, es werden ja nur diese zwei aus der Replacelist erzeugt. Jedoch scheint auch das nicht richtig zu sein, ich bekomme dann den gleichen Fehler einfach mit "beofe"/"after" anstat mit "Where".

    Es scheint mir zwar als ob das Where dort sinn macht, die Zeile heisst ja eigentlich: Dort wo der Match[1] mit einem Wert aus der $Replaceliste.before übereinstimmt nimm den Wert aus der dazugehörigen Spalte after und schreibe ihn in $ceePattern.

    Jedoch scheint das Powershell anders zu sehen ^^

    Ich habe mir da jetzt sicher schon eine Stunden den Kopf darüber zerbrochen was da genau falsch läuft aber ich bekomme das mit meinen rudimentären Powershell debugging "skills" nicht hin.


    BTW: Wo kommt eigentlich die Variable "$PSItem.befor" her? Ist das einen von den Variablen die von Powershell bei gewissen Funktionen automatisch erzeugt wird?

    Gruss & nocheinmal vielen Dank für die äusserst kompetente Hilfe

    Fabio

    Freitag, 9. März 2018 09:55
  • Sorry ich wollte hier niemanden verwirren.

    Keine Panik. Ich mach doch nur Spaß. Wenn ein Grinsegesicht dahinter steht, ist es Spaß.

    Das "Where" in Zeile 13 macht Powershell mühe.

    Ich bekomme da folgenden Fehler:

    "Fehler beim Aufrufen der Methode, da [System.Management.Automation.PSCustomObject] keine Methode mit dem Namen "Where" enthält."

    Ich habe den Code mit Testdaten bei mir getestet und bei mir läuft er. Die Zeile könnte man auch anders schreiben. Ich hatte mir das nur aus dem Internet geborgt und einfach so übernommen. Die beiden folgenden Code-zeilen machen exakt das Gleiche:
    $ceePatern = $Replacelist.Where({$PSItem.before -eq $Matches[1]}).after
    $ceePatern = $Replacelist | Where-Object {$_.before -eq $Matches[1]} | Select-Object -ExpandProperty After

    Nach mir müsste das entweder "before" oder "after" sein, es werden ja nur diese zwei aus der Replacelist erzeugt. Jedoch scheint auch das nicht richtig zu sein, ich bekomme dann den gleichen Fehler einfach mit "beofe"/"after" anstat mit "Where".

    Das hab ich nicht verstanden. Wie gesagt - bei mir läuft der Code so wie ich ihn gepostet hatte.

    Es scheint mir zwar als ob das Where dort sinn macht, die Zeile heisst ja eigentlich: Dort wo der Match[1] mit einem Wert aus der $Replaceliste.before übereinstimmt nimm den Wert aus der dazugehörigen Spalte after und schreibe ihn in $ceePattern.

    Genau.

    Jedoch scheint das Powershell anders zu sehen

    Nee - eigentlich nicht.

    Ich habe mir da jetzt sicher schon eine Stunden den Kopf darüber zerbrochen was da genau falsch läuft aber ich bekomme das mit meinen rudimentären Powershell debugging "skills" nicht hin.

    Ja nach dem, womit Du arbeitest, hilft es häufig Haltepunkte zu setzen, oder Codezeilen einzeln auszuführen und die korrekte Funktion damit zu prüfen. Oder man kann auch das ein oder andere Write-Debug oder Write-Verbose einbauen.

    BTW: Wo kommt eigentlich die Variable "$PSItem.befor" her?

    Das gibt es seit PS Version 3, wenn ich mich nicht irre und ist einfach nur eine andere Bezeichnung für $_ - also die Pipeline-Variable.

    Best regards,

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


    • Bearbeitet BOfH_666 Freitag, 9. März 2018 12:35
    Freitag, 9. März 2018 12:18