none
Problem mit RegEx Befehl aus eingelesener Textdatei RRS feed

  • Frage

  • Hallo,

    folgendes Problem: Ein Teil eines scriptes soll bestimmte Zeichenketten in Dateinamen ändern oder manchmal auch ganz löschen. Hierzu wird der Inhalt einer Textdatei mit split, rename und replace eingelesen, was im Großen und Ganzen auch funktioniert.
    So wird aus z.B. aus  „test-datei-s01e04.mkv“ wie gewünscht „Test.Datei.s01e04.mkv“
    Habe ich aber eine Datei namens „irgendeine-test-datei-s01e04.mkv“ so wird daraus „.Test.Datei.s01e04.mkv“.
    Das erste Wort „irgendeine“ wird wie gewünscht durch nichts ersetzt, also gelöscht. Folgerichtig ist der Punkt das erste Zeichen des neuen Wortes, welchen ich nun gelöscht haben möchte.
    Da ein Punkt ein Sonderzeichen darstellt, habe ich versucht den ersten Punkt eines Dateinamens mit Regex anzusprechen, also ^[.]
    Diese Konvention sollte eigentlich stimmen, zumindest wird mir der erste Punkt einer Testdatei auf http://regexpal.com/ korrekt angezeigt.
    Kann mir jemand sagen, warum der erste Punkt eines Dateinamens nach meiner Methode nicht gelöscht wird und wie ich dies bewerkstelligen kann?
    Danke schon mal für eure Hilfe!
    Hier noch das script und ein Teil der Textdatei, die als Basis für das Umbenenen der Dateien dient.

    Sönke

    $ExcludeMove = Get-ChildItem -Path W:\Quelle -Exclude "Sortieren", "Videos"
    
    $StringsDifferent = get-content "C:\Program Files\Scripte\Andere Scripte\ReplaceStrings\List\StringsDifferent2.txt" 
    
    foreach ($String in $StringsDifferent)
    {
    $String = $String.Split(';')
    Get-ChildItem -recurse -include '*s0*', '*10*' -exclude '*.rar'  $ExcludeMove  |Rename-Item -newname {$_  -replace '$String[0]', '$String[1]' } 
    }

    [-];.
    dies;das
    jenes;welches
    irgendeine;
    etwas;
    ^[.];


    • Bearbeitet Sönke T Mittwoch, 23. Oktober 2013 10:04 Fehler
    Mittwoch, 23. Oktober 2013 10:01

Antworten

  • Hallo,

    du hast meinen letzten Beitrag nicht gelesen, also den vor deiner Antowrt mit der Fehlermeldung, den genau darum geht es

    $_ ---> $_.Name

    $_ ist ein System.IO.FileInfo Objekt und das willst du ja nicht umbenennen sondern "nur" die Property Name dieses Objektes.

    Und nur so als Info, eine Datei darf z.B.: nicht den Name com1 haben.

    PS E:\aaa> Rename-Item abc.txt com1
    Rename-Item : Der Pfad "com1" kann nicht verarbeitet werden, da das Ziel für einen reservierten Gerätenamen steht.
    In Zeile:1 Zeichen:1
    + Rename-Item abc.txt com1
    + ~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : WriteError: (com1:String) [Rename-Item], IOException
        + FullyQualifiedErrorId : RenameError,Microsoft.PowerShell.Commands.RenameItemCommand



    Beste Gruesse
    brima




    • Bearbeitet brima Donnerstag, 24. Oktober 2013 13:13
    • Als Antwort markiert Sönke T Donnerstag, 24. Oktober 2013 13:25
    Donnerstag, 24. Oktober 2013 12:56

