С Новым годом! Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/210: Рейтинг темы: голосов - 210, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 6
1

Раскидать файлы по папкам, соответствующим датам создания этих файлов

27.07.2013, 04:15. Показов 43400. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача: есть папка (с неизвесной глубиной вложенных папок) в которой свалены фотки (ну очень много фоток )))
нужно написать бат.файлик, чтоб все эти фотки копировались в новые папки имена которых должны быть датами создания фоток содержащихся в них. Например: есть в папке 3 фотки с датами создания фоток 26.06.12, 10.06.12, 01.01.10, после выполнения скрипта, должны быть созданы папки с именами 26.06.12, 10.06.12, 01.01.10 соотвественно и содержать каждая по своей фотке в соответсвии с датой. Да, еще дубликаты писаться не должы (разве что, при отличае содержимого, т.е. если название одно и то же, а содержание файла разное, то скрип должен переименовать дубликат, например добавив в него какуюто цифру или букву).
Помогите, пожалуста, реализовать эту задачу правильно. Что то мне подсказывает, что это возможно.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2013, 04:15
Ответы с готовыми решениями:

Раскидать файлы по папкам, соответствующим именам файлов
Задача: есть папка в которой свалены документы с почты. Постоянно подступают новые файлы и хочется...

Разложить файлы по папкам с именами, являющимися датами создания этих файлов
Помогие с такой задачей: есть сетевая папка \\d-link\cam\ с несколькими подпапками hol1, hol2,...

Раскидать файлы по папкам согласно списка
Помогите, пожалуйста, если возможно. Есть порядка 15 тыс. файлов в одной папке. И есть путь в виде...

Раскидать файлы по папкам CMD/BAT
Здравствуйте, Уважаемые. Помогите новичку. Есть два каталога D:\KAT1\FOTO и D:\KAT2\IN В...

26
Эксперт WindowsАвтор FAQ
18015 / 7716 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
27.07.2013, 23:58 2
Проверил. Все должно работать ОК.

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
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
79
80
81
82
83
84
85
86
:: Скрипт копирования файлов рекурсивно из заданной директории в каталоги, имя которых будет = дате создания файлов
@echo off
:: В скрипт включена поддержка файлов-папок с буквами украинского алфавита
setlocal EnableDelayedExpansion
::Искомое расширение файлов
set Ext=*.jpg *.gif *.bmp *.png
::Откуда копировать
set From=l:\Bash\address
::Куда копировать
set To=l:\Bash\CopyByDate
 
:: Если целевой папки нет - создаем ее
if not exist "%To%" md "%To%"
 
:: Поддержка символов кодовой страницы 1251
chcp 1251>nul& set LanguageFlag=true
 
:: Задействуем рекурсивный обход папок/файлов двумя циклами, чтобы знать в какой папке находимся в цикле № 2,
:: не используя ключ /B. :: 1-й - dir /b /s /ad. 2-й - dir /a-d (цикл № 2 - вынес в подпрограмму)
for /F "delims=" %%F in ('dir /B /S /AD "%From%"') do call :GetFiles "%%F"
:: Проверяем файлы в самом корне каталога
call :GetFiles "%From%"
::Возвращаем исходную кодировку
chcp 866>nul& Set LanguageFlag=
:: Ожидаем действия пользователя
pause
:: Выход из пакетного файла
goto :eof
 
