Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)

Модерирует : gyra, Maz

Maz (19-09-2020 13:36): Командная строка, батники, сценарии (bat, cmd) Часть 6  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

   

cchameleone



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Командная строка, батники\сценарии (bat, cmd)
(часть 1) (часть 2) (часть 3) (часть 4)
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Примечание: Большие куски кода заключайте в тэг [ more ].  

Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Microsoft Windows » Сценарии Windows

Полезные ссылки:
· Из Windows XP Professional Product Documentation:
» Описание Cmd.exe » Command shell overview
» Using batch files » Using batch parameters » Using filters » Using command redirection operators
 
· Уроки bat-аники (для начинающих): первый и второй
· Курс из 19 лекций "Командная строка и сценарии Windows"
· Попов А. Командная строка и сценарии Windows (PDF). Курс лекций для начинающих
· Бокалий В. Командная строка (pdf-брошюрка в 20 страниц)
· Александров А., Дибров А. Урок bat-аники (pdf)
· Уильям Р. Станек - Командная строка Windows. Справочник администратора
 
· Скрываем консольные окна, Выполнение BAT-скриптов без вызова окна консоли
· cmdow — изменение параметров и видимости дос-окна, Статья в КОМПЬЮТЕРРАONLINE
· Набор GNU утилит для win32
· HS_Packet.7z - Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· blat — отправка почты из консоли
· Команды RunDll32
· Quick Batch File Compiler - Позволяет превратить ваш батник в независимое приложение
· Easy Batch Builder+Rus+Crack - Редактор BAT файлов.Через графический интерфейс программы вы сможете быстро конструировать пакетные файлы практически любой сложности. (В комплекте есть Лоадер созданный с помощью Sign Of Misery некоторые антивирусы обзывают его вирусом. Вам решать: ставить или не ставить) (ЗЕРКАЛО)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек) ещё и ещё
· Переход из 32-битной версии cmd.exe в 64-битную (1) (2)(3)

Всего записей: 2271 | Зарегистр. 16-10-2015 | Отправлено: 09:22 29-04-2016 | Исправлено: Maz, 08:47 26-03-2020
insorg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть ли возможность в батнике сделать  одновременное выполнение нескольких фоновых команд (например, распаковать 4 архива одновременно на 4 ядерном ЦП) с ожиданием успешного выполнения всех из них?

Всего записей: 1955 | Зарегистр. 04-11-2010 | Отправлено: 17:12 22-02-2019
Jonmey

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Есть ли возможность в батнике сделать  одновременное выполнение нескольких фоновых команд (например, распаковать 4 архива одновременно на 4 ядерном ЦП) с ожиданием успешного выполнения всех из них?

напр.

Код:
start /affinity 1 "x:\path\winrar.exe" x -ibck "y:\path\arc1.rar" "z:\path10"
start /affinity 2 "x:\path\winrar.exe" x -ibck "y:\path\arc2.rar" "z:\path20"
start /affinity 4 "x:\path\winrar.exe" x -ibck "y:\path\arc3.rar" "z:\path30"
start /affinity 8 "x:\path\winrar.exe" x -ibck "y:\path\arc4.rar" "z:\path40"

winrar сообщит об ошибках, если они обнаружатся.
Обратите внимание, что номер процессора указывается в шестнадцатеричном представлении, например, восьмой процессор - 10000000 или (hex) 80
девятый 100000000 = (hex) 100
шестнадцатый (hex) 8000
Таким образом, можно указать не один а несколько ядер, накоторых запущен процесс. Например, для запуска поцесса на 2м и 4м ядрах
1010 = (hex) A
 
* * *
В целом же игры с искусственным распараллеливанием процессов - вещь достаточно бесполезная для обычного юзера, поскольку суммарные временные затраты на подгонку под конкретную копеечную задачку превысят временные выигрыши (которых может и не быть, как например в случае расчета хэшей, поскольку лимитирующей стадий е этом являются операции i/o, а не собственно вычисления хэш; в противоположность случаю, когда стоит задача взлома хэша).
Другое дело, когда перед компом стоят однородные задачи, занимающие большую часть процессорного времени (серверные приложения) и операции i/o не являются узким местом - тогда в некоторых подобные манипуляции имеют смысл.

Всего записей: 1173 | Зарегистр. 17-01-2011 | Отправлено: 19:20 22-02-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
insorg

Цитата:
Есть ли возможность в батнике сделать  одновременное выполнение нескольких фоновых команд

команд - вряд ли, а вот программ...

Код:
start /?

Всего записей: 3199 | Зарегистр. 03-02-2009 | Отправлено: 19:23 22-02-2019
Inoz2000



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
одновременное выполнение нескольких фоновых команд (например, распаковать 4 архива одновременно на 4 ядерном ЦП) с ожиданием

