Scripting: Powershell

  • Hi Tweakers


    Stehe vor einem ungelösten Problemchen. Ev kann mir ja jemand weiterhelfen ?


    Ich lese aus einem File die Zeilen 40 -51 das klappt bestens.
    Die Variable ist dann mit den Zeilen abgefüllt.
    Ich würde gerne diese im selben dann suche und ersetzen sowie ausgeben in ein anderes File.
    Das Funktioniert leider nur solange mit der variable $remove bis sie mehr als eine Zeile enthält. Bestimmt mach ich ein überlegungsfehler...


    Code
    1. $remove = (Get-Content $file)[40 .. 51]
    2. Get-Content $file |
    3. Foreach-Object {$_ -replace $remove, '#'} |
    4. Out-File $output


    Besten Dank im voraus

    There are only 10 types of people in the world - those who understand binary, and those who don't.

  • Sali


    "-replace" verwendet einen String, daher wird $remove vom Array zum String gecastet.
    Standartmässig werden die Strings aneinandergereiht mit einem Leerschlag dazwischen. Bei einer Zeile funktioniert das, da sich die ja dann nicht ändert, bei deinem Foreach wird allerdings jede Zeile des originalen Dokuments mit einer Aneinanderreihung aller Zeilen des $remove verglichen, was natürlich nicht übereinstimmt.


    Meine Bastellösung:

    Code
    1. $remove = (Get-Content $file)[40 .. 51]
    2. $remove = $remove -join "`r`n" #setzt den Array als einen String zusammen mit Zeilenumbruch zwischen den Gliedern
    3. $originalFile = (Get-Content $file) -join "`r`n" #setzt OriginalFile Array zu einem String mit Zeilenumbrüchen zusammen
    4. $originalFile -replace $remove '#' | Out-File $output #vergleicht die nun mehrzeiligen Strings miteinander


    oder in einer Zeile:

    Code
    1. ((Get-Content $file) -join "`r`n") -replace ((Get-Content $file)[40 .. 51] -join "`r`n"), '#' | Out-File $output


    Bitte lasst es mich wissen wenn es eine bessere/ einfachere Methode gibt.


    Gruss Patrick

    Aktuelles System: Intel I7 2600K @4.4GHz / gekühlt von H100 | Asus P8z68 V Pro/Gen3 | Asus GTX 780TI | 4*4GB Corsair Vengance DDR3 1600 MHz | 2x 240GB Crushial M500 RAID 0 | Asus Xonar Xense
    Tablet: Lenovo Thinkpad Tablet 2: 10.1 Zoll Windows Tablet

  • Besten Dank. Genau sowas hab ich gesucht


    Gruss Markus

    There are only 10 types of people in the world - those who understand binary, and those who don't.