Aqui está uma maneira de fazer isso, usando SubString:
function getNewFileName($fname)
{
$year = $fname.SubString(0,4)
$month = $fname.SubString(4,2)
$day = $fname.SubString(6,2)
$hours = $fname.SubString(9,2)
$minutes = $fname.SubString(11,2)
$seconds = $fname.SubString(13,2)
$new_fname = [string]::Format( "{0}-{1}-{2} {3}.{4}.{5}.jpg", $year,$month,$day,$hours,$minutes,$seconds)
return $new_fname;
}
Para usar isso para renomear uma seleção de entradas de arquivo em uma pasta, você pode usar algo assim:
$fileEntries = Get-ChildItem *_* -name
foreach($fileName in $fileEntries)
{
$newFileName = getNewFileName($fileName)
Write-Host -NoNewLine Rename-Item $filename $newFileName
Write-Host
}
Como escrito, este script não vai realmente mudar nada - ele permite que você visualize o que mudaria, enviando o comando rename proposto para o console. Para realmente renomear os arquivos, você teria que remover as instruções "Write-Host". Este script assume que tudo o que você tem na pasta são os dois tipos de nomes de arquivos que você mencionou.
$fileEntries = Get-ChildItem *_* -name
Seleciona apenas os arquivos que contêm um sublinhado, para que não tentemos renomear o outro tipo de arquivo. Este script deve ser executado na pasta de assunto; executá-lo em outro lugar pode fazer coisas estranhas nos arquivos errados.