Как запустить одновременное выполнение уже подсказали — командой start.
Количество запускаемых программ не обязательно должно быть равно количеству процессоров.
Фоновые программы в принципе не обязательно должны нагружать сразу все ядра процессора, поэтому можно успешно запускать например, 7 задач на трёх-ядерном компе.
Вопрос, как контролировать успешное выполнение всех запущенных процессов?
Это можно например, сделать в 2 этапа: сначала дождаться завершения всех задач, а потом проверять успех их выполнения.
Кое что у меня получилось нахреначить по этому поводу:
По завершению работы каждой программы создаётся соответствующий временный файл. Как только их количество станет равно четырём, работа батника завершается.

@echo off
SETLOCAL
for /f %%A in ('"prompt $H&for %%B in (1) do rem"') do set "BS=%%A"
SET count=0
SET ekst=ParallelWaiting#
CD/D "%~dp0"
del /q /f *.%ekst%>nul
if not "%1"=="" (call :launcher %*
exit
)
start/min " " %0 #1 ""C:\Путь\Программа_01.exe" Параметр1 "Параметр2" . и т д.."
start/min " " %0 #2 ""C:\Путь\Программа_02.exe" Параметр1 "Параметр2" ..и т д. "
start/min " " %0 #3 ""C:\Путь\Программа_08.exe" Параметр1 "Параметр2" ..и т д  "
start/min " " %0 #4 ""C:\Путь\Программа_33.exe" Параметр1 "Параметр2" ..и т д.."
 
:loop
SET/A count+=1
SET/A tok=1+%count%%%4
for /f "tokens=%tok%" %%s in ("- \ | /") do SET /p=%BS%%%s<nul
pathping -h 1 -p 400 -q 1 -w 1 127.0.0.1 >nul 2>&1
for /f "delims=" %%e in ('dir /b *.%ekst% 2^>nul ^| find /C /V ""') do if not %%e==4 goto :loop
del /q /f *.%ekst%>nul
echo.
pause
goto :exit
 
:launcher
%~2
echo.>%1.%ekst%
goto :exit
 
:exit

Всего записей: 3457 | Зарегистр. 23-04-2009 | Отправлено: 20:38 22-02-2019
insorg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
start хорош работой в фоне, но как отслеживать успешное выполнение всех зад.ач?
Продолжать выполнять сценарий можно только когда всё выполнилось.

Всего записей: 1955 | Зарегистр. 04-11-2010 | Отправлено: 11:06 23-02-2019 | Исправлено: insorg, 11:09 23-02-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
insorg

Цитата:
start хорош работой в фоне, но как отслеживать успешное выполнение всех зад.ач?

Например, созданием файла-метки. Перед стартом удаляются на всякий случай предыдущие файлы, запускаются задачи, затем в цикле ожидание появления файлов. Каждая задача перед завершением должна такой файл создать. Можно варьировать - файл с определённым именем - успешное завершение, с другим - завершение с ошибкой.
Можно отслеживать через реестр использую reg.exe
Каждая такая задача, естественно, командный файл, который уже запустит другие задачи. Можно использовать один командный файл, который для старта задачи просто запустит сам себя с определёнными параметрами.
 
Я бы сделал гибридный cmd+js. Для запуска задачи использовать js часть запуская каждую "задачу" через wscript - это избавит от многочисленных консольных окон.

----------
Разум когда-нибудь победит

Всего записей: 2424 | Зарегистр. 09-02-2003 | Отправлено: 13:27 23-02-2019 | Исправлено: Smitis, 13:34 23-02-2019
Jonmey

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
insorg

Цитата:
start хорош работой в фоне, но как отслеживать успешное выполнение всех зад.ач?

Очень правильный вопрос.
Однозначного ответа на него нет в силу того, что программы по-разному сообщают об ошибках или отсутствии таковых в ходе работы.
Пример с winrar хорош тем, что сама программа сообщит об ошибке в ходе операции, а при отсутствии таковых можно быть уверенным, что все прошло без ошибок.
Но со многими другими программами все иначе. Они могут сообщать об ошибке специальным кодом завершения (успешный - у ряда программ равен 0, но может быть и иным, или с кодом соответствующей ошибки) или вообще без сообщений.
Поэтому не существует универсального метода для данной задачи, который будет работать для любой программы и гарантировать однозначный контроль хода выполнения задачи. Под каждую задачу вам придется подстраиваться, причем могут встретиться и такие, что выполнение будет происходить вслепую, и вы сможете судить об успешности выполнения только по результатам работы, проверяя наличие/отсутствие/корректность выходных файлов, нередко делая это вручную, если нет заведомых эталонов сравнения.
Ни один из предложенных вам методов контроля успешности в общем случае не решает этой проблемы в силу означенных выше причин.
Поэтому единственной вашей возможностью является попытка поиска решения под строго конкретную задачу, когда известна программа, которую требуется запускать в нескольких копиях, операции которые она делает (а, возможно, и образцы входных и выходных файлов). В этом случае есть какой-то шанс, что будет предложено решение строго конкретной задачи. Как уже сказал, универсальное решение для любой программы вы не найдете.