Alle Antworten

  • Hallo,

    so:

    ".AAA.BBB.CCC" -replace ('^\.','')

    Beste Gruesse
    brima
    Mittwoch, 23. Oktober 2013 10:22
  • Hallo,

    @brima: Danke für deine Antwort, funktioniert in meinem Fall leider nicht! Der Befehl an sich funktioniert nur direkt in der Powerschell, aber nicht wenn ich diese mit get-content aus einer Textdatei einlese. (Vermutlich liegt es daran).

    Direkt in der Konsole funktioniert mein regex nach deiner Methodde

    ".AAA.BBB.CCC" -replace '^[.]',''

    sowie deine Methode

    ".AAA.BBB.CCC" -replace ('^\.','')

    Beide Methoden direkt in die Textdatei eingetragen und durch obiges script eingelesen funktionieren aber nicht:

    dies;das
    ^\.;
    jenes;welches
    ^[.];
    

    Mittwoch, 23. Oktober 2013 11:52

  • Hallo,

    nein das liegt an de Aufloesung der Variablen in den runden Klammern, nach dem -replace, die zwischen '' nicht gemacht wird!


    aendere

    ('$String[0]', '$String[1]')

    in

    ("$($String[0])", "$($String[1])")

    PS E:\scripte> $string[0]
    ^\.
    PS E:\scripte> $string[1]
    
    PS E:\scripte> ".aaa.bbb.ccc" -replace '$String[0]', '$String[1]'
    .aaa.bbb.ccc
    PS E:\scripte> ".aaa.bbb.ccc" -replace "$String[0]", "$String[1]"
    .aaa.bbb.ccc
    PS E:\scripte> ".aaa.bbb.ccc" -replace "$($String[0])", "$($String[1])"
    aaa.bbb.ccc



    Best Gruesse
    brima


    • Bearbeitet brima Mittwoch, 23. Oktober 2013 13:30
    Mittwoch, 23. Oktober 2013 13:25
  • Hallo zusammen,

    @brima: funktioniert leider immer noch nicht. Dein Beispiel konnte ich erfolgreich an der console nachstellen, nachdem ich mit $string[0] = "^[.]" die variable gesetzt habe.

    im script mit deiner Lösung funktioniert das leider nicht mehr (In der eingelesenen Textdatei habe ich einmal nur den Wert ^[.] und einmal nur den Wert ^\. gespeichert).

    So sieht das script mit deiner Lösung aus:

    $ExcludeMove = Get-ChildItem -Path W:\Quelle -Exclude "Sortieren", "Videos"
    
    $StringsDifferent = get-content "C:\Program Files\Scripte\Andere Scripte\ReplaceStrings\List\StringsDifferent2.txt" 
    
    foreach ($String in $StringsDifferent)
    {
    $String = $String.Split(";")
    Get-ChildItem -recurse -include "*s0*", "*10*" -exclude "*.rar"  $ExcludeMove  |Rename-Item -newname {$_ -replace("$($String[0])", "$($String[1])")} 
    }

    Noch irgendwelche Ideen?


    Donnerstag, 24. Oktober 2013 10:45
  • Hallo,

    ich habe hier keine Probleme mit meiner Loesung, Du kannst aber noch folgendes Versuchen, um die "Variablenaufloesung" nach dem Repalce zu vereinfachen!

    Nach dieser Zeile $String = $String.Split(";") ist $String einArray mit dem Count 2, du koennte die Werte in einzelne Variablen speichern und diese
    verwenden.

    $StringA = $String[0]
    $StringB = $String[1]

    und dann aus $_ -replace("$($String[0])", "$($String[1])")

    $_ -replace("$StringA", "$StringB"),(mit oder ohne Klammern) man spart sich so die AdHoc Variablen Syntax $()

    Siehe hier:

    PS U:\> $string = ('^\.','')
    PS U:\> $string[0]
    ^\.
    PS U:\>
    PS U:\> $string[1]
    
    PS U:\>
    PS U:\> $StringA = $string[0]
    PS U:\> $StringB = $string[1]
    PS U:\> $StringA
    ^\.
    PS U:\>
    PS U:\> $StringB
    
    PS U:\> ".aaa.bbb.ccc" -replace '$string[0]','$string[1]'
    .aaa.bbb.ccc
    PS U:\> ".aaa.bbb.ccc" -replace "$string[0]","$string[1]"
    .aaa.bbb.ccc
    PS U:\> ".aaa.bbb.ccc" -replace "$($string[0])","$($string[1])"
    aaa.bbb.ccc
    PS U:\> ".aaa.bbb.ccc" -replace '$stringA','$stringB'
    .aaa.bbb.ccc
    PS U:\> ".aaa.bbb.ccc" -replace "$stringA","$stringB"
    aaa.bbb.ccc
    PS U:\>

    Beste Gruesse
    brima
    Donnerstag, 24. Oktober 2013 11:12
  • Hallo,

    aber das ist ja noch ein ganz anderes Problem ...

    ... -newname {$_ -replace ...

    aendere das in

    ... -newname {$_.Name -replace ...

    Das habe ich leider voellig uebersehen.

    PS E:\aaa> Get-ChildItem *.* -Exclude *abc*
    
    
        Verzeichnis: E:\aaa
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        24.10.2013     13:35          0 .Textdokument.txt
    
    
    PS E:\aaa> Get-ChildItem *.* -Exclude *abc* | Rename-Item -newname {$_ -replace "$($string[0])","$($string[1])"}
    PS E:\aaa> dir
    
    
        Verzeichnis: E:\aaa
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        24.10.2013     13:35          0 .Textdokument.txt
    -a---        18.09.2013     10:20          0 abc.txt
    
    
    PS E:\aaa> Get-ChildItem *.* -Exclude *abc* | Rename-Item -newname {$_.name -replace "$($string[0])","$($string[1])"}
    PS E:\aaa> dir
    
    
        Verzeichnis: E:\aaa
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        18.09.2013     10:20          0 abc.txt
    -a---        24.10.2013     13:35          0 Textdokument.txt



    Beste Gruesse
    brima

    Donnerstag, 24. Oktober 2013 11:39
  • Hallo,

    diesmal bekomme ich immerhin eine Fehlermeldung:

    (Unter dem script, fett und kursiv)

    PS C:\Users\admin> $ExcludeMove = Get-ChildItem -Path W:\Quelle -Exclude "Sortieren", "Videos" $StringsDifferent = get-content "C:\Program Files\Scripte\Andere Scripte\ReplaceStrings\List\StringsDifferent2.txt" foreach ($String in $StringsDifferent) { $StringA = $String[0] $StringB = $String[1] Get-ChildItem -recurse -include "*s0*", "*10*" -exclude "*.rar" $ExcludeMove |Rename-Item -newname {$_ -replace("$StringA", "$StringB")} }

    Rename-Item : Ein Umbenennen ist nicht möglich, da das angegebene Ziel einen Pfad- oder Gerätenamen darstellt. Bei Zeile:9 Zeichen:92 + Get-ChildItem -recurse -include "*s0*", "*10*" -exclude "*.rar" $ExcludeMove |Rename-Item <<<< -newname {$_ -replace("$StringA", "$StringB")} + CategoryInfo : InvalidArgument: (:) [Rename-Item], PSArgumentException + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.RenameItemCommand Rename-Item : Ein Umbenennen ist nicht möglich, da das angegebene Ziel einen Pfad- oder Gerätenamen darstellt. Bei Zeile:9 Zeichen:92 + Get-ChildItem -recurse -include "*s0*", "*10*" -exclude "*.rar" $ExcludeMove |Rename-Item <<<< -newname {$_ -replace("$StringA", "$StringB")} + CategoryInfo : InvalidArgument: (:) [Rename-Item], PSArgumentException + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.RenameItemCommand

    läuft also immer noch nicht. (Direkt in die Konsole eingegeben, funktioniert es wie die Beispiele zuvor auch).

    Donnerstag, 24. Oktober 2013 12:23
  • Hallo,

    du hast meinen letzten Beitrag nicht gelesen, also den vor deiner Antowrt mit der Fehlermeldung, den genau darum geht es

    $_ ---> $_.Name

    $_ ist ein System.IO.FileInfo Objekt und das willst du ja nicht umbenennen sondern "nur" die Property Name dieses Objektes.

    Und nur so als Info, eine Datei darf z.B.: nicht den Name com1 haben.

    PS E:\aaa> Rename-Item abc.txt com1
    Rename-Item : Der Pfad "com1" kann nicht verarbeitet werden, da das Ziel für einen reservierten Gerätenamen steht.
    In Zeile:1 Zeichen:1
    + Rename-Item abc.txt com1
    + ~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : WriteError: (com1:String) [Rename-Item], IOException
        + FullyQualifiedErrorId : RenameError,Microsoft.PowerShell.Commands.RenameItemCommand



    Beste Gruesse
    brima




    • Bearbeitet brima Donnerstag, 24. Oktober 2013 13:13
    • Als Antwort markiert Sönke T Donnerstag, 24. Oktober 2013 13:25
    Donnerstag, 24. Oktober 2013 12:56
  • Hallo zusammen,

    @Brima: Danke, funktioniert wunderbar!!! Deinen vorherigen Post hatte ich übersehen, F5 hätte da wohl geholfen!!!

    Nochmals danke für die ausdauernde und schnelle Hilfe!!!


    • Bearbeitet Sönke T Donnerstag, 24. Oktober 2013 13:29 Fehler
    Donnerstag, 24. Oktober 2013 13:28