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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Voletho15



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

Цитата:
сформулируйте задачу в более доходчивом виде...

попробую:
нужно чтобы в схеме

Код:
 
 
setlocal EnableDelayedExpansion
set dir1=<любой путь>
 
for /r "%dir1%" %%R in (*.*) do (
echo File: %%~nxR
<...>
)
 
 

любой файл, в имени которого есть восклицательные знаки "!"
обрабатывался правильно
ну хотябы командой echo
 
если чтото непонятно напишите уточните

Всего записей: 122 | Зарегистр. 22-05-2017 | Отправлено: 23:21 12-04-2018
BorlandIMHO

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

Цитата:
в аимп-е запускются все кроме файлов с "!"

Программа тупо запускает всё, что ей пришло на вход.
Ваш код тупо "съедает" восклицательные знаки вследствие использования setlocal...

----------
http://www.imho.ws

Всего записей: 1240 | Зарегистр. 12-10-2006 | Отправлено: 23:22 12-04-2018
Voletho15



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

Цитата:
Ваш код тупо "съедает" восклицательные знаки

ВОТ! собственно это и есть причина моего 1 поста

Всего записей: 122 | Зарегистр. 22-05-2017 | Отправлено: 23:31 12-04-2018
BorlandIMHO

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

Цитата:
нужно чтобы в схеме. .. любой файл, в имени которого есть восклицательные знаки "!"
обрабатывался правильно  
Исключайте из "схемы" "EnableDelayedExpansion", и будет Вам щасстте
Как уже говорилось, "EnableDelayedExpansion" - штука полезная, но неприемлема в случае присутствия в обрабатываемых объектах восклицательных знаков, которые она просто "съедает"...


----------
http://www.imho.ws

Всего записей: 1240 | Зарегистр. 12-10-2006 | Отправлено: 23:37 12-04-2018 | Исправлено: BorlandIMHO, 23:39 12-04-2018
Voletho15



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

Цитата:
Как уже говорилось, "EnableDelayedExpansion" - штука полезная, но неприемлема в случае присутствия в обрабатываемых объектах восклицательных знаков, которые она просто "съедает"...  

вот это основное что я и хотел узнать. Про НЕ-использование "EnableDelayedExpansion" я уловчился догадаться, а вот ВМЕСТЕ с "!" не сумел,
поэтому и стал спрашивать в месте обитания тех кто МНОООГО знает об программировании и cmd.
 
Я пытался как то испрльзовать символы типа
^
^^
%%%
думал может чего то не догоняю
 

Цитата:
"Одна строка - разделители пробелы", то это уже совсем отдельная задача

есть идеи?
 
Также, мне допустим нужно имя 1 файла (не список) выводимое командой for но нужна нумерация (set /a num+=1), здесь опять же не будет работать.
 
Ладно, ну его этот список, хотя бы просто

Цитата:
нумерация + корректная работа "!"

если есть идеи подскажите плиз

Всего записей: 122 | Зарегистр. 22-05-2017 | Отправлено: 23:52 12-04-2018
BorlandIMHO

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Voletho15
Конкретно: какой формат списка нужен?
Будем думать. Здесь, в конце концов, есть достаточно много спецов по powershell/vbs/js...
Универсального решения не существует, насколько мне известно. Во всяком случае - в рамках "чистого" cmd, без использования сторонних средств.

----------
http://www.imho.ws

Всего записей: 1240 | Зарегистр. 12-10-2006 | Отправлено: 00:01 13-04-2018 | Исправлено: BorlandIMHO, 00:09 13-04-2018
Voletho15



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я напишу вот так, вдруг кто чего знает:
Актуальный вопрос, если кто знает...
BorlandIMHO не в обиду Вашей компетенции
 
BorlandIMHO

Цитата:
Конкретно: какой формат списка нужен.  

Пример:
"document1.txt" "document2.txt" "document3.txt"
 
 
Вообще догадываюсь, что чтото более мощное типа PowerShell или Windows Script Host могут такое сделать в любых вариантах. Но я не программист, мне что-нибудь попроще, поэтому я и пишу практически только на cmd.
И задачи у меня по сути простейшие.
 
 
 
 

Всего записей: 122 | Зарегистр. 22-05-2017 | Отправлено: 00:28 13-04-2018
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Voletho15
Если delayed expansion включено, то все переменные должны раскрываться через !. Поэтому включать и выключать его нужно на каждой итерации цикла:

