Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Перемещение файлов по маске

Ответить
Настройки темы
CMD/BAT - [решено] Перемещение файлов по маске

Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день.
Есть батник, который перемещает на сетевом диске из нескольких папок текстовые файлы test_MMDD.txt по маске "test_2020" через Robocopy в те же папки в соответствующие созданию файла, год - папки были созданы в ручную.
Файлы периодически помещаются в каждую папку Folder1, Folder2, Folder3, а вечером батник запускается и перемещает файлы, если таковые есть.

пример:

ROBOCOPY \\netdisk\Folder1\ \\netdisk\Folder1\2020\ *test_2020*.txt* /MOV /IS
ROBOCOPY \\netdisk\Folder2\ \\netdisk\Folder2\2020\ *test_2020*.txt* /MOV /IS
ROBOCOPY \\netdisk\Folder3\ \\netdisk\Folder3\2020\ *test_2020*.txt* /MOV /IS

Батник соответственно нормально работает, но есть вопрос, как сделать так, чтобы папка с годом была динамическая? Чтобы в следующем году не изменять в батнике в каждой строке цифры года как в папке "2020", так и файле по маске test_2020 ?

Отправлено: 13:58, 16-01-2020

 

Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Поправил батник, запустил. В каждом каталоге создались папки с годами 2019, 2020, но файлы не переместились.
Скрытый текст

@Echo Off
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Year=%%d"
Set /A Year=%Year:~0,4%

rem Call :MyMove "Z:\Box_In" "Z:\Box_Out" "*report_stat_" ".txt*"

Call :MyMove "C:\test\test1" "C:\test\test1" "*report_stat" ".txt*"
Call :MyMove "C:\test\test2" "C:\test\test2" "*report_stat" ".txt*"
Call :MyMove "C:\test\test3" "C:\test\test3" "*report_stat" ".txt*"
Exit /B 0

:MyMove
FOR /L %%i IN (0,-1,-1) DO (
Call Set /A Y=%Year%+%%i
Call 2>nul Md "%~2\%%Y%%"
Call RoboCopy "%~1" "%~2\%%Y%%" "%~3%%Y%%%~4" /MOV /IS
)
Exit /B


Цитата megaloman:
Вы же хотели иметь в имени год, который руками не вводится. Ваша маска не соответствует файлу. Я бы написал »
Не совсем понял что значит в имени год? Вы про маску файла? Нужно чтобы создавались папки и в них перемещались файлы, у которых соответствующий год создания. Дата, месяц, и время не важны. Исходный батник отлично работает, но его минус в том, что в следующем году, нужно будет руками создать новый каталог 2021 и поменять файл по маске. В принципе интересуют только текущий и последующие года. Старые не важны, т.к. там файлы по соответствующим годам уже лежат, их раньше переносили руками.

Последний раз редактировалось finderhd, 17-01-2020 в 16:27.


Отправлено: 16:17, 17-01-2020 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


finderhd, Применительно к моему скрипту, надо делать так:
Код: Выделить весь код
	Call :MyMove "C:\test\test1" "C:\test\test1" "report_stat" "*ReadUser.txt"
	Call :MyMove "C:\test\test2" "C:\test\test2" "report_stat" "*ReadUser.txt"
	Call :MyMove "C:\test\test3" "C:\test\test3" "report_stat" "*ReadUser.txt"
Или, в крайнем случае,
Код: Выделить весь код
Call :MyMove "C:\test\test1" "C:\test\test1" "report_stat" "*.txt"
То есть пИшите маску до года и маску после года, скрипт из этого склеивает маску для нужного года.
Цитата finderhd:
Нужно чтобы создавались папки и в них перемещались файлы, у которых соответствующий год создания. »
Не понимаю еще раз: год в имени файла или надо вытянуть год из свойств файла? Ваш скрипт этого не делает, он берёт год по маске из имени файла. Иначе Ваш скрипт полностью не годится.
Кстати, вместо Robocopy вполне подойдёт Move
Код: Выделить весь код
@Echo Off
	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Year=%%d"
	Set /A Year=%Year:~0,4%