Всего записей: 1173 | Зарегистр. 17-01-2011 | Отправлено: 16:40 23-02-2019
insorg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Упростим.
Успешное выполнение = процесс завершился (с любым результатом).

Всего записей: 1955 | Зарегистр. 04-11-2010 | Отправлено: 23:08 23-02-2019
Inoz2000



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как бы ни старались, всё равно, в ответ пишет каких-то пару строк и всё.

Всего записей: 3457 | Зарегистр. 23-04-2009 | Отправлено: 23:35 23-02-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Inoz2000

Цитата:
Как бы ни старались, всё равно, в ответ пишет каких-то пару строк и всё.

Ну, тогда и ответ надо давать симметричный
 
insorg

Цитата:
Успешное выполнение = процесс завершился (с любым результатом).


Код:
tasklist /fi "imagename eq notepad.exe"|>nul find "notepad"&&echo процесс весь в работе||echo процесс завершился

или:

Код:
set "proc=notepad.exe"
tasklist /fi "imagename eq %proc%"|>nul find "%proc%"&&echo процесс весь в работе||echo процесс завершился


Всего записей: 3199 | Зарегистр. 03-02-2009 | Отправлено: 08:55 24-02-2019 | Исправлено: YuS_2, 09:03 24-02-2019
insorg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Видимо, надо было сразу подробно описать свой случай.
В общем у меня батник, в котором по очереди распаковывается архивы 7z при помощи 7z консольного, затем через echo или распаковкой ещё одного архива докидываются в распакованные папки несколько текстовых файлов, после чего всё пакуется в один архив.
Батник такой не один, их десятка два. С завидной регулярностью они работают по несколько штук одновременно. Так банально проще - накидал заданий и пошёл чай пить или новости листать в браузере.
Возможность отличить где чьи процессы 7z, как я понимаю, отсутствует, если мы используем только его имя?

Всего записей: 1955 | Зарегистр. 04-11-2010 | Отправлено: 13:03 24-02-2019 | Исправлено: insorg, 13:04 24-02-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
insorg

Цитата:
Видимо, надо было сразу подробно описать свой случай.

Это не подробное описание, это часть задачи.
Непонятно, что именно, Вы желаете получить в итоге...
 

Цитата:
Возможность отличить где чьи процессы 7z, как я понимаю, отсутствует, если мы используем только его имя?

У каждого процесса уникальный  PID

Всего записей: 3199 | Зарегистр. 03-02-2009 | Отправлено: 14:35 24-02-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
insorg
Я Вам уже писал - отдельные командные файлы, создающие файл-метку (время + номер задачи) после завершения. Время (на момент запуска батника) нужно что различить их принадлежность к главной задаче, передаются батнику-задаче через параметры. Можно использовать один и тот же батник и различать главный ли он или отдельная задача по параметрам. Если не хотите множества консольных окон, то тогда гибритный cmd+js (вариант cmd+vbs). Гибридная часть js/vbs должна будет уметь выполнять две задачи: генерацию метки, по которой в дальнейшем различать, какие именно подзадачи относятся к данной главной - при ручном запуске это будут разные метки (на всякий случай уточняю). Вторая часть - принять в параметрах метку и номер задачи и запустить 7z в скрытом режиме с ожиданием завершения. После завершения 7z - создание файла и завершение работы. В основном батнике цикл ожидания появления файлов. Вместо файлов можно делать через реестр, опрашивать реестр через req query.


----------
Разум когда-нибудь победит

Всего записей: 2424 | Зарегистр. 09-02-2003 | Отправлено: 15:31 24-02-2019
Jonmey

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
В общем у меня батник, в котором по очереди распаковывается архивы 7z при помощи 7z консольного, затем через echo или распаковкой ещё одного архива докидываются в распакованные папки несколько текстовых файлов, после чего всё пакуется в один архив.

Размеры архивов имеют какой порядок? И сколько в них файлов (ориентировочно)?
Надо полагать, что все архивы хранятся, распаковываются, снова пакуются на одном и том же физическом диске?

Всего записей: 1173 | Зарегистр. 17-01-2011 | Отправлено: 16:48 24-02-2019 | Исправлено: Jonmey, 16:54 24-02-2019
insorg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Размер от нескольких килобайт до полгига, файлов внутри от одного до тысяч.
Диски указываются по выбору пользователя, любые.
 