Код:
 
for %%A in (1 2 3) do (
  set Var=%%A
  setlocal enabledelayedexpansion
  echo !Var!
  endlocal
)
 


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

Всего записей: 3075 | Зарегистр. 18-04-2005 | Отправлено: 00:30 13-04-2018
Voletho15



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Актуальный вопрос, если кто знает...
 
 
GCRaistlin
это что-то меняет
 
пока получилось сделать только нумерацию при обработке по 1 файлу

Код:
 
for %%R in (a b c) do (
 
set Var1=%%R
set /a num+=1
 
setlocal EnableDelayedExpansion
echo number[!num!]=!Var1!
endlocal
)
 

 
 
но сделать список с сохранением "!" пока не получается

Код:
for %%R in (1 2 3) do (
 
set Var1=%%R
 
setlocal EnableDelayedExpansion
set list=!list! "!Var1!"
endlocal
 
)
 
echo list=%list%
 


Всего записей: 122 | Зарегистр. 22-05-2017 | Отправлено: 01:35 13-04-2018 | Исправлено: Voletho15, 02:30 13-04-2018
irsemi

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

Код:
 
@echo off
 
set aimp=c:\program files\aimp3\aimp3.exe
set dir1=d:\dir1
set num=0
set list=
 
for /r "%dir1%" %%R in (
"*.mp3"
) do CALL rocess "%%R"
 
echo.
echo list=%list%
 
rem start "" "%aimp%" /add_play %list%
 
echo.
pause
exit /b
::exit строкой выше не удалять!
 
::Подпрограмма
rocess
set /a num+=1
set list=%list% %1
echo file[%num%]=%~nx1
EXIT /b 0
 

Всего записей: 89 | Зарегистр. 28-11-2016 | Отправлено: 06:59 13-04-2018
Voletho15



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
irsemi
блин он РАБОТАЕТ!!!

Цитата:
А такой вариант не подходит?  

для начала ТОЧНО ПОДХОДИТ!
СПАСИБО ТЕБЕ ОТ МЕНЯ, СПЕЕЕЕЕЦЦЦ! РЕСПЕЕЕКТ!
Долго эта проблемка у меня висит (висела).
И смайлы в коде появились)
 
Несколько вопросов для закрепления:
1)

Код:
EXIT /b 0
 

0 это видимо секунды перед продолжением, я на XP всё делаю, на XP этого кажется нету, гд, как это работает?
 
2)
Потнциально "опасного" в коде (для какого-нибудь другого приплюснутого кода, ну, когда я допишу свой код) пока ничего не вижу. Есть у него потенциально несовместимые особенности, тонкости? То что в 1 раз не увидишь а потом... (в этом cmd уже постоянно жду каких-нибудь причуд).
 
3)

Код:
::

не помешает чему-нибудь? Кроме rem про комментарии больше нигде в справках не видел.
 
4)
итого все процссы всего cmd файла завершаются кодом

Код:
exit /b
::exit строкой выше не удалять!  

верно?
Подпрограмма rocess каждый раз при завершении возвращается к for к её следующему выводу верно? И так можно много подпрограмм писАть (такой код я ещё не писАл)?
 
5)
call rocess
видимо можно заменить на
goto process
верно?
 
 
Мне хотелось бы быть уверенным что весь мой код по синтаксису верен, а не просто "повезло", что он не подведёт меня если я напишу что-то большое и сложное.

Всего записей: 122 | Зарегистр. 22-05-2017 | Отправлено: 07:56 13-04-2018
GCRaistlin



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

Цитата:
сделать список с сохранением "!" пока не получается

Потому что endlocal уничтожает переменные, определенные после setlocal.

Код:
 
for %%A in (1 2 3) do (
  set Var=%%A
  setlocal enabledelayedexpansion
  for /f "tokens=1* eol=" %%B in ("foobar !List!") do (
    echo !Var!
    endlocal
    set List=%%C %%A
  )
)
 


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

Всего записей: 3075 | Зарегистр. 18-04-2005 | Отправлено: 11:59 13-04-2018
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
есть куча более веселых символов, которые любят быть в именах мп3... например, кавычки-елочки или длинное тире...

Всего записей: 10071 | Зарегистр. 11-03-2002 | Отправлено: 12:13 13-04-2018
GCRaistlin



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