rem	Call :MyMove "Z:\Box_In" "Z:\Box_Out" "report_stat" "*ReadUser.txt"

	Call :MyMove "C:\test\test1" "C:\test\test1" "report_stat" "*ReadUser.txt"
	Call :MyMove "C:\test\test2" "C:\test\test2" "report_stat" "*ReadUser.txt"
	Call :MyMove "C:\test\test3" "C:\test\test3" "report_stat" "*ReadUser.txt"
Exit /B 0

:MyMove
	FOR /L %%i IN (0,-1,-1) DO (
		Call Set /A Y=%Year%+%%i
		Call 2>nul Md "%~2\%%Y%%"
		Call Move /Y "%~1\%~3%%Y%%%~4" "%~2\%%Y%%\"			
	)
Exit /B

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 17-01-2020 в 16:37.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:28, 17-01-2020 | #12


Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Не понимаю еще раз: год в имени файла или надо вытянуть год из свойств файла? Ваш скрипт этого не делает, он берёт год по маске из имени файла. Иначе Ваш скрипт полностью не годится. »
В принципе, можно и так и так, без разницы, т.к. файлы создаются автоматически, по текущей дате (году) из другого источника. Т.е. какой тогда должна быть переменная, чтобы батник создавал папку динамически и переносил туда соответствующие году создания файлы.

Отправлено: 16:51, 17-01-2020 | #13


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Цитата finderhd:
Т.е. какой тогда должна быть переменная, чтобы батник создавал папку динамически и переносил туда соответствующие году создания файлы. »
О чем речь? О какой переменной? Реализовано! Мой скрипт берёт текущий год, если нет папки за этот год - она создаётся, в неё переносятся все файлы с этим годом. На всякий случай я пытаюсь сделать это и за прошлый год - возможна ситуация в начале года, когда на входе смесь файлов.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 16:57, 17-01-2020 | #14


Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Попробовал запустить так:

Скрытый текст

@Echo Off
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Year=%%d"
Set /A Year=%Year:~0,4%

Call :MyMove "C:\test\test1" "C:\test\test1" "report_stat" "*ReadUser.txt"
Call :MyMove "C:\test\test2" "C:\test\test2" "report_stat" "*ReadUser.txt"
Call :MyMove "C:\test\test3" "C:\test\test3" "report_stat" "*ReadUser.txt"
Exit /B 0

:MyMove
FOR /L %%i IN (0,-1,-1) DO (
Call Set /A Y=%Year%+%%i
Call 2>nul Md "%~2\%%Y%%"
Call Move /Y "%~1\%~3%%Y%%%~4" "%~2\%%Y%%\"
)
Exit /B

В папке test1 лежат файлы созданные в 2018 г.
В папке test2 в 2019 г.
В папке test3 в 2020 г.

Теперь ситуация получше, но... что сделал батник, скажу по пунктам + комментарий

1. В папке test1 появились две папки: 2019 и 2020, папка 2018 не создалась и файлы в корне папки test1 за 2018 год не переместились.
коментарий: В принципе за предыдущие годы мне не нужно, нужно чтобы за этот и последующие.

2. В папке test2 появились две папки: 2019 и 2020 в папку 2019, файлы за 2019 год переместились.
комментарий: здесь всё хорошо, кроме того что папка 2020 не должна была создаваться. Опять же, и этот пункт можно пропустить, т.к. предыдущие годы не нужны.

3. В папке test3 появились две папки: 2019 и 2020, файлы созданные в 2020 г переместились
комментарий: папка 2019 не должна была создаваться, т.к. боюсь что скрипт может потереть важные файлы, если его на рабочей папке запустить, поэтому в батнике пока тестовые папки.

