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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 399732
Url: https://administrator.de/contentid/399732
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
2 Kommentare
Neuester Kommentar
Servus @silvereye , willkommen auf Administrator.de!
Kommentare erspare ich mir an dieser Stelle mal, die stehen im PS-Code.
Viel Spaß
Grüße Uwe
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