none
Zeichenkettenoperationen RRS feed

  • Frage

  • Hallo liebe PS-Community,

    ich stehe derzeit vor einer kleinen Herausforderung und weiß leider noch nicht wie ich da genau vorgehen kann. Es gibt ein Pfad in welchem mehrere Dateien abgelegt sind. Diese hole ich mir mit:

    $FileObj = Get-ChildItem -Path "$InputPath"

    und bearbeite diese anschließend mit:

    $FileObj | ForEach-Object{
    
    $_.Name 
    
    }

    Nun sind die Dateinamen immer unterschiedlich und mitten im Dateinamen steht eine Nummer wie "RD839293" oder "32378283". Die Zahlen sind natürlich immer unterschiedlich.

    Nun möchte ich gucken, ob der Dateiname eine 8 stellige Zahl enthält. Wenn dies = True ist, soll die 8 stellige Zahl den kompletten Dateinamen ersetzen.

    Ich hoffe das Ihr mir helfen könnt.

    Liebe Grüße

    -Lars

    Mittwoch, 31. August 2016 10:53

Antworten

  • Du meinst sowas?

    PS U:\> '23 Hallo PS Community RD345678 ABCD Test 382' -replace '.*RD(\d{6}).*','$1'
    345678
    $FileName = '23 Hallo PS Community RD345678 ABCD Test 382'
    $FileNr = $FileName -replace '.*RD(\d{6}).*','$1'
    $FileNr



    Beste Gruesse
    brima
    Mittwoch, 31. August 2016 15:12

Alle Antworten

  • Es müsste sowas sein wie:

    $Dateiname = "Hallo PS Community RD3293238 ABCD Test"
    
    if($Dateiname -contains "RD[int][int][int][int][int][int][int]") #da 8 Zahlen nach RD
    
    {
    
         #Ausgabe von "RD3293238" um den Dateinamen zu ändern
    
    }


    Mittwoch, 31. August 2016 11:03
  • Hallo,

    ich bin nicht so der Beste in Regex, aber das wäre mal an Ansatz:

    $string = "Hallo PS Community RD345678 ABCD Test" 
    
    if($string -match "(RD+\d{6})"){
    
    
    
    $new = $string -replace "([a-z ])",''
    $new ="RD"+$new
    $new
    }
    
    
    
    elseif($string -match "(\d{8})"){
    
    $new = $string -replace "([a-z ])",''
    $new
    
    }
    

    Viel Erfolg

    Beste Grüße Andy



    Mittwoch, 31. August 2016 12:31
  • Hi Andy,

    vielen Dank für die schnelle Antwort. Das mit RegEx hat mir schonmal weitergeholfen. Mein Beispiel war wohl leider ein bisschen blööd.

    Neues Beispiel wäre:

    $string = "23 Hallo PS Community RD345678 ABCD Test 382" 

    Mit deinem Code würde ich dann noch die 23 und die 382 noch stehen bleiben. Gibt es nicht die Möglichkeit das wenn ich mit

    if($string -match "(RD+\d{6})"){}

    etwas suche, das er mir dann direkt das gefundende in eine Variable schreibt?

    Mittwoch, 31. August 2016 13:27
  • Du meinst sowas?

    PS U:\> '23 Hallo PS Community RD345678 ABCD Test 382' -replace '.*RD(\d{6}).*','$1'
    345678
    $FileName = '23 Hallo PS Community RD345678 ABCD Test 382'
    $FileNr = $FileName -replace '.*RD(\d{6}).*','$1'
    $FileNr



    Beste Gruesse
    brima
    Mittwoch, 31. August 2016 15:12
  • Lars,

    vielleicht noch als Tipp: Wenn Du mit '-match' eine Vergleichsoperation durchführst und einen Treffer landest, dann wird automatisch die Variable '$Matches' erzeugt und mit dem Vergleichsergebnis gefüllt. Wenn Du Dir diese Variable nach Deinem Vergleich ausgeben läßt und damit und vielleicht mit Deiner Klammersetzung im Regex-Muster ein wenig 'spielst', dann findest Du sicher schnell raus, wie Du das nutzbringend anwenden kannst. 

    PS:>'23 Hallo PS Community RD345678 ABCD Test 382' -match '(RD(\d{6}))'
    True
    
    PS:>$Matches
    
    Name                           Value
    ----                           -----
    2                              345678
    1                              RD345678
    0                              RD345678

    Grüße aus dem sonnigen Berlin
    (79,108,97,102|%{[char]$_})-join''

    • Bearbeitet BOfH-666 Montag, 5. September 2016 14:39
    Montag, 5. September 2016 08:50