Copie / mova certos tipos de arquivos de subpastas para uma pasta comum

2

Situação:

Numerosas subpastas com nomes de pastas aleatórias contendo vários arquivos com nomes aleatórios. Algumas eu quero manter, outras podem ser deletadas.

Objetivo:

Mova os arquivos com extensões: * .exe * .pdf * .avi ou outras extensões especificadas para fora das subpastas e para uma pasta separada comum sem recriar a estrutura de pastas anterior. Então eu tenho uma pasta com apenas os arquivos que eu quero, deixando para trás qualquer outro tipo de arquivo. Em seguida, registre os nomes de diretórios da subpasta (results-log.log) e exclua as subpastas e tudo que houver nelas.

Exemplo; começando:

  • parent1
    • sub1
      • random1.exe
      • random2.pdf
      • random3.txt
    • sub2
      • random4.exe
      • random5.avi
      • random6.log
      • random7.jpg

Resultado final:

  • parent2
    • results-log.log
    • random1.exe
    • random2.pdf
    • random4.exe
    • random5.avi

Então, procurei outras respostas e parece que preciso de algum tipo de loop FOR, mas não entendo o suficiente sobre como isso funciona com os parâmetros para fazer o que preciso. Movendo arquivos pdf para pasta pai da subpasta com variável nomes é um exemplo que eu examinei e examinei a leitura sugerida, mas não entendo como os parâmetros e variáveis funcionam. Especialmente onde eu preciso cobrir vários tipos de arquivos.

Até agora, estou vendo algo assim:

@ECHO OFF
SETLOCAL EnableExtensions
set "_parent=c:\logs\cache\"
set "_dest=c:\archive\"
for /D /r %%G in ("%_parent%\*") do (
  if exist "%%~G\*.pdf" (
    echo move /B "%%~G\*.pdf" "%_dest%\"
  ) else (
    echo nothing to copy "%%~G\*.pdf" "%_parent%\"
  )
)
  • Linha 3 Acredito que define "c: \ logs \ cache \" como a pasta pai, portanto, no meu exemplo sobre isso seria igual a "parent1"
  • A linha 4 deve definir o destino da pasta de exemplo "parent2" como "c: \ archive"
  • A linha 5 é %%G correta? Importa o que a carta é?
  • Linha 6 como especifico as outras extensões de arquivo que desejo procurar?
  • Linha 7 eu quero usar move ou outra coisa, e qual é o parâmetro /B ? /y é o único que eu conheço para move .

Espero que isso seja informação suficiente, possa editar conforme necessário para mais informações.

    
por WraythOsu 19.10.2015 / 22:34

1 resposta

3

Tudo o que você precisa fazer é fazer várias declarações if , eu acho. Então, dentro do seu loop, ficaria assim:

IF exist "%%G\*.pdf" (
    move /Y "%%G\*.pdf" "%_dest%\"
    echo %%G>>"%_dest%\results-log.log
)

IF exist "%%G\*.exe" (
    move /Y "%%G\*.exe" "%_dest%\"
    echo %%G>>"%_dest%\results-log.log
)
IF exist "%%G\*.avi" (
    move /Y "%%G\*.avi" "%_dest%\"
    echo %%G>>"%_dest%\results-log.log
)

Se você quiser manter a mensagem dizendo nada para mover, você sempre pode definir alguma variável se ela ficar dentro de uma dessas instruções IF e verificar se está definida.

Não sei o que é /B , isso não parece certo para mim. Eu acho que você está certo com /y .

O G pode ser qualquer caractere, mas não pode ter mais de um caractere. G é o que geralmente é usado.

Eu sugeriria pesquisar scripts do powershell para coisas como essa. Na minha opinião, é mais simples e mais simples fazer coisas assim com menos linhas de código. Pode haver um comando para mover todos os arquivos com várias extensões de uma só vez, mas pelo que entendi essa sintaxe geralmente não está disponível para movimentação na maioria das versões do DOS.

EDITAR:

Eu testei isso localmente e parece funcionar para o que você está fazendo. Você precisará ajustá-lo para o seu caso específico.

@ECHO OFF
SETLOCAL EnableExtensions enabledelayedexpansion
set _parent=c:\logs\cache\
set _dest=c:\archive\
set found=0

for /R  %_parent% %%G in (.) do (
    set found=0
    IF exist "%%G\*.pdf" (
        move /Y "%%G\*.pdf" "%_dest%\"
        set found=1
    )
    IF exist "%%G\*.exe" (
        move /Y "%%G\*.exe" "%_dest%\"
        set found=1
    )
    IF exist "%%G\*.avi" (
        move /Y "%%G\*.avi" "%_dest%\"
        set found=1
    )

    IF !found!==1 (
        rd /s /q "%%G"
        echo %%G>>"%_dest%\results-log.log"
    )
)

endlocal

Usar a opção /D no loop for anexa o diretório atual no qual você está executando o script para a variável %%G , o que não é o que você deseja. A maneira que eu escrevi acima basicamente diz que recurse todas as pastas no diretório pai e defina %%G para esse local (.) .

Você também tem que adicionar enabledelayedexpansion para poder usar a variável found em blocos diferentes, então você precisa chamar !found! ao invés de %found% para usá-lo. Apenas uma estranha peculiaridade de scripts em lote.

Se toda essa sintaxe parece realmente estranha para você, você não está sozinho. Você só precisa pesquisar e fazer seus próprios testes para ver o que acontece até conseguir fazer o que quiser. Espero que quando você entrar no powershell você encontre depuração usando o PowerShell ISE e a sintaxe usada seja muito mais simples.

    
por 19.10.2015 / 23:29