silvereye
Goto Top

Powershell oder batch in einem Verzeichnis Dateien mit einer Länge "x" finden und hinteren Teil der Datei auf Länge "x" "abschneiden". Die geänderten Dateien in eine Log-Datei schreiben

Hallo Experten,

leider bin ich kein Experte und suche nach einer Lösung, um in einem Verzeichnis mit vielen Unterverzeichnissen und jeweiligen Dateien automatisiert (also nicht einzeln) Dateien ab einer Pfadlänge „X“ zu finden und diese dann auf die maximale Pfadlänge „X“ incl. dem Dateityp bzw. Dateiformat umzubenennen.
Die Umbenennung soll durch abschneiden der letzten Zeichen des Dateinamens (ohne die Veränderung des Dateiformates) erfolgen. Falls sich durch das Abschneiden gleiche Dateinamen in dem jeweiligen im Verzeichnispfad ergeben sollten, wird das letzte Zeichen des Dateinamens (mit der Länge X-2“ durch eine Zahl ersetzt:
Ein Beispiel:
Ist:
\\server\jetzt kommt ein Beispielpfad der sehr lang ist\Und ein sehr langer Dateiname der auf einen Wert X gekürzt werden soll.pdf (130 Zeichen)

Soll:
\\server\jetzt kommt ein Beispielpfad der sehr lang ist\Und ein sehr langer Dateiname der auf einen Wert X gekürzt w.pdf (120 Zeichen)

Falls im gleichen Verzeichnis durch eine vorherige Umbenennung zu einem gleichen Dateinamen kommen sollte, dann soll der nächste gleiche Dateiname zum schon geänderten Dateinamen so aussehen:
\\server\jetzt kommt ein Beispielpfad der sehr lang ist\Und ein sehr langer Dateiname der auf einen Wert X gekürzt_1.pdf (120 Zeichen)
\\server\jetzt kommt ein Beispielpfad der sehr lang ist\Und ein sehr langer Dateiname der auf einen Wert X gekürzt_2.pdf (120 Zeichen)
\\server\jetzt kommt ein Beispielpfad der sehr lang ist\Und ein sehr langer Dateiname der auf einen Wert X gekürzt_3.pdf (120 Zeichen)
usw.

Für die Dateien, welche gefunden und geändert worden sind soll eine Log-Datei (csv-Format) geschrieben werden in der der Pfad vorher und mit einem Trennzeichen (z.B.: Semikolon) der Pfad nachher steht:
\\server\..... Pfad incl. Dateiname vorher; \\server\..... Pfad incl. Dateiname nachher

Für eine Lösung wäre ich sehr dankbar.

Viele Grüße

Content-ID: 399732

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

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

colinardo
colinardo 30.01.2019 aktualisiert um 10:08:13 Uhr
Goto Top
Servus @silvereye , willkommen auf Administrator.de!
Kommentare erspare ich mir an dieser Stelle mal, die stehen im PS-Code.
#----------
# Directory to recurse into
$dir = 'D:\pfad'  
# max length
$max_len = 120
# logfile path
$logfile = 'D:\log.csv'  
#----------
# array which holds log objects
$log = @()
# recurse directory and filter files with full-path longer than $max_len
gci $dir -File -Recurse | ?{$_.Fullname.length -gt $max_len} | %{
    # calculate new filename length
    $len = $_.Basename.length-($_.Fullname.length - $max_len)
    # if filename results in an empty length name, write error in log and jump to next file
    if ($len -le 0){
        Write-Error "Filename: '$($_.FullName)'`ncannot be shortened because this would result in a truncated directory path." -Category InvalidResult  
        $log += [pscustomobject]@{Before=$_.FullName;After="-";Action="File cannot be shortened because this would result in a truncated directory path."}  
        return
    }
    # create new filename
    $new = $_.Basename.Substring(0,$len) + $_.Extension
    # test if file already exists and if so, generate new name
    $cnt = 1
    while(Test-Path "$($_.DirectoryName)\$new"){  
        $new = $_.Basename.Substring(0,$len-("_$cnt".Length)) + "_$cnt" + $_.Extension  
        $cnt++
    }
    # rename item
    rename-item $_.FullName -NewName $new -Force -verbose
    # write log
    $log += [pscustomobject]@{Before=$_.FullName;After="$($_.DirectoryName)\$new";Action="OK"}  
}
# export log to csv file
$log | export-csv $logfile -Delimiter ";" -NoType -Encoding UTF8  
Für eine Lösung wäre ich sehr dankbar.
Bedanken darfst du ich jederzeit hier.

Viel Spaß
Grüße Uwe
silvereye
silvereye 30.01.2019 um 20:09:41 Uhr
Goto Top
Hallo Uwe,

vielen Dank für Deine Lösung.
Funktioniert super.

Gruß
Oliver