Скопировать список файлов из каталога + подпапки в другую папку - PullRequest
1 голос
/ 23 апреля 2020

Прежде всего, я абсолютный новичок. Я пытался найти оптимальное решение для скриптовой игры. Чтобы не раздражать вас деталями, позвольте мне рассказать вам, что я пытался сделать.

Пример:

  1. У меня 17 файлов. 10 из них .jpg и 7 из них .obj.
  2. Изображения находятся в пути \mods\images, а объекты находятся в пути \mods\models.
  3. Я хочу перечислить все 17 отсутствующих файлов в list.txt
  4. Файл bat прочитает этот список, произведет поиск файлов и вставит их в папку TTSmissing

, и вот мои проблемы:

  1. Сценарий bat смотрит только точно на исходный путь, но не на подпапки (, поэтому я написал \mods\images\, , чтобы проверить, работает ли он ) так что я в основном хочу: \Tabletop Simulator\Mods\ как исходный путь, и сценарий также будет просматривать все подпапки.
  2. list.txt работает только тогда, когда имена файлов также имеют свои расширения. Можно ли изменить скрипт, чтобы мне не нужно расширение? так он будет искать только имена и копировать файлы? ( пример: имена в списке должны быть такими, как : hello123.jpg. Не работает, когда его только hello123.)
  3. Как мне нужно изменить скрипт bat, если я не хочу list.txt, а просто помещаю список файлов прямо в файл bat?
@echo off
mkdir %USERPROFILE%\Desktop\TTSmissing
set src_folder=%USERPROFILE%\Documents\My Games\Tabletop Simulator\Mods\Images
set dst_folder=%USERPROFILE%\Desktop\TTSmissing
set file_list=%USERPROFILE%\Desktop\list.txt

for /f "tokens=*" %%i in (%file_list%) DO (
    xcopy /S/E "%src_folder%\%%i" "%dst_folder%"
)
pause

1 Ответ

1 голос
/ 24 апреля 2020
@echo off
setlocal

set "src_folder=%USERPROFILE%\Documents\My Games\Tabletop Simulator\Mods"
set "dst_folder=%USERPROFILE%\Desktop\TTSmissing"
set "file_list=%USERPROFILE%\Desktop\list.txt"
set "ext_list=.gif .jpeg .jpg .mp4 .obj .pdf .png .webm"

if not exist "%dst_folder%" md "%dst_folder%"

for /d /r "%src_folder%\" %%A in (*) do (
    pushd "%%~A" && (
        for /f "usebackq delims=" %%B in ("%file_list%") do (
            for %%C in (%ext_list%) do (
                if exist "%%~B%%~C" (
                    echo copy /y "%%~B%%~C" "%dst_folder%\"
                )
            )
        )
        popd
    )
)

Вы просто хотите скопировать файлы, чтобы copy было проще в использовании, чем xcopy. Код отобразит команду copy, чтобы проверить, работает ли она так, как вы хотите. Если все выполнено, удалите echo перед копией и снова запустите код, чтобы выполнить фактический процесс копирования.

A for /d /r l oop будет рекурсивно повторять подкаталоги в %src_folder%. pushd изменит текущий каталог на каждый подкаталог, чтобы он мог работать относительно исходных файлов.

for /f l oop будет повторять каждую строку с %file_list%. Простой for l oop будет повторять каждый из %ext_list%. Если текущий « name.extension » существует, он будет скопирован в %dst_folder%.

Если вы set имен переменных в скрипте, обычно лучше использовать setlocal для хранения переменных, определенных локально для скрипта.

Чтобы просмотреть справку по команде, используйте command /?. Это будет работать для многих команд, используемых в коде.

Просмотр command /? справки для copy, for, if, setlocal ...

...