:GetFiles
  rem Сформируем специальную строку быстрого обхода нескольких расширений файлов
  set curFrom=%~1
  rem Формируем путь вида c:\path\*.1,c:\path\*.2, ...
  call set St="!curFrom!\%%ext: =","!curFrom!\%%"
  rem Предварительный подсчет кол-ва строк в выводе (нужен чтобы исключить последние 2)
  set CountLines=0
  rem Читаю все файлы по заданным расширениям текущей папки, фильтруя междя выводами лишние строки с путями
  for /F "skip=4" %%A in ('dir /A-D /-C /T:C !St! 2^>nul ^|find /v /i "!curFrom!"') do set /A CountLines+=1
  set /A CountLines-=1
  set CurLines=0
  echo Читаю каталог: !curFrom!
  rem Пропускаем первые 5 строк вывода dir, убираем разделитель рядов, сортируем по дате (необязательно)
  for /F "skip=4 tokens=1,3*" %%A in ('dir /A-D /-C /T:C !St! 2^>nul ^|find /v /i "!curFrom!"') do (
    :: Читаем без последних 2 строк
    set /A CurLines+=1
    if !CurLines! LSS !CountLines! (
      rem Восстанавливаем кодовую страницу 866, чтобы получать вывод консоли в читабельном виде.
      if defined LanguageFlag (chcp 866>nul& Set LanguageFlag=)
      rem Получаем конечный путь с датой текущего файла
      set ToReal=%To%\%%A
      rem Создаем конечную папку, если ее нет
      if not exist "!ToReal!" md "!ToReal!"
      rem Проверяем не занят ли полный путь. Если занят, получаем свободное имя с добавкой цифры в скобках +1
      call :GetEmptyNameMod "!ToReal!" "!curFrom!\%%C" NewName
      rem Копируем файл
      copy /Y "!curFrom!\%%C" "!ToReal!\!NewName!" >nul
    )
  )
  rem Вложенный цикл! Требуется повторное переключение кодовой страницы для входа в цикл № 2
  chcp 1251>nul& set LanguageFlag=true
)
exit /B
 
:GetEmptyNameMod %1-Folder %2-FullFileName %3-Var.Return %4-Optional.System.Num
:: Рекурсивная функция для получения сбободного имени файла по заданной директории
:: Модификация: если файл совпадает по содержимому с одним из одноименных файлов,
:: новый индекс не выдается (предотвращение дубликатов).
if "%~4"=="" (
    Set "NewFileName=%~nx2"
  ) else (
    Set "NewFileName=%~n2(%~4)%~x2"
)
if exist "%~1\%NewFileName%" (
    FC /B "%~1\%NewFileName%" "%~2" >nul && (
      Set "%~3=%NewFileName%"
      Exit /B
    ) || (
      Set Num=%~4
      Set /A Num+=1
      Call :GetEmptyNameMod "%~1" "%~2" "%~3" "!Num!"
    )
  ) else (
    Set "%~3=%NewFileName%"
    Exit /B
)
Exit /B
Добавлено через 13 минут
Прим. Дубликаты будут фильтроваться только, если у них одинаковая дата создания, т.е. если они будут пытаться попасть в одну и ту же папку.

Чтобы сравнить между собой все одноименные файлы - потребуется весьма немало времени процессора.
Для выработки подходящего алгоритма, потребуется хотя бы знать ориентировочное общее число обрабатываемых каталогов. Это можно определить командой:
Bash
1
dir /b /s /ad "диск:\путь" |find /c /v ""
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 6
29.07.2013, 01:41  [ТС] 3
спасибо большое!!!! Что (и как) нужно изменить в скрипте, чтоб сортировка по папкам осуществлялась не на основе даты создания, а на основе даты изменения? а то у меня фотки в папках которые копировались целиком из одной папки в другую, дата создания изменяется на да ту дату, когда было копирование, а дата изменения остается "родная" когда реально сфоткали эту фотографию )) Еще, было бы неплохо, если бы скрипт перед выполнение спросил целевую папку для копирования. Зарание спасибо!!!
0
Эксперт WindowsАвтор FAQ
18015 / 7716 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
29.07.2013, 02:56 4
Здесь проще. Для отбора файлов по дате модификации выбор довольно велик. Использовал встроенный в циклы модификатор ~t.
Формат даты зависит от выставленного в настройках системы (Панель управления - Языки и стандарты).

