Powershell - nur 5. Unterstrich ersetzen
Hallo zusammen,
ich bin leider totaler Powershellnoob...
Ich versuche mehrere Dateien die in einem Unterordner liegt umzubenennen bzw. nur den 5. "_" durch ein "," zu ersetzen.
Die Datei schaut so aus -> hallo_ich_bin_eine_Da_tei.pdf
Ziel wäre -> hallo_ich_bin_eine_Da,tei.pdf
Das funktioniert auch an sich, leider werden aber alle _ durch , ersetzt.
Man könnte auch bis zum 19. Zeichen zählen da die Dateilänge bis dorthin gleich bleibt.
Ich habe schon mit .substring gespielt aber ich komme einfach nicht drauf wie ich eben nur diesen 5. Unterstrich ersetzen kann.
Ich hoffe ich finde hier Hilfe.
ich bin leider totaler Powershellnoob...
Ich versuche mehrere Dateien die in einem Unterordner liegt umzubenennen bzw. nur den 5. "_" durch ein "," zu ersetzen.
Die Datei schaut so aus -> hallo_ich_bin_eine_Da_tei.pdf
Ziel wäre -> hallo_ich_bin_eine_Da,tei.pdf
$path = "C:\Temp\Ordner1\" #<- hier gibt es mehrere Unterordner mit verschiedenen Namen in denen die .pdf Files liegen.
$character = '_'
$character2 = ','
ls $path -File -recurse | ?{$_.Basename -like "*$character*"} | ren -NewName {$_.Basename.replace($character ,$character2)} -verbose -force
Das funktioniert auch an sich, leider werden aber alle _ durch , ersetzt.
Man könnte auch bis zum 19. Zeichen zählen da die Dateilänge bis dorthin gleich bleibt.
Ich habe schon mit .substring gespielt aber ich komme einfach nicht drauf wie ich eben nur diesen 5. Unterstrich ersetzen kann.
Ich hoffe ich finde hier Hilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 4746980581
Url: https://administrator.de/forum/powershell-nur-5-unterstrich-ersetzen-4746980581.html
Ausgedruckt am: 11.04.2025 um 17:04 Uhr
10 Kommentare
Neuester Kommentar
Hi,
ein einfacher Ansatz wäre:
Name in 6 Teile unterteilen.
Teile wieder zusammensetzen. Teil 1 - 5 mit "_" dazwischen und dann Teil 6 mit "," dazwischen anhängen.
Nicht schön, aber selten.
E.
ein einfacher Ansatz wäre:
Name in 6 Teile unterteilen.
Teile wieder zusammensetzen. Teil 1 - 5 mit "_" dazwischen und dann Teil 6 mit "," dazwischen anhängen.
$path = "C:\Temp\Ordner1\" #<- hier gibt es mehrere Unterordner mit verschiedenen Namen in denen die .pdf Files liegen.
$character = '_'
$character2 = ','
ls $path -File -recurse | ?{$_.Basename -like "*$character*"} | %{
$p = $_.Name -split $character, 6
$newname = "$($p)$character$($p[1])$character$($p[2])$character$($p[3])$character$($p[4])$character2$($p[5])"
$_ | ren -Newname $newname
}
Nicht schön, aber selten.
E.

Hi,
Wenn du dir absolut sicher bist, dass immer das 19. Zeichen ersetzt werden soll:
Auch nicht schön und unflexibel
Wenn du dir absolut sicher bist, dass immer das 19. Zeichen ersetzt werden soll:
$new = $old.remove(18,1).insert(18,",")
Auch nicht schön und unflexibel

Irgendwann muss ich mir die dunkle Magie, die man Regex nennt, aneignen...
Och, Hexenwerk ist meine Spezialität. 
War auch kurz am grübeln. Regex führt mich leider zu String Index. Habs nicht hinbekommen. Zumal der Index plötzlich immer auf den selben Wert Stand. Die hatte es mit Substring gelöst.
https://stackoverflow.com/questions/46898698/replace-a-string-but-only-t ...
Also Komma a der 2. Stelle konnte ich setzen. Wenn ich den Index hochsetzen wolte passierte irgendwiwe nichts. Bzw. frohr der an einer Stelle fest und spuckte immer den gleichen Wert aus.
Dachte $string.IndexOf($find)+1 wäre die Stelle. Nur in meine Test mit _ und , rührte sich wenig.
Regex ist mir auch immer lieber. Nur warum hängt der Index ^^
https://stackoverflow.com/questions/46898698/replace-a-string-but-only-t ...
Also Komma a der 2. Stelle konnte ich setzen. Wenn ich den Index hochsetzen wolte passierte irgendwiwe nichts. Bzw. frohr der an einer Stelle fest und spuckte immer den gleichen Wert aus.
Dachte $string.IndexOf($find)+1 wäre die Stelle. Nur in meine Test mit _ und , rührte sich wenig.
Regex ist mir auch immer lieber. Nur warum hängt der Index ^^
$find="world"
$replace="nice"
$string="the world is world, no?"
$pos=$string.IndexOf($find, $string.IndexOf($find)+1)
if ($pos -ne -1)
{
"{0}{1}{2}" -f $string.Substring(0, $pos), $replace, $string.Substring($pos + $find.Length)
}
else
{
$string
}
Moin,
In diesem Fall wird geprüft, ob vor dem Wort "world" eine Zeichenkette steht, in der das Wort "world" schon mal vorkommt.
Gruß Thomas
Zitat von @Crusher79:
War auch kurz am grübeln. Regex führt mich leider zu String Index. Habs nicht hinbekommen.
War auch kurz am grübeln. Regex führt mich leider zu String Index. Habs nicht hinbekommen.
$find="world"
$replace="nice"
$string="the world is world, no?"
$string -Replace "(?<=^.*$find.*)$find","$replace"
(?<=) | Bedeutet "lookbehind" - prüft, ob etwas vor der zu ersetzenden Zeichenkette steht |
Gruß Thomas
https://www.script-example.com/regex-powershell
Finde das nicht schlecht. Wirkt relativ komplett
Und den hier hatten wir ja auch oft. Nur wenn man es eilig hat ^^
https://danielfett.de/2006/03/20/regulaere-ausdruecke-tutorial/
Finde das nicht schlecht. Wirkt relativ komplett
Und den hier hatten wir ja auch oft. Nur wenn man es eilig hat ^^
https://danielfett.de/2006/03/20/regulaere-ausdruecke-tutorial/