Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/74: Рейтинг темы: голосов - 74, средняя оценка - 4.85
obse
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 9
1

Поиск по маске, копирование, переименование

31.07.2012, 11:45. Просмотров 14232. Ответов 28

Доброго времени суток Уважаемые.

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

Перечитал все темы и понял, что я ничего не понял. Пытался сам создать батник, но явно я в этом ничего не понимаю. Прошу помочь написать код для следующей задачи:
Бат-файл запускается с любого места на компе. Необходимо найти все файлы на компьютере (диски c,d,e,f,....) по маске (*.txt - маска будет меняться периодически ручками) и скопировать их на диск D:\test\, при этом надо учесть, чтоб повторяющиеся имена файлов переименовывались примерно так: doc.txt, doc(1).txt, doc(2).txt,......, а не заменялись файлы, и не копировалась повторно сама же папка D:\test\. Желательно, чтоб при запуске батника окно сворачивалось в панель задач.

Ну очень прошу, помогите с батничком. Спасибо отзывчивым.

Добавлено через 11 часов 16 минут
Вот попытался начать, но думаю у меня проблемы.
Windows Batch file
1
2
3
4
@echo off
md d:\test
xcopy /y /h "C:\, D:\, E:\, F:\ *.txt" "d:\test\"
pause
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2012, 11:45
Ответы с готовыми решениями:

Поиск, переименование и копирование файлов
Здравствуйте! Стоит такая задача, очень надеюсь на помощь.Необходимо на диске D:\ найти вcе файлы с...

Поиск и копирование файла/ов по маске
Всем Доброго Времени Суток! Задачка вроде тревиальная, но я никак не могу решить! Условия: 1....

Поиск файла по маске и копирование его на флешку
Вообщем, на диске D есть папка Рабочие_станции Рабочая станция %произвольно не помню...

Переименование файлов по маске
Подскажите пожалуйста, как переименовать файлы батником EUSimple-KEP.12345678.25-01-14.12-34.p10...

Переименование файлов по маске
Есть папка, в которой хранятся файлы с разным расширением. Нужно переименовать только те файлы, у...

28
atributz
832 / 346 / 12
Регистрация: 04.10.2009
Сообщений: 589
01.08.2012, 11:23 2
Лучший ответ Сообщение было отмечено как решение

Решение

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@echo off
set copyfolder=D:\test
set mask=*.mytxt
if not exist "%copyfolder%" md "%copyfolder%"
for /f "skip=1" %%i in ('wmic logicaldisk where drivetype^=3 get name') do call :f1 %%i\
goto :eof
:f1
for /r %1 %%j in (.) do call :f2 "%%j"
exit /b
:f2
set n=%~1
set n=%n:~0,-1%
echo %n%
if /i "%copyfolder%\" equ "%n%" exit /b
for /f "tokens=2 delims=\" %%q in ("%n%") do (set b=%%q)
if /i "%b%" equ "Recycled" exit /b
for /f  "delims=" %%i in ('dir "%n%*.mytxt" /a-d /b 2^>nul ') do call :f3 "%n%" "%%~ni" "%%~xi"
exit /b
:f3
set k=0
set fpath=%~1
set fname=%~2
set fext=%~3
if exist "%copyfolder%\%fname%%fext%" goto :f3_2
copy /y "%fpath%%fname%%fext%" "%copyfolder%\%fname%%fext%" 1>nul 2>nul
exit /b
:f3_2
set /a k=%k%+1
if exist "%copyfolder%\%fname%(%k%)%fext%" goto :f3_2
copy /y "%fpath%%fname%%fext%" "%copyfolder%\%fname%(%k%)%fext%" 1>nul 2>nul
exit /b
Добавлено через 12 минут
только поменяйте *.mytxt на *.txt. А то я забыл поменять.
3
Tornament
67 / 67 / 2
Регистрация: 28.10.2010
Сообщений: 329
01.08.2012, 14:45 3
Вам обязательно "бат" файл? (может делфи ЕКЗЕШНИК Сделать ?)
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
@Echo off
::CHcp 1251 > NUL
setlocal ENABLEDELAYEDEXPANSION  
::Включает обработку с задержкой ...как то так
Set mask=txt  
::^^^^Устанавливаем маску фалов
Set Disc=C    
::^^^^Устанавливаем Первый диск для скаирования
Set N=1       
::^^^^Счетчик для номера в имени файла doc!N!.!mask!
:repeat
::^^^^Точка возврата для сканирования на других дисках
Set I=0       
::Просто Счетчик для кол-ва найденых файлов
  for /f "Delims=*" %%a in ('Dir /s /b "%Disc%:\"') do (
  ::^^^^Цикл, читает строки что выда нам 'Dir /s /b "%Disc%:\"', а именно это будет список всех файлов и папок на диске 
    Set File=%%a
    ::^^^^Присваеваем переменной "File", значение прочитанной циклом строки.  Для работы за самим циклом.
    ::ДалееВызываем Кусок кода.
    Call :Cop   
  )