Код:
>nul chcp 65001

и не знаем горя.

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

Всего записей: 3075 | Зарегистр. 18-04-2005 | Отправлено: 13:03 13-04-2018
irsemi

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

Цитата:
СПАСИБО ТЕБЕ ОТ МЕНЯ, СПЕЕЕЕЕЦЦЦ!

Да я сам только полгода назад написал первый "большой" батник.
Тогда мне нужно было скачать, обработать и переименовать 200 000 файлов по списку.
 
1. Это код выхода. Смотрите справку, с которой я начинал.
 
2. Ну там кавычки, & и прочее может вести себя непредсказуемо.
 
3. Просто привычка. Наверное лучше использовать rem, тем более что в скобках :: НЕ работает
 
4. Да. Можно несколько, даже можно вызывать одну из другой, например из первой можно вызвать подпрограмму переименования.
 
5. Ни в коем случае. CALL вызывает подпрограмму "на месте", а GOTO если не ошибаюсь, выведет управление из цикла без возврата.

Всего записей: 89 | Зарегистр. 28-11-2016 | Отправлено: 14:46 13-04-2018 | Исправлено: irsemi, 14:47 13-04-2018
Voletho15



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В общем, спасибо всем за ответы! Особенно irsemi !
 
 
PS:
irsemi

Цитата:
скачать, обработать и переименовать 200 000 файлов по списку

что за файлы если не секрет?
кстати, есть под рукой утилита скачивать файлы из сети (через cmd)?

Всего записей: 122 | Зарегистр. 22-05-2017 | Отправлено: 20:07 13-04-2018
thejustsoul



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

Цитата:
кстати, есть под рукой утилита скачивать файлы из сети (через cmd)?

Не так давно хацкеры нашли необычный способ качать файлы средствами винды из "коробки", можете попробовать:

Код:
certutil.exe -urlcache -split -f <URL> <DESTINATION>

типа так:

Код:
certutil.exe -urlcache -split -f http://example.tld/file.zip file.zip

Всего записей: 1782 | Зарегистр. 30-03-2014 | Отправлено: 21:00 13-04-2018 | Исправлено: thejustsoul, 21:01 13-04-2018
Voletho15



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
у меня XP
пуск - выполнить - certutil.exe >>> "файл не найден"

Всего записей: 122 | Зарегистр. 22-05-2017 | Отправлено: 21:05 13-04-2018
irsemi

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Voletho15
Кое-какие метеорологические данные, за 5 лет (2013-2017), с интервалом 10 минут.
Нужно было скачивать (wget), переименовавать (cmd), упаковывать в архивы по месяцам (rar).  
 

Цитата:
кстати, есть под рукой утилита скачивать файлы из сети (через cmd)?

Я использовал wget
Можно использовать CURL
 
 

Всего записей: 89 | Зарегистр. 28-11-2016 | Отправлено: 22:22 13-04-2018
thejustsoul



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Voletho15
Значит в XP нет этой утилиты.. видимо в висте и выше только.
Вот есть еще такой пример кривого кода (вариантов кучу можно найти в сети):

Код:
@echo off
setlocal enableextensions
 
call :wget %*
goto :eof
 
:wget
set Url=%1
set SaveTo=%2
(
echo Dim oXMLHTTP
echo Dim oStream
echo Set oXMLHTTP = CreateObject^("MSXML2.XMLHTTP.3.0"^)
echo oXMLHTTP.Open "GET", %Url%, False
echo oXMLHTTP.Send
echo If oXMLHTTP.Status = 200 Then
echo Set oStream = CreateObject^("ADODB.Stream"^)
echo oStream.Open
echo oStream.Type = 1
echo oStream.Write oXMLHTTP.responseBody
echo oStream.SaveToFile %SaveTo%
echo oStream.Close
echo End If
)>>"%~n0-temp.vbs"
cscript //nologo "%~n0-temp.vbs" & del "%~n0-temp.vbs"
goto :eof

 
Запускать так:

Код:
script.bat "url" "file"

 
А так, лучше конечно нормальный софт юзать - wget, curl, axel (под винду уже устарел, но еще качает) и aria2c (если нужна многопоточность).

Всего записей: 1782 | Зарегистр. 30-03-2014 | Отправлено: 22:24 13-04-2018 | Исправлено: thejustsoul, 22:26 13-04-2018
   

Страницы: 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