Копирование из каталога в каталог по условию
Здравствуйте. Помогите пожалуйста.
chcp 65001 rem объявляю переменные set DirNaznachenie="Z:\kuda_kopiruestya" set DirNaznachenieFile="Z:\kuda_kopiruestya\DirNaznachenieFile.txt" set FindstrResultatFile="Z:\kuda_kopiruestya\FindstrResultatFile.txt" set DirNaznachenieMmYyyy="Z:\kuda_kopiruestya\%mmyy%" set mm=%date:~3,2% set yy=%date:~8,2% set yyyy=%date:~6,4% set mmyy=%mm%.%yy% set mmPlus="%mm%*" set TekGod="Z:\otkuda_kopiruestya\%yyyy%" set TekGodMesyac="Z:\otkuda_kopiruestya\%yyyy%\%mm%" set TekGodMesyacPlus="Z:\otkuda_kopiruestya\%yyyy%\%mmPlus%" rem проверка существования директории-источника, то есть создал ли пользователь дирекорию, которая будет наполняться целевыми файлами if exist %TekGodMesyacPlus% goto :ProverkaDirNaznach if not exist %TekGodMesyacPlus% goto :end :ProverkaDirNaznach rem получаем список имен каталогов в директории назначения и сохраняем в файл, чтобы проверить, не создан ли уже каталог с наименовнаием %mmyy% dir /b /d %DirNaznachenie% > %DirNaznachenieFile% rem проверяем есть ли в директории каталог, в имени которого текущий месяц и год (по условию), то есть, например каталог с наименованием 05.21 findstr /c:%mmyy% %DirNaznachenieFile% > %FindstrResultatFile% rem если, ниже, в команде for не будет usebackq и выражение будет в '' кавычках, то вывод будет Z:\PTO, а не ожидаемый, поэтому кавычки убираем, usebackq добавляем rem если есть, то выход и удаление текстовых файлов, копирование файлов в созданный каталог, если нет, то создается директория (а потом - также, копируются файлы *.xls, удаляются созданные *.txt FOR /F "usebackq tokens=1 delims= " %i in (%FindstrResultatFile%) do if %i equ "" goto :procedura else goto :end :procedura mkdir %DirNaznachenieMmYyyy% del %DirNaznachenieFile%, %FindstrResultatFile% goto :kopirovanie exit :kopirovanie xcopy /d %TekGodMesyacPlus%\408*.xls %DirNaznachenieMmYyyy% exit :end Застопорился тут: FOR /F "usebackq tokens=1 delims= " %i in (%FindstrResultatFile%) do if %i equ "" goto :procedura else goto :end По какой-то не понятной мне причине не переходит к :procedura В данном случае в файле FindstrResultatFile.txt - ничего нет, он пустой. Сравниваю тоже с пустым значением, но почему-то не переходит дальше. Пробовал FOR /F "usebackq tokens=* delims= " FOR /F "usebackq tokens=*" FOR /F "usebackq" Все равно не переходит... Помогите пожалуйста разобраться и сделать, чтобы был переход к процедуре |
epoddubniy,
просто опишите задачу что требуется и как хочется, а мы поможем. |
1. используйте тег code
2. не используйте goto там где это ненужно (в приведенном коде - нигде не нужно) 3. выдергивать куски даты из переменной %date% - не самый надежный вариант (при запуске на компьютерах с другими региональными настрйками они могут как минимум поменяться местами), можно дергать через wmic или запрашивать из pwsh где-то на предыдущем пункте я понял почему alpap сразу затребовал условие, вместо ковырятельства в листинге 4. кстати за pwsh: почему не PowerShell? 5. Зачем собирать данные по наличию каталогов по маске и складывать их в файл, чтобы потом из этого файла проводить аналогичную проверку? 6. "usebackq tokens=1 delims= " 6.1. вижу пробел после delims=, если он там действительно есть, то for пытается разделить значения в файле через пробел, а раз файл пустой, то разделять нечего, разумеется цикл не проходит. 6.2. если пробел таки опечатка (что логично предположить) и выдергиваться должна строка (что тоже логично, туда ведь имена папок складываются, вроде бы), то зачем здесь tokens=1? |
Цитата:
Код:
@echo off |
если уж на то пошло там и for -то не нужен
вот логика с минимальной проверкой на живом примере: Код:
@echo on |
Цитата:
В каталоге источнике каждый год пользователем А создаются папки с намиенованием года (2019, 2020, 2021...) Также в каждом из этих каталогов, после перехода на новый месяц, создаются подкаталоги такого формата: 01 январь, 02 февраль, 03 март и т.д. В каждый из этих каталогов ежедневно с понедельника по пятницу сохраняются файлы расширения .xls в наименовании которых есть последовательность симоволов "408*_21" Есть каталог-назначение, в котором в зависимости от месяца и года создаются каждый месяц подкаталоги такого формата: 01.21, 02.21, 03. Цитата:
Каждый месяц пользователь Б копирует в соответствующую папку (например, текущий месяц май, следовательно будут копироваться файлы из директории "05 май" в "05.2021") а также переименовывает эти файлы, то есть "408*_21" становится "408*_2021". Оба каталога находятся на сетевой шаре. Цитата:
Цитата:
Цитата:
|
Код:
@Echo Off |
epoddubniy, я просил описать задачу. а не то как происходит или вы не имеете права все взять в свои руки? Тогда поясните почему:
- первое Цитата:
Цитата:
кем/чем и когда запускается скрипт что приходится делать проверку на создаваемые директории, почему не делать это автоматом из планировщика каждую субботу, например. Соответственно третий вопрос - третье кем/чем выполняется это действие Цитата:
|
PowerShell
Код:
$sSrc = 'C:\каталог источник' |
Цитата:
FOR /F "usebackq tokens=1 delims= " %i in (%FindstrResultatFile%) do if %i equ "" goto :procedura else goto :end гораздо менее удобно чем такое Код:
FOR /F "usebackq tokens=1 delims= " %i in (%FindstrResultatFile%) do if %i equ "" goto :procedura else goto :end Код:
FOR /F "usebackq tokens=1 delims= " %i in (%FindstrResultatFile%) do if %i equ "" ( |
Цитата:
epoddubniy, Вообще-то, если хотите (ИМХО, похвально!), организовывать код в виде выделенных процедур, то GoTo не годится, надо использовать Call. У Вас, например, есть процедура: Код:
:procedura Call :procedura После этого выполнение командного файла продолжится дальше |
Цитата:
|
что вы спорите, если условие задачи вообще никуда:
копировать по условию, а условие - есть папка или нет (та, куда копируем) и если нет создаем. Я понимаю, если папки сами создаются, я и задавал выше ТС подобные вопросы поэтому. В данном случае условие это: или появление нового(ых) файла(ов) или момент запуска кода, последнее я и брал за условие в моем коде на PS. |
Время: 22:30. |
Время: 22:30.
© OSzone.net 2001-