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

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

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

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


Сообщения: 32
Благодарности: 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

 

Ветеран


Contributor


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

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


Цитата finderhd:
Не совсем ясно, куда это вставить? Я не вижу ранее в батнике OldYear »
Потому что Вы смотрите не тот батник. Надо вот этот Там надо изменить одну строку:
Set /A OldYear=%Year%-5 - пять лет
Set /A OldYear=%Year%-1 - текущий год и прошлый
Set /A OldYear=%Year%-0 или Set /A OldYear=%Year% - только текущий год (0 оставил для памяти, куда вставлять количество лет)
Надеюсь пути в скрипте укажете свои правильно, если брать Ваш пример из вопроса, то:
Call :MyMove "\\netdisk\Folder1" "\\netdisk\Folder1" "report_stat" "??????ReadUser.txt"
Цитата finderhd:
батник пишет что файлы промувил, а они так и остались лежать на месте, папка при этом не создалась. »
Хотелось бы это написанное увидеть.

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


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


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



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

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


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


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

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


Цитата megaloman:
Потому что Вы смотрите не тот батник. Надо вот этот Там надо изменить одну строку: »
Я именно его и использую, всё отлично, но когда меняю Set /A Y=%Year%+%%i на Set /A OldYear=%Year%-5, то конкретно на WinServer 2012 он не работает, а на моем компе с Win7 работает безупречно. Вот и возникли подозрения, что у рус версии винды год то идет в конце даты, а в английской спереди, в системном плане, так то на панели инструментов время показывает как одинаково.

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:
Хотелось бы это написанное увидеть. »
Уточняю, там было написано "3 files moved". но по факту они остались лежать там же. Чуть позже воспроизведу и сделаю скрин.

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


Ветеран


Contributor


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

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


Такое ощущение, что у нас разговор на разные темы, мы обсуждаем разные батники и Вы меня не слышите. Я ссылаюсь на один (кстати, я бы его не стал делать, если бы Вы не предъявляли претензий, что файлы 2018 года не обрабатываются), а Вы мне цитируете другой. Повторю, чтобы не было разночтений.
Скрипт:
Код: Выделить весь код
@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
Дополнение (повтор предыдущего):
Там надо изменить одну строку в зависимости от волатильности Ваших запросов:
Set /A OldYear=%Year%-5 - пять лет
Set /A OldYear=%Year%-1 - текущий год и прошлый
Set /A OldYear=%Year%-0 или Set /A OldYear=%Year% - только текущий год (0 оставил для памяти, куда вставлять количество лет)
Надеюсь пути в скрипте укажете свои правильно, если брать Ваш пример из вопроса, то:
Call :MyMove "\\netdisk\Folder1" "\\netdisk\Folder1" "report_stat" "??????ReadUser.txt"

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


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

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

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


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


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

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


Только что проверил этот батник просто поменяв пути на свои - не работает он на WinServer 2012, на моей 7-ке винде - работает, и 2019 год папка лишняя не создается, если проверять. А вот на серваке - ничего не происходит, даже ошибку не выдает. Папка 2020 не создается, файлы остаются лежать там же где и лежали.

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


Ветеран


Contributor


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

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


finderhd,
Вот вариант с созданием лог-файла рядом с батником. Дайте его посмотреть.
Код: Выделить весь код
@Echo Off
cls
	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Year=%%d"
	Set "Log=%~dpnx0_%Year:~0,8%.log"
	Set /A Year=%Year:~0,4%

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

	>>"%Log%" 2>>&1 Call :MyMove "\\Server\Test1\test1" "\\Server\Test1\test1" "report_stat" "??????ReadUser.txt"
	>>"%Log%" 2>>&1 Call :MyMove "\\Server\Test1\test2" "\\Server\Test1\test2" "report_stat" "??????ReadUser.txt"
	>>"%Log%" 2>>&1 Call :MyMove "\\Server\Test1\test3" "\\Server\Test1\test3" "report_stat" "??????ReadUser.txt"
rem pause
Exit /B 0

:MyMove

Set /A NNNN+=1
Set "A=%1" &If Not Exist %1 Set "A=%1  not exist"
Set "B=%2" &If Not Exist %2 Set "B=%2  not exist"

Echo.
Echo === %Date% %Time% ===========  Year=%Year% === %NNNN%
Echo  1= %A%
Echo  2= %B%
Echo  3= %3
Echo  4= %4
If Not Exist "%~1\%~3%Year%%~4" (
	Echo "%~1\%~3%Year%%~4"  not exist
	Dir /B /A:-D %1
)

	Set /A OldYear=%Year%-5
	Set /A OldYear=%Year%-0
	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, 29-01-2020 в 08:49.

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

Отправлено: 18:10, 28-01-2020 | #25


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


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

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


Цитата megaloman:
подозреваю, указываете неверные пути, или к ним нет доступа »
Добрый день! Извините за столь долгий ответ. Точно, была лишняя папка в путях. Теперь всё работает как надо! Спасибо!

PS. Подумал еще про один момент, что данный скриптик может быть очень полезен для других задачек, где потребуется распределение и остальных файлов, по годам создания. Пока такой необходимости прям нет, но может же пригодиться.
Если Вам не сложно, будьте добры, подскажите, что нужно добавить в скрипт, чтобы и по остальным годам создавались папки и перемещались туда файлы (чтобы скрипт смотрел именно дату создания/изменения)?

Последний раз редактировалось finderhd, 12-02-2020 в 10:46.


Отправлено: 10:21, 12-02-2020 | #26



Компьютерный форум 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




 
Переход