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-Item
nachdem 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
[DateTime]::TryParseExact
um zu testen, ob die ersten 8 Zeichen ein gültiges Datum sein können$_.lastwritetime.tostring("yyyyMMdd ")
zum Formatieren derzuletzt geschriebenBriefmarke
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)) }