Prefixar nomes de arquivos com vários nomes de pastas pai no cmd

2

Desafio

Expandindo this post, como você pode prefixar nomes de arquivo para inclua seus nomes de pastas pai. A resposta de @dbenham (veja abaixo) é ótima, mas apenas prefixar 'o nome da pasta pai imediata no nome do arquivo. Nenhum Powershell permitiu!

Antes:

C:\Photos\cats
fileA.txt
fileB.txt
fileC.txt

Depois:

C:\Photos\cats
Photos_cats_fileA.txt
Photos_cats_fileB.txt
Photos_cats_fileC.txt

Onde o divisor "_" pode ser qualquer caractere.

Próximo da solução

@ O código de dbenham de this post é o seguinte:

@echo off
pushd "Folder"
for /d %%D in (*) do (
  pushd "%%D"
  for /r %%F in (*) do (
    for %%P in ("%%F\..") do (
      ren "%%F" "%%~nxP_%%~nxF"
    )
  )
  popd
)
popd

O que faz

C:\Photos\cats
cats_fileA.txt
cats_fileB.txt
cats_fileC.txt

Novamente, isso não inclui "Fotos". Como incluir?

Preemptive obrigado!

    
por PizzaAndCode 18.09.2018 / 22:04

1 resposta

0

Para incluir o caminho de arquivo completo, você precisará fazer algum processamento variável, que não funciona no lote for loops sem ativar a expansão atrasada.

Use o arquivo de lote abaixo no lugar do que você tinha originalmente.

@echo off
pushd "Folder"
setlocal enabledelayedexpansion
for /d %%D in (*) do (
  pushd "%%D"
  for /r %%F in (*) do (
    for %%P in ("%%F\..") do (
      set _path=%%~pnxP
      set _path=!_path:~1!
      ren "%%F" "!_path:\=_!_%%~nxF"
    )
  )
  popd
)
popd

As diferenças são:

  • setlocal enabledelayedexpansion - ativar a expansão atrasada
  • set _path=%%~pnxP - cria uma variável para armazenar o caminho completo (excluindo a letra da unidade) do arquivo
  • set _path=!_path:~1! - o caminho completo inclui o \ em C:\ no começo, então precisamos remover isso.
  • echo "%%F" "!_path:\=_!_%%~nxF" - substitua as barras invertidas por sublinhados
por 18.09.2018 / 22:30