powershellnoob
Goto Top

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

$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.

Content-ID: 4746980581

Url: https://administrator.de/forum/powershell-nur-5-unterstrich-ersetzen-4746980581.html

Ausgedruckt am: 11.04.2025 um 17:04 Uhr

emeriks
emeriks 24.11.2022 um 14:50:33 Uhr
Goto Top
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.

$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.
3063370895
3063370895 24.11.2022 aktualisiert um 15:01:05 Uhr
Goto Top
Hi,
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 face-smile
powershellnoob
powershellnoob 24.11.2022 aktualisiert um 15:02:19 Uhr
Goto Top
Vielen Dank emeriks, funktioniert genauso wie ich mir das vorgestellt habe.
Das es nicht schön ist wäre egal, die Hauptsache ist es funktioniert face-smile

Crazy wie du in der kurzen Zeit darauf gekommen bist.
TK1987
TK1987 24.11.2022 aktualisiert um 15:12:07 Uhr
Goto Top
Moin,

alternativ mit einem bisschen RegEx
ls -r $path\* -include *_*_*_*_*_* |%{
  ren $_  -NewName ($_.Name  -replace "^((.*?_){4}.*?)_",'$1,')  
}

Gruß Thomas
3063370895
3063370895 24.11.2022 um 15:15:00 Uhr
Goto Top
Irgendwann muss ich mir die dunkle Magie, die man Regex nennt, aneignen...
emeriks
emeriks 24.11.2022 um 15:15:42 Uhr
Goto Top
Zitat von @powershellnoob:
Crazy wie du in der kurzen Zeit darauf gekommen bist.
Och, Hexenwerk ist meine Spezialität. face-wink
emeriks
emeriks 24.11.2022 um 15:16:20 Uhr
Goto Top
Zitat von @chaot1coz:
Irgendwann muss ich mir die dunkle Magie, die man Regex nennt, aneignen...
Ich habs aufgegeben. Bin zu alt für diesen Schei...
Crusher79
Crusher79 24.11.2022 um 15:26:49 Uhr
Goto Top
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 ^^


$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 
}
TK1987
TK1987 24.11.2022 um 15:41:28 Uhr
Goto Top
Moin,

Zitat von @Crusher79:
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
In diesem Fall wird geprüft, ob vor dem Wort "world" eine Zeichenkette steht, in der das Wort "world" schon mal vorkommt.

Gruß Thomas
Crusher79
Crusher79 24.11.2022 um 15:52:02 Uhr
Goto Top
https://www.script-example.com/regex-powershell

Finde das nicht schlecht. Wirkt relativ komplett face-wink

Und den hier hatten wir ja auch oft. Nur wenn man es eilig hat ^^

https://danielfett.de/2006/03/20/regulaere-ausdruecke-tutorial/