Таким образом, что имеем. Первые два пункта можно пропустить и вообще не учитывать (хотя для информации хотелось бы знать, как реализовать, если вдруг такая необходимость возникнет). Третий пункт, получается, требует доработки. Вобщем, всё устраивает (завтра потестю с новыми файлами), только не должна создаваться папка 2019

Отправлено: 17:11, 17-01-2020 | #15


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата finderhd:
созданные »
Как Вы определяете, что они были созданы в 2018 году? Буквально.

Отправлено: 17:18, 17-01-2020 | #16


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Цитата finderhd:
папка 2018 не создалась и файлы в корне папки test1 за 2018 год не переместились »
Вы что, собираетесь год ничего не делать? Я рассматриваю только 2 года: текущий и прошлый. Можно, конечно, наваять скрипт, который просмотрит все файлы, но смысл?
Цитата finderhd:
папка 2019 не должна была создаваться, т.к. боюсь что скрипт может потереть важные файлы »
Команда MD (создание папки) никак не может повредить каким-либо файлам. Она или создаст папку (если её не было), или ничего не сделает (если папка была). Смысла анализировать, есть ли файлы за какой-то год и в зависимости от этого создавать или не создавать папку - никакого. За год, ИМХО, у Вас обязательно появятся файлы текущего года. В крайнем случае получите в конце года пустую папку. Если это критично - можно, конечно, доработать .... Смысл?
Доработал. Смотрим 5 последних лет, включая текущий год. (можете поставить любой диапазон)
Если данных нет, папка не создастся
Код: Выделить весь код
@Echo Off
	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Year=%%d"
	Set /A Year=%Year:~0,4%

rem	Call :MyMove "Z:\Box_In" "Z:\Box_Out" "report_stat" "??????ReadUser.txt"

	Call :MyMove "\\USA-CIA\Test111\test1" "\\USA-CIA\Test222\test1" "report_stat" "??????ReadUser.txt"
	Call :MyMove "\\USA-CIA\Test111\test2" "\\USA-CIA\Test222\test2" "report_stat" "??????ReadUser.txt"
	Call :MyMove "\\USA-CIA\Test111\test3" "\\USA-CIA\Test222\test3" "report_stat" "??????ReadUser.txt"
Exit /B 0

:MyMove
	Set /A OldYear=%Year%-5
	FOR /L %%Y IN (%Year%,-1,%OldYear%) DO (
		If Exist "%~1\%~3%%Y%~4" (
			If Not Exist "%~2\%%Y\" Md "%~2\%%Y" 
			Move /Y "%~1\%~3%%Y%~4" "%~2\%%Y\"			
		)
	)
Exit /B
Входная и выходные папки могут совпадать, а могут и не совпадать

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 21-01-2020 в 14:19.


Отправлено: 17:22, 17-01-2020 | #17


Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Как Вы определяете, что они были созданы в 2018 году? Буквально. »
Дата создания. И в имени файла указан год. Как я говорил, тут для будущего как бы без разницы, по какой маске перемещать файлы, главное, чтобы в папку текущего года перемещались файлы созданные в текущем году и в дальнейшем, когда наступит следующий год, создавалсь папка автоматом и перемещался туда файл следующего года, и так пожизненно, так сказать )

Цитата megaloman:
Вы что, собираетесь год ничего не делать? Я рассматриваю только 2 года: текущий и прошлый. Можно, конечно, наваять скрипт, который просмотрит все файлы, но смысл? »
На данный момент прошлый год не нужен. Нужен текущий и все последующие.