Добавил диалоговое окно выбора целевой папки.
Немного увеличил производительность работы с функцией :GetEmptyNameMod

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
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
@set @x=0 /*
:: Скрипт копирования файлов рекурсивно из заданной директории в каталоги, имя которых будет = дате модификации файлов
@echo off
:: В скрипт включена поддержка файлов-папок с буквами украинского алфавита
setlocal EnableDelayedExpansion EnableExtensions
::Искомое расширение файлов
set Ext=*.jpg *.gif *.bmp *.png
::Откуда копировать
set From=l:\Bash\222
::Куда копировать
::set To=l:\Bash\CopyByDate
set /p "x=Выберите целевую папку" < nul
for /F "delims=" %%F in ('cscript //nologo /e:jscript "%~f0"') do set To=%%F
if not defined To exit /B
echo : %To%
 
:: Если целевой папки нет - создаем ее
if not exist "%To%" md "%To%"
 
:: Поддержка символов кодовой страницы 1251
chcp 1251>nul& set LanguageFlag=true
 
rem Сформируем специальную строку быстрого обхода нескольких расширений файлов - путь вида c:\path\*.1,c:\path\*.2, ...
call set St="!From!\%%ext: =","!From!\%%"
 
for /F "delims=" %%A in ('dir /B /S /A-D %St%') do (
  rem Индикация текущей копируемой папки
  if "!curFolder!" neq "%%~dpA" (echo Читаю %%~dpA& set curFolder=%%~dpA)
  rem Получаем конечный путь с датой текущего файла (выделяю с формата дата-время только дату)
  for /F %%D in ("%%~tA") do set ToReal=%%D
  rem Обход ошибки в имени файла, если в настройках стандарта системы установлен формат даты через знаки /
  set ToReal=%To%\!ToReal:/=.!
  rem Создаем конечную папку, если ее нет
  if not exist "!ToReal!" md "!ToReal!"
  rem Проверяем не занят ли полный путь. Если занят, получаем свободное имя с добавкой цифры в скобках +1
  call :GetEmptyNameMod "!ToReal!" "%%A" NewName
  rem Копируем файл
  if not errorlevel 1 copy /Y "%%A" "!ToReal!\!NewName!" >nul
)
chcp 866 >nul
:: Ожидаем действия пользователя
pause
:: Выход из пакетного файла
goto :eof
 
:GetEmptyNameMod %1-Folder %2-FullFileName %3-Var.Return %4-Optional.System.Num
:: Рекурсивная функция для получения сбободного имени файла по заданной директории
:: Модификация: если файл совпадает по содержимому с одним из одноименных файлов,
:: новый индекс не выдается (предотвращение дубликатов).
if "%~4"=="" (
    Set "NewFileName=%~nx2"
  ) else (
    Set "NewFileName=%~n2(%~4)%~x2"
)
if exist "%~1\%NewFileName%" (
    FC /B "%~1\%NewFileName%" "%~2" >nul && (
      Set "%~3=%NewFileName%"
      Exit /B 1
    ) || (
      Set Num=%~4
      Set /A Num+=1
      Call :GetEmptyNameMod "%~1" "%~2" "%~3" "!Num!"
    )
  ) else (
    Set "%~3=%NewFileName%"
    Exit /B 0
)
Exit /B 0
 
:ChooseFolder JScript */
var objShellApp = new ActiveXObject('Shell.Application');
var Folder = objShellApp.BrowseForFolder(0, 'SELECT FOLDER',1, '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}');
try {
  new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Folder.Self.Path)
};
catch (e) {};
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 6
29.07.2013, 17:10  [ТС] 5
что-то не работает... после выбора папки создает папку с таким вот именем ёюЁЄшЁютрээ√х ЇюЄъш, и сообщает что системе не удалось найти указанный путь... пытался сам понять в чем дело, но что-то сложновато это для меня ))
0
Эксперт WindowsАвтор FAQ
18015 / 7716 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
29.07.2013, 17:56 6
Русский текст в консоли

если не получится, попробуйте заменить строку 13 на эту:
Bash
1
for /F "delims=" %%F in ('chcp 1251 ^>nul ^& cscript //nologo /e:jscript "%~f0"') do set To=%%F
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 6
30.07.2013, 15:54  [ТС] 7
Спасибо! "Дело было не в бобине"... Я сам виноват, что не получалось. Я думал, что папка из которой начинается чтение, это та же папка где лежит бат-скрипт, а там просто нужно было указать ручками путь. Сейчас попробую уже сам разобравшись в скрипте, прикрутить возможность выбора папки из которой производится сортировка (исходную). Спасибо за полученные знания и опыт!

Добавлено через 14 часов 25 минут
Цитата Сообщение от Dragokas Посмотреть сообщение
Русский текст в консоли

если не получится, попробуйте заменить строку 13 на эту:
Bash
1
for /F "delims=" %%F in ('chcp 1251 ^>nul ^& cscript //nologo /e:jscript "%~f0"') do set To=%%F
Да все хорошо, пока сортируем из папки с английским названием, и выбираем папку для сортировки на английском. Если папка для сортирования на русском, то пишет, что системе не удалось найти указанный путь. Так же, если целевая папка (куда сортировать) на русском, то создает папку с "кракозябрами" и сортирует туда. Строку 13 поменял - непомогло. Сам долго "репу чесал" и "думу думал" - тоже не помогло )))) Помоги пожалуйста!
0
Эксперт WindowsАвтор FAQ
18015 / 7716 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
30.07.2013, 22:24 8
Лучший ответ Сообщение было отмечено ComSpec как решение

Решение

А вот так если попробовать:

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
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
79
80
81
82
83
:: Скрипт копирования файлов рекурсивно из заданной директории в каталоги, имя которых будет = дате модификации файлов
@echo off
:: В скрипт включена поддержка файлов-папок с буквами украинского алфавита
setlocal EnableDelayedExpansion EnableExtensions
 
::Искомое расширение файлов
set Ext=*.jpg *.gif *.bmp *.png
 
::Откуда копировать
set /p "x=Выберите исходную папку" < nul
call :GetFolder From
if not defined From exit /B
echo : %From%
 
::Куда копировать
set /p "x=Выберите целевую папку" < nul
call :GetFolder To
if not defined To exit /B
echo : %To%
 
:: Если целевой папки нет - создаем ее
if not exist "%To%" md "%To%"
 
:: Поддержка символов кодовой страницы 1251
chcp 1251>nul& set LanguageFlag=true
 
rem Сформируем специальную строку быстрого обхода нескольких расширений файлов - путь вида c:\path\*.1,c:\path\*.2, ...
call set St="!From!\%%ext: =","!From!\%%"
 
for /F "delims=" %%A in ('dir /B /S /A-D %St%') do (
  rem Восстанавливаем кодовую страницу 866, чтобы получать вывод консоли в читабельном виде.
  if defined LanguageFlag (chcp 866>nul& Set LanguageFlag=)
  rem Индикация текущей копируемой папки
  if "!curFolder!" neq "%%~dpA" (echo Читаю %%~dpA& set curFolder=%%~dpA)
  rem Получаем конечный путь с датой текущего файла (выделяю с формата дата-время только дату)
  for /F %%D in ("%%~tA") do set ToReal=%%D
  rem Обход ошибки в имени файла, если в настройках стандарта системы установлен формат даты через знаки /
  set ToReal=%To%\!ToReal:/=.!
  rem Создаем конечную папку, если ее нет
  if not exist "!ToReal!" md "!ToReal!"
  rem Проверяем не занят ли полный путь. Если занят, получаем свободное имя с добавкой цифры в скобках +1
  call :GetEmptyNameMod "!ToReal!" "%%A" NewName
  rem Копируем файл
  if not errorlevel 1 copy /Y "%%A" "!ToReal!\!NewName!" >nul
)
chcp 866 >nul
:: Ожидаем действия пользователя
pause
:: Выход из пакетного файла
goto :eof
 
:GetEmptyNameMod %1-Folder %2-FullFileName %3-Var.Return %4-Optional.System.Num
:: Рекурсивная функция для получения сбободного имени файла по заданной директории
:: Модификация: если файл совпадает по содержимому с одним из одноименных файлов,
:: новый индекс не выдается (предотвращение дубликатов).
if "%~4"=="" (
    Set "NewFileName=%~nx2"
  ) else (
    Set "NewFileName=%~n2(%~4)%~x2"
)
if exist "%~1\%NewFileName%" (
    FC /B "%~1\%NewFileName%" "%~2" >nul && (
      Set "%~3=%NewFileName%"
      Exit /B 1
    ) || (
      Set Num=%~4
      Set /A Num+=1
      Call :GetEmptyNameMod "%~1" "%~2" "%~3" "!Num!"
    )
  ) else (
    Set "%~3=%NewFileName%"
    Exit /B 0
)
Exit /B 0
 
