Я пытаюсь составить скрипт Powershell, который будет:
- Рекурсивный поиск из корневого каталога.
- Исключить файлы с существующим префиксом имени файла "yyyyMMdd".
- Переименовать файлы, не исключенные выше, с префиксом имени файла "yyyyMMdd" на основе их конкретного LastWriteTime.
Примечание: в идеале этот скрипт должен включать все расширения типов файлов.
Я пробовала сама, но, похоже, это выше моих сил, поскольку мои попытки не увенчались успехом.
Заранее спасибо.
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"
Я надеюсь изменить строку:
$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"
Вместо get-date нужно использовать LastWriteTime, но я понятия не имею, как это сделать.
Этот код (из другого вопроса Суперпользователя):
Get-ChildItem "Test.pdf" | Rename-Item -newname {$_.LastWriteTime.toString("yyyyMMdd") + " Test.pdf"}
...успешно переименовывает один файл, но мне не удаётся интегрировать это в более крупный скрипт.
Что касается рекурсивного запуска вышеописанного, я пробовал это (также изhttp://ss64.com/ps/syntax-stampme.html):
foreach ($file in get-ChildItem *.* -recurse) { ./StampMe.ps1 $file.name }
Который успешно применяет скрипт PS к файлам в корневом каталоге, но не может применить его ни к одному файлу в дереве подпапок, которое распространяется из корневого каталога.
решение1
Этот скрипт должен делать именно то, что вам нужно.
- Рекурсивный поиск из корневого каталога
- Исключить файлы с существующим префиксом имени файла "yyyyMMdd"
- Переименуйте файлы, не исключенные выше, с префиксом имени файла ""yyyyMMdd " на основе их конкретного LastWriteTime
Предупреждение: Сначала вам следует протестировать этот скрипт, поскольку переименование может быть опасным. Удалите #
перед ним Rename-Item
после того, как убедитесь, что будут переименованы только намеренные файлы.
Длинная версия
$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
}
}
Укороченная версия
[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
}
}
Использованные ответы stackoverflow
[DateTime]::TryParseExact
для проверки того, могут ли первые 8 символов быть допустимой датой$_.lastwritetime.tostring("yyyyMMdd ")
для форматированияпоследняя записьпечать
решение2
Я пытался сделать что-то подобное - например, переименовать файлы на основе lastwritetime. Вот powershell, который это делает:
- Переименовывает любые/все файлы в текущем каталоге.
- Сохраняет расширения файлов
- Имена в формате гггг-ММ-дд ЧЧ-мм-сс (24 часа)
ls | % { Rename-Item $_ -NewName ($_.LastWriteTime.ToString("yyyy-MM-dd HH-mm-ss") + ($_.extension)) }