Echo Files in Total - '%I%'
::^^^^ Выводим колво найденых файлов. На диске
goto !Disc!
::^^^^ Идём к метке с именем диска хранящегося в переменной !Disc!
:C
::^^^^ Метка С именем первого диска
  Set Disc=D
  ::^^^^ Меняем значение переменной Disc, на  следующий диск для сканирования, D
  Echo Disc set to D
  goto repeat
  ::^^^^ Идём к метке с именем repeat
:D
::^^^^ Метка С именем 2го диска
  Set Disc=E
  Echo Disc set to E
  goto repeat
:E
::^^^^ Метка С именем 3го диска
  Set Disc=F
  Echo Disc set to F
  goto repeat
:F
::^^^^ Метка С именем 3го диска
Pause
::^^^^ Пауза
exit
::^^^^ Выход
:Cop
::^^^^Метка за циклом.
If /i Not "!File:~-3,3!"=="!mask!" (Exit /b 0)
::^^^^ Если последние 3 символа файла/папки не имеют значение метки, например txt, без учета регистра. То выходим из под цикла, и возвращаемся в точку отправления, в сам цикл. От туда и были направлены номандой "Call :Cop"
  Set /a I=!I! + 1
  ::^^^^ Так как продолжили, значит 3 символа соответствуют, записываем что файл является файлом с Маски.
  If Not Exist "D:\test\doc.!mask!" (
  ::^^^^ Если файл "doc" существует
    copy /y "!File!" "d:\test\doc.!mask!">NUL 2>NUL 
     ::^^^^  то копируем файл с именем doc.МАСКА
  ) else (
  ::^^^^ Иначе
    :re
    ::^^^^Метка для возврата и увеличение числа N
    If Exist "D:\test\doc(!N!).!mask!" (
      ::^^^^Если файл doc Номер .Маска существует, то
      Set /a N=!N! + 1
      ::^^^^ Увеличиваем номер на 1
      Goto re
      ::^^^^ И возвращаемся к началу
    ) else (    
    ::^^^^ иначе
      copy /y "!File!" "d:\test\doc(!N!).!mask!">NUL 2>NUL 
      ::^^^^ Копируем файл doc Номер.Маска
      Set /a N=!N! + 1
      ::^^^^ И Увеличиваем N, что бы в следующий раз If направил нас сразу на копирование, так как doc ТакойЖеНомер.Маска уже есть.
    )
  )         
Exit /b 0
::^^^^ Выходим из под цикла, и возвращаемся в точку отправления, в сам цикл. От туда и были направлены номандой "Call :Cop"
Так как сканируется КАЖДЫЙ файл на диске, времени уходит уйма.

Отвлекся, что то изменил, перестало работать... Эксперты, помогайте...
1
obse
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 9
02.08.2012, 00:18  [ТС] 4
atributz, Спасибо, сейчас попробую что получится.

Наверно можно и экзешник. Хотя мне без разницы, бат можно положить в систему, чтоб его не трогали кто попало.

atributz, ....2^>nul ..... drivetype^=3 Это у нас перенос строк на сколько я понял?

Добавлено через 34 минуты
Tornament, а вот ваш пример сейчас попробую разобрать, спасибо за комментарии, сейчас и командные файлы поучу.
0
atributz
832 / 346 / 12
Регистрация: 04.10.2009
Сообщений: 589
02.08.2012, 05:15 5
Цитата Сообщение от obse Посмотреть сообщение
atributz, ....2^>nul ..... drivetype^=3 Это у нас перенос строк на сколько я понял?
Нет. Это экранирование спецсимволов > и = в параметре команды.
0
obse
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 9
02.08.2012, 23:27  [ТС] 6
Цитата Сообщение от atributz Посмотреть сообщение
Нет. Это экранирование спецсимволов > и = в параметре команды.
Я уже понял, что это нужное, но что-то у меня сегодня этот батник только диск С сканировал и ничего в папку тест не перекинул. Может где-то ошибка?

