Копирование и переименование файлов с использованием двух текстовых файлов - PullRequest
0 голосов
/ 18 мая 2018

Я не очень знаком с пакетными сценариями, поэтому буду очень признателен за помощь!Я пытался скопировать и переименовать кучу файлов, используя два файла TXT.Файл chart_list.txt будет иметь имена источника.

chart_list.txt
Chart_A1_86_88.png
Chart_A2_86_88.png
Chart_B1_86_88.png
Chart_B2_86_88.png

Файл newchart_list.txt будет иметь имена назначения.

newchart_list.txt
Chart_A1.png
Chart_A2.png
Chart_B1.png
Chart_B2.png

Глядя на следующий пост ( в пакетном файле Windows, как зациклить 2 набора одновременно и Скопировать список (txt) файлов ), япридумал следующее:

setlocal enableextensions enabledelayedexpansion
@echo off

set src_folder=C:\Source
set dst_folder=C:\Destination
set flag=0
for /f "tokens=*" %%i in (chart_list.txt) DO (
set /A flag+=1
echo !flag!
set flag2=0
    for /f "tokens=*" %%j in (newchart_list.txt) DO (
        set /A flag2+=1
        echo !flag2!
        if !flag! == !flag2! (
        copy "%src_folder%\%%i" "%dst_folder%\%%j" /Y
        )
    )
)
@pause

Цель в действительности состоит в том, чтобы совпадать имя в первой строке chart_list и newchart_list.Однако, когда я выполняю команду, ничего не происходит.окно cmd показывает

1
0
0
0
0
2
0
0
0
0
3
0
0
0
0
4
0
0
0
0

(я добавил команду echo, чтобы увидеть, действительно ли меняются flag и flag2, но это не относится к flag2, который остается установленным в 0).

Заранее большое спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Проще, но не очень эффективно:

@echo off
setlocal

set src_folder=C:\Source
set dst_folder=C:\Destination

for /f "tokens=1* delims=:" %%i in ('findstr /N "^" chart_list.txt') DO (
    for /f "tokens=1* delims=:" %%x in ('findstr /N "^" newchart_list.txt') DO (
        if %%i == %%x (
            copy "%src_folder%\%%j" "%dst_folder%\%%y" /Y
        )
    )
)
pause

Если файлы для обработки имеют большой размер, лучше использовать любой из других методов, предложенных где-либо еще.Смотрите этот комментарий

0 голосов
/ 18 мая 2018

Вот один из способов сделать это:

@Echo Off
SetLocal DisableDelayedExpansion
Set "fileOld=chart_list.txt"
Set "fileNew=newchart_list.txt"
Set "dirSrce=C:\Source"
Set "dirDest=C:\Destination"

(For /F "UseBackQ Tokens=*" %%A In ("%fileOld%") Do (Set /P "B="<&3
        SetLocal EnableDelayedExpansion
        Echo(Copy /Y "%dirSrce%\%%A" "%dirDest%\!B!"
        EndLocal)) 3<"%fileNew%"
Pause

Просто заполните переменные в строках 3 - 6 вашими конкретными данными, (не добавляйте конечные обратные слеши в пути к каталогами не включайте двойные кавычки или удаляйте те, которые существуют в настоящее время) .

Если вы удовлетворены результатом, вы можете удалить Echo( из строки 10 и удалить последнюю строку, чтобы фактически выполнитьCopy процедура.

Скрипт не проверяет, являются ли эти переменные действительными, существуют ли они, совпадают ли они по числу строк и т. д. Я оставлю это вам для работы по мере необходимости .

Редактировать

Вот альтернативный метод, более похожий на оригинал, (но с использованием команды Find) :

@Echo Off
Setlocal EnableExtensions EnableDelayedExpansion
Set "src_folder=C:\Source"
Set "dst_folder=C:\Destination"
Set "flag=0"
For /F "UseBackQ Tokens=*" %%A In ("chart_list.txt") Do (
    Set /A flag+=1
    For /F "Tokens=1* Delims=]" %%B In ('
        "Find /N /V ""<"newchart_list.txt"|Find "[!flag!]""'
    ) Do Copy /Y "%src_folder%\%%A" "%dst_folder%\%%C")

… и без флага или необходимости отложенного расширения, (тот же метод, что и у Aacini, но с использованием Find вместо FindStr) :

@Echo Off
Set "src_folder=C:\Source"
Set "dst_folder=C:\Destination"
For /F "Tokens=1* Delims=[]" %%A In ('Find /N /V ""^<"chart_list.txt"') Do (
    For /F "Tokens=1* Delims=[]" %%C In ('Find /N /V ""^<"newchart_list.txt"'
    ) Do If "%%C"=="%%A" Copy /Y "%src_folder%\%%B" "%dst_folder%\%%D")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...