Пока что расстраиваю вариант заворачивания пар команд в start (), если так можно, в котором первая распаковать архив, вторая - создать эхой текстовик в %temp%,а потом отследить его появление. Так можно будет не плодить мелкие батники на две строки.
Что-то по такому образцу
start "SomeBatch1" cmd /c "ping localhost & ipconfig & pause"
Прокатит?
 
И как можно отследить появление нескольких файлов? Т.е. обязательно наличие ВСЕХ из перечисленных в строке.

Всего записей: 1955 | Зарегистр. 04-11-2010 | Отправлено: 09:57 25-02-2019 | Исправлено: insorg, 10:12 25-02-2019
wisherman

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
, только /value добавлено

 
Спасибо огромное!

Всего записей: 76 | Зарегистр. 09-02-2006 | Отправлено: 14:03 25-02-2019
kot1313



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста,  
как можно модифицировать следующий код в cmd файле:
 

Код:
RD /S /Q MassStorage

 
чтоб он удалял не только всю папку MassStorage, которая находится рядом с ним,
но и любые другие папки (но не файлы), находящиеся в папке с cmd файлом.  
 
ЗЫ Да, папку MassStorage кмдешник в исходном варианте грохает на ура
( конечно, если лежит в одной папке рядом )

Всего записей: 2380 | Зарегистр. 11-12-2002 | Отправлено: 21:50 26-02-2019 | Исправлено: kot1313, 21:54 26-02-2019
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kot1313
Вот именно находящиеся рядом? Может, все-таки все папки из текущей? Последнее - вот так:

Код:
 
for /d %%A in (*) do rd /s /q "%%A"
 


----------
Magically yours
Raistlin

Всего записей: 3082 | Зарегистр. 18-04-2005 | Отправлено: 21:58 26-02-2019
Jonmey

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Размер от нескольких килобайт до полгига, файлов внутри от одного до тысяч.  

Тогда не вижу особого смысла параллелить - тормоза I/O всю выгоду сожрут,  если конечно у вас не полноценное серверное железо. Целесообразнее делать обычным способом (последовательно) используя быстрый архиватор, заточенный под многопроцессорность.
Кстати, как и предполагал, речь идет работе с сетью. И есть подозрение. что оптимальность всего мероприятия (целиком, а не только то что вы упомянули тут) очень низкая, что и приводит к попыткам его ускорения костыльными методами с сомнительной эффективностью (это видно уже по наличию необходимости постоянной упаковки-распаковки полугиговых архивов с тысячами файлов ради добавления пары текстовиков, причем все это при использовании медленного и затратного по ресурсам архиватора (7z)).
Думаю, в лучшем случае, дело кончится тем, что будет сооружена конструкция которая кое-как работает, но до первого глюка с потерей части архивов, после чего вы  откажетесь от нее напрочь.
Фактически сизифов труд для пытающихся вам помочь. А кроме вас, труд помогающего врядли кому-то еще пригодится - задача слишком частная и специфичная.
Хотите быстроты - юзайте отдельный винчестер для задачи (как минимум на sata интерфейсе) и держите все ваши архивы там в распакованном виде, докидывая лишь пару текстовиков в них (как вы сами сказали). А если организуете избыточный  рейд, то даже заботиться о бэкапе не будет особой необходимости - достаточно всегда иметь 1 свободный винчестер. В таком случае это будет работать быстро, надежно и безопасно.

Всего записей: 1173 | Зарегистр. 17-01-2011 | Отправлено: 23:19 26-02-2019
kot1313



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Вот именно находящиеся рядом? Может, все-таки все папки из текущей?

Нет, папки вне материнской папки трогать не надо, а то исчо и папку виндоуз и юзерз убьём    
Нужна зачистка тока в "материнской" папке, там, где файл cmd с кодом лежит и папка MassStorage...
Наверно, правильнее сказать "все папки внутри текущей, где запускается файл cmd"
 
Уточню, есть адрес, по которому находится несколько папок с файлами и\или просто файлы
Одна из этих папок называется MassStorage (тама дрова для перепривязки мам)
Удаление этой папки через Explorer или TC ооочень долгое 10-15 минут (десяток тысяч мелких фалов)
Кмдшка же удаляет эту папку за минуту
Тока приходится прописывать имя папки (в данном случае - MassStorage)
 
А хотелось бы не прописывать имя папок, а просто положить кмдешку в материнскую папку,  
нажать её и чтоб она убила все папки внутри материнской папки, не трогая файлы.
 
Как это написать не понимаю, ну не силён я в скриптописании.

Всего записей: 2380 | Зарегистр. 11-12-2002 | Отправлено: 00:02 27-02-2019 | Исправлено: kot1313, 00:32 27-02-2019
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)
Maz (19-09-2020 13:36): Командная строка, батники, сценарии (bat, cmd) Часть 6


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru