Powershell benennt mehrere Dateien mit dem Präfix „LastWriteTime“ um

Powershell benennt mehrere Dateien mit dem Präfix „LastWriteTime“ um

Ich versuche, ein Powershell-Skript zusammenzustellen, das:

-Rekursive Suche von einem Stammverzeichnis aus
-Dateien mit vorhandenem Dateinamenpräfix "yyyyMMdd" ausschließen
-Die oben nicht ausgeschlossenen Dateien mit dem Dateinamenpräfix "yyyyMMdd" umbenennen, basierend auf ihrer spezifischen LastWriteTime

Hinweis: Idealerweise sollte dieses Skript alle Dateityperweiterungen enthalten

Ich habe es selbst versucht, aber das geht wohl über meinen Horizont, denn meine Versuche verlaufen nicht erfolgreich.

Dank im Voraus.

http://ss64.com/ps/syntax-stampme.html

#StampMe.ps1
param( [string] $fileName)

# Check the file exists
if (-not(Test-Path $fileName)) {break}

# Display the original name
"Original filename: $fileName"

$fileObj = get-item $fileName

# Get the date
$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"

$extOnly = $fileObj.extension

if ($extOnly.length -eq 0) {
   $nameOnly = $fileObj.Name
   rename-item "$fileObj" "$nameOnly-$DateStamp"
   }
else {
   $nameOnly = $fileObj.Name.Replace( $fileObj.Extension,'')
   rename-item "$fileName" "$nameOnly-$DateStamp$extOnly"
   }

# Display the new name
"New filename: $nameOnly-$DateStamp$extOnly"

Ich hoffe, die Zeile ändern zu können:

$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"

Es sollte „LastWriteTime“ statt „get-date“ sein, aber ich habe keine Ahnung, wie ich das hinbekommen soll.

Dieser Code (aus einer anderen Super-User-Frage):

Get-ChildItem "Test.pdf" | Rename-Item -newname {$_.LastWriteTime.toString("yyyyMMdd") + " Test.pdf"}

... benennt eine einzelne Datei erfolgreich um, aber ich kann dies anscheinend nicht in das größere Skript integrieren.


In Bezug auf die rekursive Ausführung des obigen Vorgangs habe ich Folgendes versucht (auch vonhttp://ss64.com/ps/syntax-stampme.html):

foreach ($file in get-ChildItem *.* -recurse) { ./StampMe.ps1 $file.name }

Dadurch wird das PS-Skript erfolgreich auf Dateien im Stammverzeichnis angewendet, die Anwendung auf Dateien in der Unterordnerstruktur, die sich vom Stammverzeichnis aus erstreckt, schlägt jedoch fehl.

Antwort1

Dieses Skript sollte genau das tun, was Sie wollen

  • Rekursive Suche aus einem Stammverzeichnis
  • Dateien mit vorhandenem Dateinamenpräfix „yyyyMMdd“ ausschließen
  • Benennen Sie die oben nicht ausgeschlossenen Dateien mit dem Dateinamenpräfix „yyyyMMdd“ basierend auf ihrer spezifischen LastWriteTime um

Achtung: Sie sollten dieses Skript zuerst testen, da das Umbenennen gefährlich sein kann. Entfernen Sie das #vor „, Rename-Itemnachdem Sie sichergestellt haben, dass nur beabsichtigte Dateien umbenannt werden.“

Lange Version

$folder = "C:\somefolder"
$files = get-childitem -path $folder -recurse | where { -not $_.PSIsContainer }
[datetime]$dirDate = New-Object DateTime

foreach ($file In $files) {

    $strDate = $file.Name.substring(0,8)

    if (-Not [DateTime]::TryParseExact($strDate, "yyyyMMdd", 
        [System.Globalization.CultureInfo]::InvariantCulture, 
        [System.Globalization.DateTimeStyles]::None, [ref]$dirDate)) {

        $newName = $file.lastwritetime.tostring("yyyyMMdd ") + $file.name
        echo $newName
        #Rename-Item -path $file.Fullname -newname $newName
    }   
}

Kurzfassung

[datetime]$dirDate = New-Object DateTime

dir "C:\somefolder" -r | ? { ! $_.PSIsContainer } | % {          

    if ( ! [DateTime]::TryParseExact($_.Name.substring(0,8), "yyyyMMdd", 
        [System.Globalization.CultureInfo]::InvariantCulture, 
        [System.Globalization.DateTimeStyles]::None, [ref]$dirDate)) {

        $newName = $_.lastwritetime.tostring("yyyyMMdd ") + $_.name
        echo $newName
        #Ren $_.Fullname $newName
    }
}

Verwendete Stackoverflow-Antworten

Antwort2

Ich habe versucht, etwas Ähnliches zu tun – z. B. Dateien basierend auf der letzten Schreibzeit umzubenennen. Hier ist die Powershell, die das macht:

  • Benennt alle/alle Dateien im aktuellen Verzeichnis um
  • Behält Dateierweiterungen bei
  • Namen im Format jjjj-MM-tt HH-mm-ss (24 Std.)

ls | % { Rename-Item $_ -NewName ($_.LastWriteTime.ToString("yyyy-MM-dd HH-mm-ss") + ($_.extension)) }

verwandte Informationen