Tenho extraído pedaços de script da Internet, criando algo para pesquisar todas as pastas em uma pasta pai, encontrando determinados arquivos e copiando-os para um novo local. (Temos um diretório com inúmeras pastas vazias e ocupadas e estamos tentando encontrar alguns arquivos sem pesquisar manualmente)
Até agora, o script funciona, mas apenas se os arquivos nomeados (do documento Names.txt) estiverem diretamente na pasta pai (...\source). Se eles estiverem dentro de qualquer uma das pastas da pasta pai (...\source\folder1\folder2\etc), eles não serão pesquisados e nada acontecerá. o que estou perdendo?
@echo off
pushd C:\Users\username\Desktop\TestBatches
set /p SourceFolder=Enter the path of source folder and press 'Enter':
cls
for /f "tokens=* delims=" %%a in ('type Names.txt') do xcopy /hrkvy "%SourceFolder%\%%a" ".\destination"
popd
pause
Coloco um curinga no prompt de comando ao digitar o caminho de origem? Ou coloco algo no lote que fará isso automaticamente?
Estou um pouco perdido. Obrigado pela ajuda!
Responder1
Vou levá-lo direto para alguns conceitos avançados de lote aqui.
No exemplo a seguir, estou usando lotefunçõespara realizar esta tarefa. Esta não é a maneira mais eficiente de atingir a meta, mas mostrará os tipos de coisas que vocêPODEfazer. Ainda estou muito cansado, então esta solução pode ser boba (mas funciona)
Mesmo se você não seguir esse caminho, talvez "dir /s /b MÁSCARA DE ARQUIVO"era o que você estava procurando.
@echo off
:: This assumes that this batch is in the same folder as Names.txt and the .\destination folder
:: This batch DOES NOT check things it should like the existence of %SourceFolder% or if .\destination even exists
Set ThisDir=%~DP0
Set DestinationDir=%ThisDir%\destination
Set NamesFile=%ThisDir%\Names.txt
Set /p SourceFolder=Enter the path of source folder and press [Enter]:
for /f "delims=" %%a in ('type %NamesFile%') do call :SearchName "%%a"
pause
goto :EOF
:: ----------------------------------------------------------------
:SearchName
pushd %SourceFolder%
for /f "delims=" %%f in ('dir /s /b %1') do call :FoundFile "%%f"
popd
goto :EOF
:: ----------------------------------------------------------------
:FoundFile
xcopy /hrkvy "%1" "%DestinationDir%"
goto :EOF
O primeiro loop for não faz nada além de chamar uma função:PesquisarNomepara cada um dos nomes em seu arquivo de texto.
O:PesquisarNomeA função muda para o diretório especificado por "Set /p" e executa um "dir /s /b NAME_PASSED_FROM_TEXT_FILE". Ele bombeia as linhas que obtém (arquivos encontrados) para um:Arquivo encontradofunção.
O:Arquivo encontradofunção copia o arquivo passado para ela.