Цитата megaloman:
Команда MD (создание папки) никак не может повредить каким-либо файлам. Она или создаст папку (если её не было), или ничего не сделает (если папка была). Смысла анализировать, есть ли файлы за какой-то год и в зависимости от этого создавать или не создавать папку - никакого. За год, ИМХО, у Вас обязательно появятся файлы текущего года. В крайнем случае получите в конце года пустую папку. Если это критично - можно, конечно, доработать .... Смысл? »
Я проверю конечно. Если файлы не будут затронуты, то конечно, смысла в доработке, если она требует лишних телодвижений, нет. Ну а так, забыл еще добавить, файлы не помещаются в каталог каждый день, но батник должен проверять ежедневно, в конце дня. Их появление рандомное. Хотя, вроде это не суть важно.

Цитата megaloman:
Входная и выходные папки могут совпадать, а могут и не совпадать »
Не совсем понял этот момент. Спасибо, потестю. А что нужно изменить, чтобы он прошлые не учитывал, но не оставался лишь на 2020 году?

Последний раз редактировалось finderhd, 17-01-2020 в 18:51.


Отправлено: 18:40, 17-01-2020 | #18


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Цитата finderhd:
А что нужно изменить, чтобы он прошлые не учитывал, но не оставался лишь на 2020 году? »
Код: Выделить весь код
	Set /A OldYear=%Year%-5
Вместо 5 можно поставить любое число >=0. Я советую 1. 0 - только текущий год, не советую.
Помню о начале года и возможной смеси файлов.
Естественно, если в новом году появятся файлы нового года (в имени указан новый год), то новая папка со значением нового года создастся.
Смотрим Ваш пример:
Цитата finderhd:
ROBOCOPY \\netdisk\Folder1\ \\netdisk\Folder1\2020\ *test_2020*.txt* /MOV /IS »
Во входной папке \\netdisk\Folder1 находятся файлы. Папки с годом создаются там же. А можно указать и иной путь куда будут перемещаться файлы и создаваться папки по году, например \\netdisk222\Folder222\2020\, лишь бы эта папка была доступна.
В моём последнем посте для примера прописаны разные выходные папки

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 17-01-2020 в 20:27.


Отправлено: 20:19, 17-01-2020 | #19


Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Set /A OldYear=%Year%-5 »
Не совсем ясно, куда это вставить? Я не вижу ранее в батнике OldYear
Как я понял:

Call Set /A Y=%Year%+%%i

меняем на

Set /A OldYear=%Year%-5

? А почему 1 советуете, а не -5?


Цитата megaloman:
А можно указать и иной путь куда будут перемещаться файлы и создаваться папки по году, например \\netdisk222\Folder222\2020\, лишь бы эта папка была доступна. »
Нет, нужно строго в ту же папку, в корень которой скидываются файлы.

Цитата megaloman:
Помню о начале года и возможной смеси файлов. »
Такое исключено в принципе, т.к. файлы после нового года появляются не сразу, а спустя несколько дней. То же самое и до наступления нового года. Разве что в последний день перед новым годом.

upd: попробовал Set /A OldYear=%Year%-5 - на обычном компе работает корректно (ОС: Win7 rus) - файлы перемещаются как надо, папка создается, на сервере (Win2012 R2 eng) некорректно - батник пишет что файлы промувил, а они так и остались лежать на месте, папка при этом не создалась.

Последний раз редактировалось finderhd, 21-01-2020 в 13:25.


Отправлено: 13:04, 21-01-2020 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Перемещение файлов по маске

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Перемещение файлов по маске с созданием папки по дате в названии файла AndreH Скриптовые языки администрирования Windows 5 08-08-2018 09:14
CMD/BAT - [решено] Перемещение и удаление файлов по условию и маске VitHAK Скриптовые языки администрирования Windows 14 23-12-2013 08:57
CMD/BAT - Перемещение файлов по маске с сохранением структуры папок... nfs911 Скриптовые языки администрирования Windows 6 15-02-2013 00:08
CMD/BAT - Перемещение файлов по маске SanyaJoker Скриптовые языки администрирования Windows 0 17-11-2011 12:54
Delphi - Перемещение и удаление файлов по маске. Putin-mode Программирование и базы данных 1 21-06-2010 12:16




 
Переход