Este script deve fazer exatamente o que você quer
- Search recursively from a root directory
- Exclude files with existing "yyyyMMdd " file name prefix
- Rename the files not excluded above with ""yyyyMMdd " file name prefix based on their specific LastWriteTime
Aviso: você deve testar este script primeiro porque a renomeação pode ser perigosa. Remova o #
na frente de Rename-Item
depois de ter verificado que apenas os arquivos intencionais serão renomeados.
Versão longa
$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
}
}
Versão curta
[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
}
}
Respostas usadas do stackoverflow
-
[DateTime]::TryParseExact
para testar se os primeiros 8 caracteres podem ser uma data válida -
$_.lastwritetime.tostring("yyyyMMdd ")
para formatar o carimbo lastwrite