![]() |
Перемещение файлов по маске
Добрый день.
Есть батник, который перемещает на сетевом диске из нескольких папок текстовые файлы 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 ? |
Цитата:
Код:
set sYear=%date:~6,4% |
А куда эту строчку необходимо вставить? Вместо 2020 ? Если есть возможность, покажите плз. напримере батника выше.
|
Цитата:
Какие всё таки имена файлов? Год берётся из имени? Или из сегодняшней даты? Или из даты последнего изменения файла? Позволю себе наглость применить решение(экспромпт, не проверял) Iska к тому, что Вы написали: Код:
set sYear=%date:~6,4% |
Цитата:
Батник должен работать таким образом, чтобы все файлы, которые будут помещаться в папки test1 test2 и test3 перемещались в соответствующие (в эти же) папки по соответствующему году, чтобы в батнике каждый год не менять руками именно год. Т.е. структура каталогов должна быть будет такой последовательности: test1 2020 test_2020.txt 2021 test_2021.txt 2022 test_2022.txt Т.е. файлов за 2021 и 2022 год естественно еще нет, они появятся в папке когда будет соответствующий год. Т.е. здесь также важно учитывать не только год в имени файла, но и дата создания файла. При этом папка с годом должна создаваться сама. Если это условие сложное, то можно в принципе заранее сделать папок на лет 10 вперед, этого уж точно хватит :) Главное, чтобы не менять в батнике год руками каждый раз. ОС - Windows Server 2012. |
Цитата:
|
Вобщем, попробовал такой батник
set sYear=%date:~6,4% ROBOCOPY c:\test\test1\ c:\test\test1\%sYear%\ *report_stat2020%sYear%.txt* /MOV /IS ROBOCOPY c:\test\test2\ c:\test\test2\%sYear%\ *report_stat2020%sYear%.txt* /MOV /IS ROBOCOPY c:\test\test3\ c:\test\test3\%sYear%\ *report_stat2020%sYear%.txt* /MOV /IS Папки с годом 2020 создались в каждом каталоге, файлы не переместились. Возможно это связано с тем, что файлы в папке test1 и test2 я положил старые, соответствующие году, а в дальнейшем будет нормально, тут сложно сказать, надо дождаться след. года или заморачиваться сменой даты на компе. В любом случае, файлы текущего года в папку 2020 не переместились. |
Цитата:
Цитата:
Вариант
Код:
@Echo Off |
Символа "_" нет.
Вобщем, вот такой файл: report_stat2020011713ReadUser.txt последняя цифра - это час, но мне час учитывать не нужно, а только год |
finderhd, А смотрите, что Вы наваяли, и какое реальное имя:
Код:
report_stat2020011713ReadUser.txt report_stat%sYear%*ReadUser.txt |
Поправил батник, запустил. В каждом каталоге создались папки с годами 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 Цитата:
|
finderhd, Применительно к моему скрипту, надо делать так:
Код:
Call :MyMove "C:\test\test1" "C:\test\test1" "report_stat" "*ReadUser.txt" Код:
Call :MyMove "C:\test\test1" "C:\test\test1" "report_stat" "*.txt" Цитата:
Кстати, вместо Robocopy вполне подойдёт Move
Код:
@Echo Off |
Цитата:
|
Цитата:
|
Попробовал запустить так:
Скрытый текст
@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 |
Цитата:
|
Цитата:
Цитата:
Доработал. Смотрим 5 последних лет, включая текущий год. (можете поставить любой диапазон)
Если данных нет, папка не создастся Код:
@Echo Off |
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Код:
Set /A OldYear=%Year%-5 Помню о начале года и возможной смеси файлов. Естественно, если в новом году появятся файлы нового года (в имени указан новый год), то новая папка со значением нового года создастся. Смотрим Ваш пример: Цитата:
В моём последнем посте для примера прописаны разные выходные папки |
Цитата:
Как я понял: Call Set /A Y=%Year%+%%i меняем на Set /A OldYear=%Year%-5 ? А почему 1 советуете, а не -5? Цитата:
Цитата:
upd: попробовал Set /A OldYear=%Year%-5 - на обычном компе работает корректно (ОС: Win7 rus) - файлы перемещаются как надо, папка создается, на сервере (Win2012 R2 eng) некорректно - батник пишет что файлы промувил, а они так и остались лежать на месте, папка при этом не создалась. |
Цитата:
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" Цитата:
|
Цитата:
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 Цитата:
|
Такое ощущение, что у нас разговор на разные темы, мы обсуждаем разные батники и Вы меня не слышите. Я ссылаюсь на один (кстати, я бы его не стал делать, если бы Вы не предъявляли претензий, что файлы 2018 года не обрабатываются), а Вы мне цитируете другой. Повторю, чтобы не было разночтений.
Скрипт: Код:
@Echo Off Там надо изменить одну строку в зависимости от волатильности Ваших запросов: 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" |
Только что проверил этот батник просто поменяв пути на свои - не работает он на WinServer 2012, на моей 7-ке винде - работает, и 2019 год папка лишняя не создается, если проверять. А вот на серваке - ничего не происходит, даже ошибку не выдает. Папка 2020 не создается, файлы остаются лежать там же где и лежали.
|
finderhd,
Вот вариант с созданием лог-файла рядом с батником. Дайте его посмотреть.
Код:
@Echo Off |
Цитата:
PS. Подумал еще про один момент, что данный скриптик может быть очень полезен для других задачек, где потребуется распределение и остальных файлов, по годам создания. Пока такой необходимости прям нет, но может же пригодиться. Если Вам не сложно, будьте добры, подскажите, что нужно добавить в скрипт, чтобы и по остальным годам создавались папки и перемещались туда файлы (чтобы скрипт смотрел именно дату создания/изменения)? |
Время: 21:58. |
Время: 21:58.
© OSzone.net 2001-