Batch Renomeia todos os arquivos PNG em pastas e subpastas

0

Estou tentando renomear todos os arquivos PNG dentro de várias subpastas. Veja abaixo minha explicação sobre o que estou fazendo:

What is currently in place:
COMPANY
     SERVER1
         (Random).png
COMPANY2
     SERVER32
         (Random).png

What I want:

COMPANY
     SERVER1
         Company - Server1 - (Date PNG Modified).png
COMPANY2
     SERVER32
         Company2 - Server32 - (Date PNG Modified).png

Como posso conseguir isso? A parte com a qual estou tendo problemas é obter o nome do primeiro e do segundo diretório, bem como a data de modificação que eu posso inserir no nome do arquivo.

O script atual que eu tenho está abaixo:

@echo off
for /r %%D in (.) do (
  for /f "delims=" %%F in ('dir /b /A:-D "%%D\*.png"') do (
    echo ren "D:\FinalDir\%%F" "%%~nxD-VirtualBootTest-3-3-18.png"
)) >> "D:\FinalDir\RenameCommands.txt"


FOR /R "D:\OriginalDir" %%i IN (*.png) DO COPY "%%i" "D:\FinalDir"

O que isso está fazendo agora é reunir todos os arquivos PNG em todos os diretórios da pasta que criam um arquivo em lotes para renomear todos os arquivos que são copiados para o FinalDir. O resultado final da renomeação terminará parecendo SERVER1-VirtualBootTest-3-3-18.png. Eu não consigo descobrir como fazer a data mudar com o arquivo e adicionar o diretório que é dois diretórios acima do arquivo.

    
por Rmuell01 14.03.2018 / 21:27

1 resposta

0

Portanto, este script deve fazer o truque. É relativamente simples.

$files = Get-ChildItem $basePath -File -Filter *.png -Recurse
foreach($file in $files){
    $pathParts = $file.fullName.split('\')
    $dateMod = $file.LastWriteTime.ToString("MM-dd-yyyy")
    $first = $pathParts[-3]
    $second = $pathParts[-2]
    $file | Rename-Item -NewName "$first - $second - $dateMod.txt"
}

Aqui está a parte detalhada por parte:

$files = Get-ChildItem $basePath -File -Filter *.png -Recurse

Primeiro, ele obtém todos os arquivos a partir do caminho base (Você terá que definir a variável $basepath para o seu caminho) recursivamente até o final da estrutura.

foreach($file in $files){
    $pathParts = $file.fullName.split('\')
    $dateMod = $file.LastWriteTime.ToString("MM-dd-yyyy")
    $first = $pathParts[-3]
    $second = $pathParts[-2]
    $file | Rename-Item -NewName "$first - $second - $dateMod.txt"
}

Em seguida, para cada arquivo:

  • Divide o nome completo do arquivo (caminho e nome do arquivo) com base no caractere '\'.

    $pathParts = $file.fullName.split('\')

  • Acessa o lastWriteTime e o formata no formato desejado.

    $dateMod = $file.LastWriteTime.ToString("MM-dd-yyyy")

  • Para as variáveis $first e $second , ele está acessando o caminho que foi dividido do lado direito (-1 seria o nome do arquivo, -2 é pai, -3 é pai desse pai e assim por diante) .

    $first = $pathParts[-3]

    $second = $pathParts[-2]

  • Coloca todas as informações reunidas e renomeia o arquivo para as informações coletadas.

    $file | Rename-Item -NewName "$first - $second - $dateMod.txt"

por 21.03.2018 / 23:25