:GetFolder %1-var.Where.Save.FolderName
chcp 1251 >nul
for /f "usebackq delims=" %%i in (
    `@"%systemroot%\system32\mshta.exe" "javascript:var objShellApp = new ActiveXObject('Shell.Application');var Folder = objShellApp.BrowseForFolder(0, 'SELECT FOLDER',1, '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}');try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Folder.Self.Path)};catch (e){};close();" ^
    1^|more`
) do set %~1=%%i
chcp 866 >nul
Exit /B
2
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 6
31.07.2013, 00:27  [ТС] 9
Большое спасибо! Теперь все получилось!!!
0
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 6
01.08.2013, 00:55  [ТС] 10
как вот эту строку: set Ext=*.jpg *.gif *.bmp *.png Записать так, чтоб Ext= заносились все кроме перечисленных форматов. Смысл в том, чтоб создать другой батничек, который создаст тоже папки по дате, только будет складывать в другое место все, что не относится к фото (там оказывается у меня еще и документов много попало, а их терять неохота)... ?
0
0 / 0 / 0
Регистрация: 24.07.2015
Сообщений: 1
24.07.2015, 13:56 11
Dragokas, спасибо, дорогой, выручил!
Специально зарегистрировался.. ))
0
-10 / 2 / 0
Регистрация: 11.11.2014
Сообщений: 22
08.01.2016, 22:25 12
Хороший скрипт. Родная утилита фотика не всегда срабатывает. Теперь будет резервный вариант распихивания по папкам.
0
0 / 0 / 0
Регистрация: 06.10.2016
Сообщений: 1
06.10.2016, 15:10 13
Здравствуйте, а как сделать то же самое, только, чтобы даты, и названия папок соответственно, были на американский манер: чтобы вместо "01.05.2016" было "20160501" ? А то очень не удобно сортировать. Спасибо!
0
4336 / 2126 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
06.10.2016, 16:01 14
H-zer0, например

Добавлено через 3 минуты
Вместо %date% может быть:
Windows Batch file
1
2
set "newdate=%%~ti"
echo %newdate%
0
0 / 0 / 0
Регистрация: 14.01.2017
Сообщений: 2
14.01.2017, 20:27 15
alpap, Каким образом ваш ответ скомпоновать с основным скриптом?

Не могу понять как сделать так, что бы на выходе были папки в формате 16.05.01 (год,месяц,число).

Помогите пожалуйста.
0
4336 / 2126 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
15.01.2017, 02:41 16
Цитата Сообщение от iblack Посмотреть сообщение
папки в формате 16.05.01 (год,месяц,число)
Windows Batch file
1
2
3
4
@echo off
set "sdate=%date:~8%.%date:~3,2%.%date:~0,2%"
md "%sdate%"
pause
куда и как это вставлять дело ваше.
1
0 / 0 / 0
Регистрация: 14.01.2017
Сообщений: 2
20.01.2017, 14:46 17
Все решилось добавлением одной строчки
Bash
1
set "ToReal=!ToReal:~8!.!ToReal:~3,2!.!ToReal:~0,2!"
А вот весь готовый скрипт:
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
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
79
80
81
82
83
84
:: Скрипт копирования файлов рекурсивно из заданной директории в каталоги, имя которых будет = дате модификации файлов
@echo off
:: В скрипт включена поддержка файлов-папок с буквами украинского алфавита
setlocal EnableDelayedExpansion EnableExtensions
 
::Искомое расширение файлов
set Ext=*.jpg *.gif *.bmp *.png *.mp4
 
::Откуда копировать
set /p "x=Source folder" < nul
call :GetFolder From
if not defined From exit /B
echo : %From%
 
::Куда копировать
set /p "x=Folder to write" < nul
call :GetFolder To
if not defined To exit /B
echo : %To%
 
:: Если целевой папки нет - создаем ее
if not exist "%To%" md "%To%"
 
:: Поддержка символов кодовой страницы 1251
chcp 1251>nul& set LanguageFlag=true
 
rem Сформируем специальную строку быстрого обхода нескольких расширений файлов - путь вида c:\path\*.1,c:\path\*.2, ...
call set St="!From!\%%ext: =","!From!\%%"
 
for /F "delims=" %%A in ('dir /B /S /A-D %St%') do (
  rem Восстанавливаем кодовую страницу 866, чтобы получать вывод консоли в читабельном виде.
  if defined LanguageFlag (chcp 866>nul& Set LanguageFlag=)
  rem Индикация текущей копируемой папки
  if "!curFolder!" neq "%%~dpA" (echo Читаю %%~dpA& set curFolder=%%~dpA)
  rem Получаем конечный путь с датой текущего файла (выделяю с формата дата-время только дату)
  for /F %%R in ("%%~tA") do set ToReal=%%R
  rem Обход ошибки в имени файла, если в настройках стандарта системы установлен формат даты через знаки /
  set "ToReal=!ToReal:~8!.!ToReal:~3,2!.!ToReal:~0,2!"
  set ToReal=%To%\!ToReal:/=.!
  rem Создаем конечную папку, если ее нет
  if not exist "!ToReal!" md "!ToReal!"
  rem Проверяем не занят ли полный путь. Если занят, получаем свободное имя с добавкой цифры в скобках +1
  call :GetEmptyNameMod "!ToReal!" "%%A" NewName
  rem Копируем файл
  if not errorlevel 1 copy /Y "%%A" "!ToReal!\!NewName!" >nul
)
chcp 866 >nul
:: Ожидаем действия пользователя
pause
:: Выход из пакетного файла
goto :eof
 
