He estado extrayendo fragmentos de secuencias de comandos de Internet, creando algo para buscar en todas las carpetas de una carpeta principal, encontrando ciertos archivos y copiándolos en una nueva ubicación. (Tenemos un directorio con infinitas carpetas vacías y ocupadas, y estamos intentando encontrar un puñado de archivos sin buscar manualmente)
Hasta ahora, el script funciona, pero solo si los archivos nombrados (del documento Names.txt) están directamente debajo de la carpeta principal (...\source). Si están dentro de cualquiera de las carpetas dentro de la carpeta principal (...\source\folder1\folder2\etc), no se buscan y no resulta nada. ¿Qué me estoy perdiendo?
@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
¿Pongo un comodín en el símbolo del sistema cuando escribo la ruta de origen? ¿O pongo algo en el lote que haga esto automáticamente?
Estoy un poco perdido. ¡Gracias por la ayuda!
Respuesta1
Aquí lo llevaré directamente a algunos conceptos avanzados por lotes.
En el siguiente ejemplo, estoy usando lotesfuncionespara realizar esta tarea. Esta no es la forma más eficiente de alcanzar la meta, pero le mostrará el tipo de cosas que puede hacer.PODERhacer. Todavía estoy muy cansado, así que esta solución puede ser tonta (pero funciona)
Incluso si no sigues este camino, tal vez "dir /s /b MÁSCARA DE ARCHIVO"era lo que estabas buscando.
@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
El primer bucle for no hace más que llamar a una función:BuscarNombrepara cada uno de los nombres en su archivo de texto.
El:BuscarNombreLa función cambia al directorio especificado por "Set /p" y realiza un "dir /s /b NAME_PASSED_FROM_TEXT_FILE". Bombea líneas que obtiene (archivos que encuentra) a un:Archivo encontradofunción.
El:Archivo encontradoLa función copia el archivo que se le pasa.