Добавлено через 1 минуту
Надо чтоб при старте сворачивался и не мешал. Ну пока бы наладить просто копирование с переименованием надо.

Добавлено через 1 минуту
А вообще спасибо вам, что помогаете, я вижу на форуме вы вдвоем везде помогаете и успешно.
0
Tornament
67 / 67 / 2
Регистрация: 28.10.2010
Сообщений: 329
03.08.2012, 02:26 7
obse, Сканит Мой диск Д за несколько секунд, без выполнения команды копирования.

Не по теме:

Включите ЛС, ибо обсуждение параметров для экзашника уже не касается этой темы. или же напишите другой способ связи с вами



Добавлено через 46 минут

Не по теме:

Попахивает не совсем "доброй" программой. Сканит комп, копирует все файлы определенного разрешения. Файлов выходит тысячи. Человек с ними работать не может. Явно что-то ищется на компе. Прога автоматом скрывается, если человек знает, он и так скроет. Иначе выходит что нужно скрыть действия программы, да и саму от пользователя.

1
atributz
832 / 346 / 12
Регистрация: 04.10.2009
Сообщений: 589
03.08.2012, 16:54 8
Цитата Сообщение от obse Посмотреть сообщение
Я уже понял, что это нужное, но что-то у меня сегодня этот батник только диск С сканировала и ничего в папку тест не перекинул. Может где-то ошибка?
Вы точно параметр *.mytxt изменили?
0
Tornament
67 / 67 / 2
Регистрация: 28.10.2010
Сообщений: 329
03.08.2012, 19:45 9
Цитата Сообщение от atributz Посмотреть сообщение
Bash
1
set mask=*.mytxt
И еще, вот здесь, я так понял надо тоже исправить
Цитата Сообщение от atributz Посмотреть сообщение
Bash
1
for /f "delims=" %%i in ('dir "%n%*.mytxt" /a-d /b 2^>nul ') do call :f3 "%n%" "%%~ni" "%%~xi"
на
Цитата Сообщение от atributz Посмотреть сообщение
Bash
1
for /f "delims=" %%i in ('dir "%n%%mask%" /a-d /b 2^>nul ') do call :f3 "%n%" "%%~ni" "%%~xi"
1
atributz
832 / 346 / 12
Регистрация: 04.10.2009
Сообщений: 589
03.08.2012, 21:18 10
да только что сам код проверил действителльно забыл переменную mask прописать.
0
obse
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 9
04.08.2012, 01:39  [ТС] 11
Цитата Сообщение от atributz Посмотреть сообщение
да только что сам код проверил действителльно забыл переменную mask прописать.
Вот сейчас исправлю попробую еще раз Спасибо

Добавлено через 1 минуту
Tornament, и тебе спасибо, заметил же
А вот что-то я не найду как тут личку включать, но сообщения вроде о темах приходят.

Добавлено через 18 минут
Исправил код, запустил файл, работа пошла, папка наполняется Одних лицензий уже 59 нашел, вот зачем мне этот текст, можно удалить уже

Добавлено через 1 час 55 минут
Ну вот что я могу сказать, уже наблюдаю сколько, идет сканирование диска С по 3 разу. Не хочет другие диски искать
0
atributz
832 / 346 / 12
Регистрация: 04.10.2009
Сообщений: 589
04.08.2012, 02:18 12
Проверьте тогда что этот код в файле log.txt пишет
Windows Batch file
1
2
3
4
5
6
del log.txt
for /f "skip=1" %%i in ('wmic logicaldisk where drivetype^=3 get name') do call :f1 %%i\
goto :eof
:f1
echo %1>>log.txt
exit /b
Должно быть что то вроде
Код
C:\
D:\
E:\
Добавлено через 3 минуты
И проверьте не назвали ли вы свой батник таким словом которорое употребляется в скрипте.
Возможно он из за этого в середине процесса вызывает сам себя и начинает скан сначала.
1
Tornament
67 / 67 / 2
Регистрация: 28.10.2010
Сообщений: 329
04.08.2012, 02:18 13
Я смотрел, EXE-шник сканит все диски, но и папку "Recycled", и нет настройки на маску и окончательный путь. Или же дайте, конечный путь копирования и маску, или буду делать под параметры. Жду ответа.

 Комментарий модератора 