:GetEmptyNameMod %1-Folder %2-FullFileName %3-Var.Return %4-Optional.System.Num
:: Рекурсивная функция для получения сбободного имени файла по заданной директории
:: Модификация: если файл совпадает по содержимому с одним из одноименных файлов,
:: новый индекс не выдается (предотвращение дубликатов).
if "%~4"=="" (
    Set "NewFileName=%~nx2"
  ) else (
    Set "NewFileName=%~n2(%~4)%~x2"
)
if exist "%~1\%NewFileName%" (
    FC /B "%~1\%NewFileName%" "%~2" >nul && (
      Set "%~3=%NewFileName%"
      Exit /B 1
    ) || (
      Set Num=%~4
      Set /A Num+=1
      Call :GetEmptyNameMod "%~1" "%~2" "%~3" "!Num!"
    )
  ) else (
    Set "%~3=%NewFileName%"
    Exit /B 0
)
Exit /B 0
 
:GetFolder %1-var.Where.Save.FolderName
chcp 1251 >nul
for /f "usebackq delims=" %%i in (
    `@"%systemroot%\system32\mshta.exe" "javascript:var objShellApp = new ActiveXObject('Shell.Application');var Folder = objShellApp.BrowseForFolder(0, 'SELECT FOLDER',1, '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}');try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Folder.Self.Path)};catch (e){};close();" ^
    1^|more`
) do set %~1=%%i
chcp 866 >nul
Exit /B
0
69 / 59 / 18
Регистрация: 23.01.2017
Сообщений: 170
23.01.2017, 15:33 18
Знаю, что решение не идеально.

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
setlocal enabledelayedexpansion
 
for /r %%a in (*) do (
    for /f "useback tokens=1" %%b in (`"dir /t:c %%~fa|findstr /b /r [0-9][0-9]/"`) do (
        echo %%a
        set tm=%%b
        set tm=!tm:/=.!
        echo !tm!
        mkdir "C:\Backups" 2>nul
        cd /d "C:\Backups"
        set tm="C:\Backups\!tm!"
        echo !tm!
        cd
        ::Можете задать то, что хотите. Там будут создаваться папки.
        mkdir "!tm!" 2>nul & copy "%%~fa" "!tm!"
    )
)
 
endlocal
2
0 / 0 / 0
Регистрация: 04.06.2019
Сообщений: 5
13.08.2019, 10:43 19
а как бы переделать этот скрипт для работы с именами файлов и сортировать их по папкам по имени файла , у меня много файлов ворда и их объединяет только одно цифры в имени файла в названии к примеру Дог.1-192-19 Горналь.doc, Сп 1-192-19 Горналь.doc, Доп.1-192-19 Горналь.doc и т.д.
хотелось бы их распределить в одну папку с именем 1-192-19
0
4336 / 2126 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
13.08.2019, 11:23 20
mettall61, создайте новую тему, этой тут не место.
0
13.08.2019, 11:23
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2019, 11:23
Помогаю со студенческими работами здесь

Раскидать (рассортировать) медиа-файлы по папкам по критерию
Допустим, есть у меня файлы с музыкой, видео, медиа вобщем, в какой-то папке. И программой их нужно...

Раскидать по папкам с переименованием файлов по маске
Добрый день. Помогите пожалуйста. Необходимо общую кучу файлов типа yymmdd_000_имяфайла.xls...

разложить файлы по папкам с соответствующим именем
Вопрос по теме. Подскажите как можно реализовать следующую задачу: Есть папки с именованные от 1 до...

Распределение файлов по папкам, соответствующим расширениям файлов
Здравствуйте. Есть папка Downloads и в ней множество файлов с разным расширением (mp3, jpeg, rar и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала согласования+ стартер fast регистров. Файлы прилагаю. . . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru