joe65
Goto Top

Dateierweiterung mit Powershell ändern

Ich arbeite unter dem Betriebsystem Windows 10 mit der Powershell-Version: 5.1.19041.906

Ich habe Dateien, die im Basenamen und in der Extension den String "_invalid" haben, z.B.:
hallo_invalid.cpp_invalid
aaa_invalid.h_invalid
blabla_invalid.txt_invalid

Meine Frage:
Gibt es eine Powershell-Kommando (wenn möglich Einzeiler) der mir nur in der Extension das "_invalid" entfernt.
Als Ergebnis sollte also rauskommen:
hallo_invalid.cpp
aaa_invalid.h
blabla_invalid.txt
Allgemein soll es so sein, dass von der Extension (egal welcher) nur der String "_invalid" entfernt wird, der Basename aber davon nicht betroffen wird.
Ich habe schon folgenden Code probiert:
gci "C:\Meine_Dateien\Test" -File -Rec | ? { $_.extension -match '_invalid' } | Rename-Item -NewName { $_.name -replace '_invalid', '' } -WhatIf  
Mit diesen Code wird leider auch im Basenamen der String "_invalid" mit entfernt.

Content-ID: 665839

Url: https://administrator.de/contentid/665839

Ausgedruckt am: 25.11.2024 um 15:11 Uhr

148121
Lösung 148121 18.04.2021 aktualisiert um 11:51:09 Uhr
Goto Top
Kleine Änderung im Regex große Wirkung 😜
gci "C:\Meine_Dateien\Test" -File -Rec | ?{$_.extension -match '_invalid$'} | Rename-Item -NewName {$_.name -replace '_invalid$' }  
Gruß w.
em-pie
em-pie 18.04.2021 um 11:51:52 Uhr
Goto Top
Moin,

Mit diesen Code wird leider auch im Basenamen der String "_invalid" mit entfernt.

Das ist ja auch logisch, denn du schreibst ja, dass er dir im $_.name das _invaild ersetzen soll.
Du willst ja, dass er dir aber im $._extension den Begriff ersetzt.

Nach einer Lösung müsstest du einmal selbst gezielt schauen - dafür reichen meine ad hoc PS-KEnntnise noch nicht.

Lediglich einen Mehrzeiler habe ich auf die Schnelle finden können:
$path = "D:\Code\PowerShell\StackOverflow"  
$pattern = "*~*"  
Get-ChildItem $path -Recurse -File | Where-Object {$_.Name -like $pattern} |
    ForEach-Object {
        $directory = $_.DirectoryName                # or [System.IO.Path]::GetDirectoryName($_.FullName)  or use Split-Path $_.FullName -Parent
        $filename  = $_.BaseName -replace '~+', '-'  # or [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -replace '~+', '-'  
        $extension = $_.Extension                    # or [System.IO.Path]::GetExtension($_.Name)
        if (![string]::IsNullOrEmpty($extension)) { $filename += $extension.ToLower() }
        $newname = Join-Path -Path $directory -ChildPath $filename
        Rename-Item -LiteralPath $_.FullName -NewName $newName -Force
    }

Quelle: https://stackoverflow.com/questions/52661728/powershell-bulk-replacing-a ...
GarfieldBonn
GarfieldBonn 18.04.2021 um 13:59:43 Uhr
Goto Top
(gci "C:\Temp\Test" -File -Rec).Name | Rename-Item -NewName { ($_).TrimEnd('_invalid')} -WhatIf   
148121
148121 18.04.2021 aktualisiert um 17:09:26 Uhr
Goto Top
Zitat von @GarfieldBonn:

(gci "C:\Temp\Test" -File -Rec).Name | Rename-Item -NewName { ($_).TrimEnd('_invalid')} -WhatIf   
Nöp dat tädet so ned .... Erstens müsste dort dann FullName statt Name stehen (ist übrigens überflüssig nur die Property über die Pipeline zu schicken) und zweitens würde bei Dateien bei denen eben nichts zu replacen ist ein Fehler geworfen werden weil eine Datei ja bekanntlich nicht mit dem gleichen Namen umbenannt werden kann 😉.