|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Копирование из каталога в каталог по условию |
|
|
CMD/BAT - [решено] Копирование из каталога в каталог по условию
|
Пользователь Сообщения: 105 |
Профиль | Отправить PM | Цитировать Здравствуйте. Помогите пожалуйста.
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" Все равно не переходит... Помогите пожалуйста разобраться и сделать, чтобы был переход к процедуре |
|
Отправлено: 14:38, 11-05-2021 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать epoddubniy,
просто опишите задачу что требуется и как хочется, а мы поможем. |
Отправлено: 15:01, 11-05-2021 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 992
|
Профиль | Сайт | Отправить PM | Цитировать 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? |
Отправлено: 11:17, 12-05-2021 | #3 |
Ветеран Сообщения: 1273
|
Профиль | Отправить PM | Цитировать Цитата epoddubniy:
|
|
Отправлено: 14:06, 12-05-2021 | #4 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать если уж на то пошло там и for -то не нужен
вот логика с минимальной проверкой на живом примере: |
|
Отправлено: 15:39, 12-05-2021 | #5 |
Пользователь Сообщения: 105
|
Профиль | Отправить PM | Цитировать Цитата alpap:
В каталоге источнике каждый год пользователем А создаются папки с намиенованием года (2019, 2020, 2021...) Также в каждом из этих каталогов, после перехода на новый месяц, создаются подкаталоги такого формата: 01 январь, 02 февраль, 03 март и т.д. В каждый из этих каталогов ежедневно с понедельника по пятницу сохраняются файлы расширения .xls в наименовании которых есть последовательность симоволов "408*_21" Есть каталог-назначение, в котором в зависимости от месяца и года создаются каждый месяц подкаталоги такого формата: 01.21, 02.21, 03. Цитата epoddubniy:
Каждый месяц пользователь Б копирует в соответствующую папку (например, текущий месяц май, следовательно будут копироваться файлы из директории "05 май" в "05.2021") а также переименовывает эти файлы, то есть "408*_21" становится "408*_2021". Оба каталога находятся на сетевой шаре. Цитата Elven:
Цитата El Sanchez:
Цитата epoddubniy:
|
|||||
Отправлено: 19:18, 13-05-2021 | #6 |
Ветеран Сообщения: 2726
|
Профиль | Отправить PM | Цитировать @Echo Off cls Set "BoxIn=\\192.168.100.23\Test1" Set "BoxOut=\\192.168.100.23\Test2" FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO Set "Now=%%d" Set "YYYY=%Now:~0,4%" Set "YY=%Now:~2,2%" Set "MM=%Now:~4,2%" Set "Mask=408*_%YY%.xls" If Not Exist "%BoxOut%\%MM%.%YYYY%" Md "%BoxOut%\%MM%.%YYYY%" For /f "usebackq delims=" %%d In (`2^>nul Dir /B /A:D "%BoxIn%\%YYYY%\%MM%*"`) Do ( For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\%YYYY%\%%d\%Mask%"`) Do ( Call :MyCopy "%BoxIn%\%YYYY%\%%d\%%f" "%BoxOut%\%MM%.%YYYY%" ) ) pause Exit /B :MyCopy Set "Name=%~nx1" Call Set "NameNew=%%Name:_%YY%%~x1=_%YYYY%%~x1%%" If Not Exist "%~2\%NameNew%" ( >nul Copy %1 "%~2\%NameNew%" ) Else ( >nul Xcopy /D /Y %1 "%~2\%NameNew%" ) Exit /B |
------- Отправлено: 22:54, 13-05-2021 | #7 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать epoddubniy, я просил описать задачу. а не то как происходит или вы не имеете права все взять в свои руки? Тогда поясните почему:
- первое Цитата epoddubniy:
Цитата epoddubniy:
кем/чем и когда запускается скрипт что приходится делать проверку на создаваемые директории, почему не делать это автоматом из планировщика каждую субботу, например. Соответственно третий вопрос - третье кем/чем выполняется это действие Цитата epoddubniy:
|
|||
Отправлено: 23:24, 13-05-2021 | #8 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать PowerShell
$sSrc = 'C:\каталог источник' $sDst = 'C:\каталог назначение' $prf = 408 $ext = 'xls' $sY = '{0:yyyy}' -f (Get-Date) $sM = '{0:MM} {0:MMMM}' -f (Get-Date) $sM1 = '{0:MM} {0:MMMM}' -f (Get-Date).AddMonths(1) # Создаем заранее каталог наполнения на следующий месяц $sMY = '{0:MM}.{0:yyyy}' -f (Get-Date) $sFl = "$prf*_{0:yy}.$ext" -f (Get-Date) if (!(Test-Path "$sSrc\$sY\$sM1")) {ni "$sSrc\$sY\$sM1" -i Dir|Out-Null} if (!(Test-Path "$sDst\$sMY")) {ni "$sDst\$sMY" -i Dir|Out-Null} $afSrc = gci $sSrc\$sY\$sM $sFl -r -af foreach ($i in $afSrc) {cpi $i $sDst\$sMY\$($i.Name -Replace '_\d{2}', {'_{0:yyyy}' -f (Get-Date)})} |
Отправлено: 03:46, 14-05-2021 | #9 |
Ветеран Сообщения: 992
|
Профиль | Сайт | Отправить PM | Цитировать Цитата epoddubniy:
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 "" ( echo вот здесь goto :procedura заменяется блоком команд ) else ( echo как и здесь goto :end echo ну или выходом с определенным кодом, если так больше нравится echo и голова не болит, от подозрений о где-то незакрытом goto который может выполниться не тогда когда нужно, а, например, при каждом запуске bat'ника ) |
|
Отправлено: 09:50, 14-05-2021 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Перемещение файлов из каталога в каталог | servad | Скриптовые языки администрирования Windows | 9 | 30-01-2020 03:50 | |
CMD/BAT - [решено] Копирование строк в отдельный файл по условию | Seryoga204 | Скриптовые языки администрирования Windows | 26 | 24-08-2016 23:33 | |
CMD/BAT - Скопировать файл из текущего каталога в каталог уровнем выше | adrin | Скриптовые языки администрирования Windows | 2 | 22-12-2015 17:52 | |
CMD/BAT - [решено] Копирование файла по условию его содержимого | XSubZero | Скриптовые языки администрирования Windows | 3 | 16-05-2012 17:13 | |
CMD/BAT - [решено] Копирование и запуск по условию | AlexVong | Скриптовые языки администрирования Windows | 2 | 25-10-2010 14:03 |
|