Adicionando data ao nome de vários arquivos em várias pastas

1

Eu tenho um diretório que contém mais de 400 subpastas. Em cada uma dessas subpastas, um novo arquivo é exibido todos os dias. Cada novo arquivo tem o mesmo nome do arquivo que apareceu na mesma pasta ontem. Cada pasta contém arquivos com nomes diferentes dos da outra pasta, mas os novos arquivos na mesma pasta sempre têm o mesmo nome. Eu não quero que os arquivos sejam sobrescritos todos os dias. Em vez disso, gostaria que o Powershell adicionasse a data de hoje após o nome do arquivo e antes da extensão. Eu sei como fazer isso para uma única subpasta, mas não quero criar mais de 400 scripts (um para cada subpasta).

Este é o script que faz o trabalho perfeitamente para cada pasta .

$fileToRename = "E:\Backup\ABLBackup\folder1\Project1.txt"
if (Test-Path $fileToRename)

    {
    $fileName = [system.io.path]::GetFileNameWithoutExtension($fileToRename)
    $dateSuffix = get-date -Format 'yyyy_MM_dd'
    $fileExtension = [system.io.path]::GetExtension($fileToRename)
    $newFileName = '{0}_{1}{2}' -f $fileName, $dateSuffix, $fileExtension
    Rename-Item -Path $fileToRename -NewName $newFileName
}

Gostaria de saber como modificar o script acima para que todas as mais de 400 subpastas possam ser incluídas em um script. Eu sei que posso repetir o mesmo comando 400 + vezes e salvá-lo como um script, mas isso não é viável porque os usuários adicionam novas pastas sem me informar. Certamente deve haver alguma forma automática de obter todos os novos arquivos que aparecem nas subpastas.

A estrutura das pastas é assim:

E: \ Backup \ ABLBackup \ folder1 \ Projeto1.txt

E: \ Backup \ ABLBackup \ folder2 \ Project2.txt

E: \ Backup \ ABLBackup \ folder3 \ Project3.txt

E: \ Backup \ ABLBackup \ folder4 \ Project4.txt

Qualquer ajuda será muito apreciada!

    
por QWE 07.03.2016 / 15:43

1 resposta

1

Sou fã de manter as coisas simples, desde que isso não afete o desempenho ou a função. Você poderia adicionar ouvintes para detectar quando novos arquivos são adicionados e renomeá-los automaticamente, mas isso é uma complexidade que eu não estou particularmente interessado em aprender agora, muito menos explicando lol.

Portanto, um simples loop-if-then é o caminho que eu faria.

Primeiro de tudo, você precisa percorrer essas pastas:

Get-ChildItem "E:\Backup\ABLBackup" |
  Where PSIsContainer |
  Foreach-Object {}

De acordo com o que entendi, você precisa verificar se há um novo arquivo (basicamente um que não contenha uma data)

if (Get-ChildItem $_.FullName | Where Name -notlike "*_????_??_??.*") {}

Coloque tudo junto com seu roteiro, arrumado para se adequar:

Get-ChildItem "E:\Backup\ABLBackup" |
  Where PSIsContainer |
  Foreach-Object {
    $newitem = Get-ChildItem $_.FullName | Where Name -notlike "*_????_??_??.*"
    if ($newitem)
    {
        $dateSuffix = get-date -Format 'yyyy_MM_dd'
        $newFileName = '{0}_{1}{2}' -f $newitem.BaseName, $dateSuffix, $newitem.Extension
        Rename-Item $newitem -NewName $newFileName
    }
}

Configure uma tarefa agendada para ser executada a cada meia hora ou algo assim e você está rindo.

    
por 11.03.2016 / 13:46