Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Перемещение файлов по маске (http://forum.oszone.net/showthread.php?t=343689)

finderhd 16-01-2020 13:58 2905301

Перемещение файлов по маске
 
Добрый день.
Есть батник, который перемещает на сетевом диске из нескольких папок текстовые файлы 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 2905350

Цитата:

Цитата finderhd
но есть вопрос, как сделать так, чтобы папка с годом была динамическая? »

Код:

set sYear=%date:~6,4%
echo [%sYear%]


finderhd 17-01-2020 10:25 2905424

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

megaloman 17-01-2020 10:47 2905426

Цитата:

Цитата finderhd
текстовые файлы 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 2905443

Цитата:

Цитата megaloman
Не понимаю, Вы указали в имени файла месяцы и дни, а маску пишите на год, причем после года подразумеваете еще какие-то символы.
Какие всё таки имена файлов? Год берётся из имени? Или из сегодняшней даты? Или из даты последнего изменения файла?
Позволю себе наглость применить решение(экспромпт, не проверял) 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 2905446

Цитата:

Цитата megaloman
каким образом? В Вашем примере robocopy время создания никак не учитывает »

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

finderhd 17-01-2020 13:40 2905460

Вобщем, попробовал такой батник

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 2905466

Цитата:

Цитата finderhd
*bank_stat%sYear%.txt* »

Цитата:

Цитата finderhd
*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 2905501

Символа "_" нет.
Вобщем, вот такой файл:

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

megaloman 17-01-2020 16:13 2905504

finderhd, А смотрите, что Вы наваяли, и какое реальное имя:
Код:

report_stat2020011713ReadUser.txt
*report_stat2020%sYear%.txt*

Вы же хотели иметь в имени год, который руками не вводится. Ваша маска не соответствует файлу. Я бы написал

report_stat%sYear%*ReadUser.txt

finderhd 17-01-2020 16:17 2905505

Поправил батник, запустил. В каждом каталоге создались папки с годами 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 и поменять файл по маске. В принципе интересуют только текущий и последующие года. Старые не важны, т.к. там файлы по соответствующим годам уже лежат, их раньше переносили руками.

megaloman 17-01-2020 16:28 2905509

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


finderhd 17-01-2020 16:51 2905514

Цитата:

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

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

megaloman 17-01-2020 16:57 2905515

Цитата:

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

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

finderhd 17-01-2020 17:11 2905517

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

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

@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 2905518

Цитата:

Цитата finderhd
созданные »

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

megaloman 17-01-2020 17:22 2905519

Цитата:

Цитата 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

Входная и выходные папки могут совпадать, а могут и не совпадать

finderhd 17-01-2020 18:40 2905534

Цитата:

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

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

Цитата:

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

На данный момент прошлый год не нужен. Нужен текущий и все последующие.

Цитата:

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

Я проверю конечно. Если файлы не будут затронуты, то конечно, смысла в доработке, если она требует лишних телодвижений, нет. Ну а так, забыл еще добавить, файлы не помещаются в каталог каждый день, но батник должен проверять ежедневно, в конце дня. Их появление рандомное. Хотя, вроде это не суть важно.

Цитата:

Цитата megaloman
Входная и выходные папки могут совпадать, а могут и не совпадать »

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

megaloman 17-01-2020 20:19 2905552

Цитата:

Цитата 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\, лишь бы эта папка была доступна.
В моём последнем посте для примера прописаны разные выходные папки

finderhd 21-01-2020 13:04 2906068

Цитата:

Цитата 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) некорректно - батник пишет что файлы промувил, а они так и остались лежать на месте, папка при этом не создалась.

megaloman 21-01-2020 14:13 2906084

Цитата:

Цитата 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
батник пишет что файлы промувил, а они так и остались лежать на месте, папка при этом не создалась. »

Хотелось бы это написанное увидеть.

finderhd 21-01-2020 15:57 2906107

Цитата:

Цитата 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". но по факту они остались лежать там же. Чуть позже воспроизведу и сделаю скрин.

megaloman 21-01-2020 17:02 2906122

Такое ощущение, что у нас разговор на разные темы, мы обсуждаем разные батники и Вы меня не слышите. Я ссылаюсь на один (кстати, я бы его не стал делать, если бы Вы не предъявляли претензий, что файлы 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"

finderhd 28-01-2020 16:48 2907357

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

megaloman 28-01-2020 18:10 2907386

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

Пути, естественно, пропишИте свои.
подозреваю, указываете неверные пути, или к ним нет доступа

finderhd 12-02-2020 10:21 2909216

Цитата:

Цитата megaloman
подозреваю, указываете неверные пути, или к ним нет доступа »

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

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


Время: 21:58.

Время: 21:58.
© OSzone.net 2001-