Benutzer mit den meisten Antworten
Problem mit RegEx Befehl aus eingelesener Textdatei

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
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
Alle Antworten
-
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 ^[.];
-
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
-
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?
-
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 -
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 -
Hallo,
diesmal bekomme ich immerhin eine Fehlermeldung:
(Unter dem script, fett und kursiv)
läuft also immer noch nicht. (Direkt in die Konsole eingegeben, funktioniert es wie die Beispiele zuvor auch).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
-
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
-
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