PDA

Показать полную графическую версию : [решено] Перемещение файлов по маске


Страниц : [1] 2

finderhd
16-01-2020, 13:58
Добрый день.
Есть батник, который перемещает на сетевом диске из нескольких папок текстовые файлы 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 ?

Iska
16-01-2020, 19:11
но есть вопрос, как сделать так, чтобы папка с годом была динамическая? »
set sYear=%date:~6,4%
echo [%sYear%]

finderhd
17-01-2020, 10:25
А куда эту строчку необходимо вставить? Вместо 2020 ? Если есть возможность, покажите плз. напримере батника выше.

megaloman
17-01-2020, 10:47
текстовые файлы test_MMDD.txt по маске "test_2020" »
Не понимаю, Вы указали в имени файла месяцы и дни, а маску пишите на год, причем после года подразумеваете еще какие-то символы.
Какие всё таки имена файлов? Год берётся из имени? Или из сегодняшней даты? Или из даты последнего изменения файла?
Позволю себе наглость применить решение(экспромпт, не проверял) Iska к тому, что Вы написали:set sYear=%date:~6,4%
ROBOCOPY \\netdisk\Folder1\ \\netdisk\Folder1\%sYear%\*test_%sYear%*.txt* /MOV /IS
ROBOCOPY \\netdisk\Folder2\ \\netdisk\Folder2\%sYear%\*test_%sYear%*.txt* /MOV /IS
ROBOCOPY \\netdisk\Folder3\ \\netdisk\Folder3\%sYear%\*test_%sYear%*.txt* /MOV /IS
при условии, что дата в системе в формате дд.мм.гггг, папка с годом уже существует, в начале года не может быть ситуации, когда в исходных папках есть файлы с именами за прошлый год.

finderhd
17-01-2020, 12:51
Не понимаю, Вы указали в имени файла месяцы и дни, а маску пишите на год, причем после года подразумеваете еще какие-то символы.
Какие всё таки имена файлов? Год берётся из имени? Или из сегодняшней даты? Или из даты последнего изменения файла?
Позволю себе наглость применить решение(экспромпт, не проверял) Iska к тому, что Вы написали: »
Я имел в виду, что файлы помещаются в папку в таком формате, т.е. с месяцем и датой, а батник смотрит по маске года. Т.е. важен только год, а не месяц или дата файла. Прошу прощения, если не уточнил сразу.

Батник должен работать таким образом, чтобы все файлы, которые будут помещаться в папки test1 test2 и test3 перемещались в соответствующие (в эти же) папки по соответствующему году, чтобы в батнике каждый год не менять руками именно год.

Т.е. структура каталогов должна быть будет такой последовательности:

test1
2020
test_2020.txt
2021
test_2021.txt
2022
test_2022.txt

Т.е. файлов за 2021 и 2022 год естественно еще нет, они появятся в папке когда будет соответствующий год. Т.е. здесь также важно учитывать не только год в имени файла, но и дата создания файла. При этом папка с годом должна создаваться сама. Если это условие сложное, то можно в принципе заранее сделать папок на лет 10 вперед, этого уж точно хватит :) Главное, чтобы не менять в батнике год руками каждый раз.

ОС - Windows Server 2012.

finderhd
17-01-2020, 12:59
каким образом? В Вашем примере robocopy время создания никак не учитывает »
Ну да, не учитывает, т.к. год указан в явном, а не динмаическом виде. Наверное я не правильно выразился, вобщем, главное, чтобы последующие папки с годами создавались автоматически, и туда бы перемещались файлы по также, динамической маске, чтобы не править батник руками каждый год.

finderhd
17-01-2020, 13:40
Вобщем, попробовал такой батник

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 не переместились.

megaloman
17-01-2020, 13:57
*bank_stat%sYear%.txt* » *test_2020*.txt* »Дайте одно реальное имя, маска правильно указана? Символ "_" перед годом не нужен?
@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" "*bank_stat_" ".txt*"

Call :MyMove "C:\test\test1" "C:\test\test1" "*bank_stat_" ".txt*"
Call :MyMove "C:\test\test2" "C:\test\test2" "*bank_stat_" ".txt*"
Call :MyMove "C:\test\test3" "C:\test\test3" "*bank_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
17-01-2020, 16:00
Символа "_" нет.
Вобщем, вот такой файл:

report_stat2020011713ReadUser.txt
последняя цифра - это час, но мне час учитывать не нужно, а только год

megaloman
17-01-2020, 16:13
finderhd, А смотрите, что Вы наваяли, и какое реальное имя: report_stat2020011713ReadUser.txt
*report_stat2020%sYear%.txt* Вы же хотели иметь в имени год, который руками не вводится. Ваша маска не соответствует файлу. Я бы написал

report_stat%sYear%*ReadUser.txt

finderhd
17-01-2020, 16:17
Поправил батник, запустил. В каждом каталоге создались папки с годами 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

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

megaloman
17-01-2020, 16:28
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"
То есть пИшите маску до года и маску после года, скрипт из этого склеивает маску для нужного года.Нужно чтобы создавались папки и в них перемещались файлы, у которых соответствующий год создания. »Не понимаю еще раз: год в имени файла или надо вытянуть год из свойств файла? Ваш скрипт этого не делает, он берёт год по маске из имени файла. Иначе Ваш скрипт полностью не годится.@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

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

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

finderhd
17-01-2020, 17:11
Попробовал запустить так:


@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

Iska
17-01-2020, 17:18
созданные »
Как Вы определяете, что они были созданы в 2018 году? Буквально.

megaloman
17-01-2020, 17:22
папка 2018 не создалась и файлы в корне папки test1 за 2018 год не переместились »Вы что, собираетесь год ничего не делать? Я рассматриваю только 2 года: текущий и прошлый. Можно, конечно, наваять скрипт, который просмотрит все файлы, но смысл?папка 2019 не должна была создаваться, т.к. боюсь что скрипт может потереть важные файлы »Команда MD (создание папки) никак не может повредить каким-либо файлам. Она или создаст папку (если её не было), или ничего не сделает (если папка была). Смысла анализировать, есть ли файлы за какой-то год и в зависимости от этого создавать или не создавать папку - никакого. За год, ИМХО, у Вас обязательно появятся файлы текущего года. В крайнем случае получите в конце года пустую папку. Если это критично - можно, конечно, доработать .... Смысл?@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Входная и выходные папки могут совпадать, а могут и не совпадать

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

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

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

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

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

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

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

меняем на

Set /A OldYear=%Year%-5

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


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

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

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




© OSzone.net 2001-2012