Прекращаем личную переписку в теме.
0
Dedoff
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 3
02.12.2012, 21:55 14
atributz, не могли бы вы подсказать, как еще и скрытые файлы можно скопировать? батник работает просто отлично, только вот в скрытых папках не скрытые файлы видит, а вот скрытые не копирит. помогите пожалуйста! прям кровь из носа как надо! Заранее спасибо!
0
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
02.12.2012, 22:57 15
Dedoff, должно копировать. Напишите свой код, или какой Вы используете?
0
Dedoff
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 3
03.12.2012, 17:46 16
Dragokas,
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@echo off
set copyfolder=D:\test
set mask=*.mytxt
if not exist "%copyfolder%" md "%copyfolder%"
for /f "skip=1" %%i in ('wmic logicaldisk where drivetype^=3 get name') do call :f1 %%i\
goto :eof
:f1
for /r %1 %%j in (.) do call :f2 "%%j"
exit /b
:f2
set n=%~1
set n=%n:~0,-1%
echo %n%
if /i "%copyfolder%\" equ "%n%" exit /b
for /f "tokens=2 delims=\" %%q in ("%n%") do (set b=%%q)
if /i "%b%" equ "Recycled" exit /b
for /f  "delims=" %%i in ('dir "%n%*.mytxt" /a-d /b 2^>nul ') do call :f3 "%n%" "%%~ni" "%%~xi"
exit /b
:f3
set k=0
set fpath=%~1
set fname=%~2
set fext=%~3
if exist "%copyfolder%\%fname%%fext%" goto :f3_2
copy /y "%fpath%%fname%%fext%" "%copyfolder%\%fname%%fext%" 1>nul 2>nul
exit /b
:f3_2
set /a k=%k%+1
if exist "%copyfolder%\%fname%(%k%)%fext%" goto :f3_2
copy /y "%fpath%%fname%%fext%" "%copyfolder%\%fname%(%k%)%fext%" 1>nul 2>nul
exit /b
вот этот. все работает, но скрытые файлы не копирует((
0
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
03.12.2012, 22:52 17
У меня все копирует нормально.

Тут в строке 17 немного маску поправьте:
Bash
17
for /f  "delims=" %%i in ('dir "%n%%mask%" /a-d /b 2^>nul ') do call :f3 "%n%" "%%~ni" "%%~xi"
Может Вас система в правах ограничивает.
В команде Dir явно указан ключ /A, который показывает все скрытые и системные файлы.
Строка 8 тоже перебирает все системные скрытые папки.
Все переменные взяты в кавычки.
Проблем с этим батником я не вижу.
0
Dedoff
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 3
06.12.2012, 20:53 18
Dragokas, Спасибо большое)) разобрался)
0
batrjan
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 8
28.01.2014, 20:12 19
подскажите, а если в маске необходимо указать несколько форматов, например: *.doc, *.docx, *.xls, *.xlsx
то поле
set mask=*.doc
как должно выглядеть?
0
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
28.01.2014, 22:20 20
Нет.
Строку 17 нужно заменить таким вариантом:
Bash
for %%a in (%mask%) do for /f "delims=" %%i in ('dir "%n%\*.%%a" /a-d /b 2^>nul') do call :f3 "%n%" "%%~ni" "%%~xi"
Совокупность масок указывать в таком виде:
Bash
1
set mask=doc,docx,xls,xlsx
или через пробел
1
28.01.2014, 22:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2014, 22:20

Переименование файлов по маске
Уважаемые друзья, добрый день! Стоит задача; В папку С:\1, копируются файлы вида КОМПАНИЯ-ПППП...

Групповое переименование файлов по маске
Доброго времени суток! В написании командных скриптов только разбираюсь. Помогите, пожалуйста,...

Переименование файлов по маске имён
Доброго дня! Поставили мне такую задачу: Есть файлы в папке 0262500 (1).011 0262500 (2).011...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru