1 (изменено: 123ksn, 2022-06-14 19:08:42)

Тема: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

Доброго времени суток!
Надо найти в определенных папках, заданных маской, определенные файлы, тоже заданные маской.
Найденные файлы скопировать в папку, откуда запущен bat-ник. Поскольку имена найденных файлов могут совпадать, то имена результирующих файлов должны состоять из имени папки, в которой они находились, и оригинального имени файла.
Вот код, который мне удалось написать. Он не делает из того, что мне надо только одно- не присваивает новые имена.
Помогите, пожалуйста.


set folder_where=%~dp0
rem 
for /d %%B in (%USERPROFILE%\AppData\Roaming\PC\3*) do (
for %%C in ("%%B\*.txt") do copy /y "%%C" "%folder_where%" >NUL
)
pause

Из моего кода видно, что в каталоге %USERPROFILE%\AppData\Roaming\PC\ есть некие папки, названия которых начинаются с цифры 3 (три). Количество символов в имени папки (цифр), как правило, 12. В таких папках мне надо найти определенные файлы по маске *.txt. например: readme.txt. Такие файлы должны появиться в папке с батником под именем=имя папки+имя файла, например: 321098765432-readme.txt
И еще. Хотелось сделать проверку на наличие файла (321098765432-readme.txt). Если у записанного дата старее, чем у нового (readme.txt), то перезаписать, иначе не надо.
Заранее спасибо.

2

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

123ksn, приветствую.

Вот мой вариант.
Присваиваются новые имена, обновляются существующие файлы (ключ /D команды XCOPY).

set "folder_where=%~dp0"

for /d %%B in (%USERPROFILE%\AppData\Roaming\PC\3*) do (
  
  for %%C in ("%%B\*.txt") do echo F|xcopy "%%C" "%folder_where%%%~nxB-%%~nxC" /d /h /k /r /y >NUL

  rem "echo F|" подавляет запрос на копирование новых файлов "(F = файл, D = каталог)".
   
  rem Ключи XCOPY:
  rem /D:m-d-y Копирует файлы, измененные либо в указанный день, либо после.
  rem          Если дата не указана, копируются только те файлы, которые новее в исходной папке.
  rem /H Копирует скрытые и системные файлы.
  rem /R Заменяет файлы, доступные только для чтения.
  rem /K Копирует атрибуты. Простая команда Xcopy сбрасывает атрибут "Только чтение".
  rem /Y Подавляет запрос на подтверждение перезаписи существующего конечного файла.

)

3 (изменено: 123ksn, 2022-06-15 09:29:13)

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

andypetr
Большое спасибо. Проверил. Не работает. Добавил pause. Проскакивает черный экран, но файлы не появляются.

4 (изменено: andypetr, 2022-06-15 10:47:29)

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

123ksn, попробуйте добавить последней строкой PAUSE.
И в строке "for %%C ... >NUL" заменить ">NUL" на ">>1.txt".
Что выводится на экран и в файл 1.txt?

PS. Точно ли у вас в папке %USERPROFILE%\AppData\Roaming содержится папка PC с папками, начинающимися на 3*, в которых есть файлы .txt?
Я у себя всё это создал для тестирования - например, есть файл C:\USERS\ПОЛЬЗОВАТЕЛЬ\APPDATA\ROAMING\PC\321098765432\readme.txt.

5

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

andypetr
Извините меня пожалуйста. Оказывается РС у меня было на русском языке. Поэтому не сработало. Теперь файлы сохраняет как и хотел. Чуть позже проверю с логику с датами.
Я видимо наглею, но нельзя ли сделать вариант контроля не по дате, а по размеру. Я подумал, что нет смысла перезаписывать старый файл новым, из которого удалили часть информации.
В любом случае Вам огромное спасибо за работающий вариант и за обучение, как увидеть лог работы батника.

6

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

123ksn
Не хотел усложнять, но тут потребуется команда "SetLocal EnableDelayedExpansion", которая позволяет легко обращаться к значению переменной внутри блока кода, ограниченного скобками - через восклицательные знаки.
Я первой строкой всех своих BAT-файлов всегда пишу "@echo off & SetLocal EnableExtensions EnableDelayedExpansion", так проще кодировать.
В данном примере я обращаюсь к значению переменной "doCopy": "%doCopy%" не раскрывает значение переменной, а вот "!doCopy!" всё делает как надо.
Аналогично, можно было бы написать "for %%D in ("!folder_where!%%~nxB-%%~nxC")" - хотя тут и с процентами срабатывает.
В общем, я везде где можно раскрываю значения переменных через "!".
За исключением переменных-параметров (%0, %*, %1, ..., %9), переменных циклов (%%a-%%z, %%A-%%Z) и переменных окружения (%PATH% и т.д.).

@echo off & SetLocal EnableExtensions EnableDelayedExpansion

set "folder_where=%~dp0"

for /d %%B in (%USERPROFILE%\AppData\Roaming\PC\3*) do (
  
  for %%C in ("%%B\*.txt") do (

    for %%D in ("%folder_where%%%~nxB-%%~nxC") do (

      rem Сравнение размеров файла-источника %%C и файла-приемника %%D:

      if exist "%%~D" (
        set /a doCopy = %%~zC - %%~zD
      ) else (
        set /a doCopy = 1
      )

      rem переменная doCopy:
      rem > 0, если файл %%C больше по размеру, чем файл %%D (нужно копирование)
      rem = 1, если файл %%D не существует (нужно копирование)
      rem = 0, если файлы равны по размеру (нужно копирование с ключом /D)
      rem < 0, если файл %%C меньше по размеру, чем файл %%D (не нужно копирование)

      if !doCopy! geq 1 (
        echo F|xcopy "%%~C" "%%~D"    /h /k /r /y >NUL
      ) else (
      if !doCopy! equ 0 (
        echo F|xcopy "%%~C" "%%~D" /d /h /k /r /y >NUL
      )
      )

      rem "echo F|" подавляет запрос на копирование новых файлов "(F = файл, D = каталог)".
       
      rem Ключи XCOPY:
      rem /D:m-d-y Копирует файлы, измененные либо в указанный день, либо после.
      rem          Если дата не указана, копируются только те файлы, которые новее в исходной папке.
      rem /H Копирует скрытые и системные файлы.
      rem /R Заменяет файлы, доступные только для чтения.
      rem /K Копирует атрибуты. Простая команда Xcopy сбрасывает атрибут "Только чтение".
      rem /Y Подавляет запрос на подтверждение перезаписи существующего конечного файла.
    
    )
  )

)

pause

EndLocal
exit /b

7

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

andypetr
Проверил. Работает!!!! Большое Вам спасибо!!!!!