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

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

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

articlebot (21-06-2016 11:40): Следующая часть - Командная строка, батники, сценарии (bat, cmd)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452

   

Widok



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

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Microsoft Windows » Задачи на bat-файлах 12
 
Полезные ссылки
· Из 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. Справочник администратора
 
· Скрываем консольные окна
· cmdow — изменение параметров и видимости дос-окна, Статья в КОМПЬЮТЕРРАONLINE
· Набор GNU утилит для win32
· HS_Packet.zip - Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· blat — отправка почты из консоли
· Команды RunDll32
· Quick Batch File Compiler - Позволяет превратить ваш батник в независимое приложение
· Easy Batch Builder+Rus+Crack - Редактор BAT файлов.Через графический интерфейс программы вы сможете быстро конструировать пакетные файлы практически любой сложности. (В комплекте есть Лоадер созданный с помощью Sign Of Misery некоторые антивирусы обзывают его вирусом. Вам решать: ставить или не ставить) (ЗЕРКАЛО)
 
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек) ещё и ещё
· Переход из 32-битной версии cmd.exe в 64-битную (1) (2)

Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 16:29 03-03-2010 | Исправлено: regist123, 13:32 02-11-2015
GCRaistlin



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

Цитата:
Отключаем переменные !! через disabledelayedexpansion. Результат тот же. Вывод: это просто синтаксическая ошибка, до подстановки переменных дело просто не доходит.

Никакой синтаксической ошибки здесь нет - достаточно подставить ECHO перед IF, чтобы убедиться в этом. А то, что с отключенным delayed expansion результат тот же, - ну так еще бы: без особой трактовки восклицательных знаков "!a:~,1!" и ";" - это немного разные строки.

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

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 00:31 22-04-2016
YuS_two



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

Цитата:
остается загадкой, так это то, почему работает следующая конструкция:

Код:
set a=b  
for %%A in (a) do call echo %%%%A%%

Так ведь это консоль от ms, там загадочных ситуаций (фич?) много
например:

Код:
nul> pause

рабочий код? Вполне рабочий, но вот если (опять же если... это слишком часто приходится повторять для консоли ) этот код поместить последней строкой в сценарии, он отказывается работать - почему? И таких примеров с если, больше чем один...

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 05:38 22-04-2016
Smitis



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

Цитата:
Так ведь это консоль от ms, там загадочных ситуаций (фич?) много

Я вроде уже объяснил, как разбирается этот вызов, не?
 

Цитата:
Никакой синтаксической ошибки здесь нет - достаточно подставить ECHO перед IF, чтобы убедиться в этом. А то, что с отключенным delayed expansion результат тот же, - ну так еще бы: без особой трактовки восклицательных знаков "!a:~,1!" и ";" - это немного разные строки.

Echo здесь совсем не причём. Ещё раз - каждая команда имеет свой синтаксис. Если есть ошибка в синтаксисе, выполнение командного файла прерывается с сообщением об ошибке. Что там не так с синтаксисом я не знаю. Но до подстановок переменных !! явно дело даже не доходит, я не зря поставил setlocal disabledelayedexpansion гарантированно отключающего подстановки. Результат тот же, что и при setlocal enabledelayedexpansion.
А если поставить echo, то это будет уже ПРАВИЛЬНАЯ команда echo, которая выполнится как и ожидалось.
 
 
Добавлено:

Цитата:
Код:
nul> pause  

А как этот код должен работать? Что Вы ожидали получить?


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

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 09:46 22-04-2016
Pasha_ZZZ



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

Цитата:
nul> pause  
наверное
Цитата:
>nul pause

Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 10:04 22-04-2016
YuS_two



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подробнее...
Начинаю читать с конца топика... ну, награфоманили...
Pasha_ZZZ

Цитата:
наверное  

Код:
>nul pause

 

Да, конечно, я опечатался, писал утром, второпях, но в батнике у меня всё правильно было, да и проверить ведь это легко...
 
Smitis

Цитата:
Я вроде уже объяснил, как разбирается этот вызов, не?  

Я обязан читать всё, что Вы напишете? И Ваше заявление, звучит как-то претензионно - Вы работник майкрософт?
Ну, ок, прочитаю, отпишусь... просто тут слишком много текста за ночь появилось и не всё ещё успел прочитать...
 
Добавлено:
Smitis

Цитата:
Ничего загадочного.  
На выполнение идёт  
for %A in (a) do call echo %%A%  
так как переменные уже раскрыты, то при выполнении for подставляется только %A со значением a, остальные знаки процента роли уже не играют, это обычные символы.  
Далее выполняется call echo %a%  
Новая копия процессора заново раскрывает переменные, проверяет синтаксис, выполняет, возвращает управление.  

Ага, вот... ну, вполне согласен с таким разбором, добавить нечего.  
И кроме того, его легко проверить-отладить, например, так:

Код:
C:\DOS\EXAMPLE\TEST_temp>set a=b
 
C:\DOS\EXAMPLE\TEST_temp>for %A in (e) do call echo %%A%
 
C:\DOS\EXAMPLE\TEST_temp>call echo %e%
Режим вывода команд на экран (ECHO) включен.

- это результат выполнения, где всё достаточно наглядно и видно на каком этапе, и что раскрывается-подставляется. Т.е. как таковой, переменной %a% там нигде не раскрыто, если нет символа "a" в скобках, в качестве "набора", который при раскрытии становится %a%. [/more]

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 11:11 22-04-2016 | Исправлено: YuS_two, 12:00 22-04-2016
Smitis



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

Цитата:
Я обязан читать всё, что Вы напишете? И Ваше заявление, звучит как-то претензионно - Вы работник майкрософт?  

Как в анекдоте? Чукча не читатель, чукча писатель?
Я не работник MS, но уже разбирался с этой темой. Делюсь опытом. Собствено, всё на опыте. Но если опыт проверяется, почему бы и нет. Можно, конечно, попытаться выудить в нете исходники Win2000 (или что там утекало) и посмотреть в оригинале, но желания как-то нет и времени.

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

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 12:37 22-04-2016
YuS_two



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

Цитата:
Возможно, здесь какие-то нюансы с пробелами, ведь if наверняка имеет свой "разборщик" параметров. Подставляется скорее всего правильно.

Да, особенности синтаксиса консоли не подлежат какой-либо стабильной логике (где-то можно почитать подробно об этих особенностях?), всегда и всюду встречаются какие-то "нюансики". Хотя, в данном случае, необходимо строго следовать встроенной помощи, а там четко написано:

Цитата:
строка1==строка2  Условие является истинным, если указанные строки совпадают.

- никаких пробелов нет.

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 13:04 22-04-2016
Smitis



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

Цитата:
Я обязан читать всё, что Вы напишете? И Ваше заявление, звучит как-то претензионно - Вы работник майкрософт?  

Т.е., если я не работник MS, значит меня не нужно читать? Ну не читайте
 

Цитата:
да и проверить ведь это легко...  

Извините, не телепат я. Я действительно подумал что вы запускаете nul с переадресацией вывода в файл pause. Нашли какой-то интересный баг и делитесь им.
 
Для переменных надо бы описать процесс в виде алгоритма, типа
 
Алгоритм выполнения командного файла (отличается от алгоритма непосредственного выполнения из командной строки):
1. Очищаем буфер выполнения.
2. Очищаем буфер текущей строки.
3. Считываем очередную строку.
4. Раскрываем переменные.
5. Добавляем строку к буферу текущей строки.
6. Если строка не закончена (в конце экранирующий символ ^), переходим к пункту 3.
7. Добавляем строку к буферу выполнения.
8. Делаем синтаксический разбор
9. Если есть незакрытые скобки "(", переходим к пункту 2.
10. К этому моменту имеем в буфере выполнения подготовленный текст разбитый на команды. Выполняем их. Для каждой команды сначала раскрываем переменные вида %A (устанавливаются командой for), затем раскрываем переменные !! (если это указано), затем выполняем команду.
 
Как-то так.

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

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 13:07 22-04-2016
YuS_two



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

Цитата:
Как в анекдоте? Чукча не читатель, чукча писатель?

нет, чукча периодически хочет кушать, а посему:

Цитата:
как-то нет и времени.

иногда, читать всё и всюду.  
Чтением на жизнь, увы, зарабатывают только критики (не мой случай).

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 13:08 22-04-2016
Smitis



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

Цитата:
где-то можно почитать подробно об этих особенностях

 
С миру по нитке.
Здесь хороший форум http://www.cyberforum.ru/cmd-bat/
Ещё http://forum.script-coding.com/
Ну и иностранные есть, в том числе иследователи всяких нюансов, тонкостей, багов и пр., например http://www.dostips.com/

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

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 13:17 22-04-2016 | Исправлено: Smitis, 13:22 22-04-2016
YuS_two



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

Цитата:
С миру по нитке.  

А, ну киберфорум-то у меня в закладках и есть там учётка.
Я имел ввиду не форумы, а первоисточники, т.е. документы от разработчиков какие-либо или руководства, хотя бы, от авторитетных спецов - такие существуют?
Или всё познается эмпирическим путем и накапливается разрозненная инфа на просторах интернета?

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 13:24 22-04-2016
Smitis



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

Цитата:
Или всё познается эмпирическим путем и накапливается разрозненная инфа на просторах интернета?

По-моему, именно так и происходит.

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

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 15:59 22-04-2016
GCRaistlin



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

Цитата:
Где бы побольше почитать про это? До сих пор попадались какие-то скудные описания...

Судя по всему, все работает так:
Подробнее...
Тесты, на основании которых сделаны выводы:
Подробнее...

Цитата:
Ещё где-то в памяти сидит, что при удвоении (или последовательном применении...не помню), при !-раскрытии время ещё резко увеличивается, в отличие от %-раскрытия

Вероятно, вы имеете в виду, что второе перечитывание при delayed expansion (и, как следствие, увеличение времени обработки строки) происходит только при наличии "!" в строке. Мои эксперименты этого не подтверждают.

Цитата:
Сорри, конечно, за такое сравнение, но думаю, что присутствует слишком много если

Вообще-то настоящее "если" там всего одно, касающееся юникода.
 
Smitis

Цитата:
Echo здесь совсем не причём. Ещё раз - каждая команда имеет свой синтаксис. Если есть ошибка в синтаксисе, выполнение командного файла прерывается с сообщением об ошибке.

Выполнение указанных команд прерывается? Нет? Так откуда вывод, что здесь синтаксическая ошибка?

Цитата:
Но до подстановок переменных !! явно дело даже не доходит, я не зря поставил setlocal disabledelayedexpansion гарантированно отключающего подстановки. Результат тот же, что и при setlocal enabledelayedexpansion.

Из этого никак не следует, что до !-раскрытия дело не доходит.
Впрочем, все это имеет лишь академический интерес - практическим выводом отсюда является то, что при использовании !-переменных в IF обязательно использование кавычек.

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

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 16:36 22-04-2016 | Исправлено: GCRaistlin, 16:37 22-04-2016
ANDE2003



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, нужен bat, который был лез на Linux по SSH, скачивал файлик.

Всего записей: 461 | Зарегистр. 21-04-2003 | Отправлено: 18:24 22-04-2016
Pasha_ZZZ



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

Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 18:40 22-04-2016
YuS_two



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

Цитата:
Вероятно, вы имеете в виду, что второе перечитывание при delayed expansion (и, как следствие, увеличение времени обработки строки) происходит только при наличии "!" в строке. Мои эксперименты этого не подтверждают.

Вот, нашел, т.е. имел ввиду последовательное применение !!==!! и %%==%% - там и методика есть.

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 18:52 22-04-2016
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_two
Да, ошибся при тестировании - действительно, разница есть. Правда, не 35%, а 16 (одно %-раскрытие против одного !-раскрытия).

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

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 20:24 22-04-2016
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
GCRaistlin
Пока не вникал досконально в Вашу версию алгоритма, но первое что бросилось в глаза

Цитата:
Считывается код с раскрытием %-переменных до тех пор, пока не встретится символ CR/LF вне "()",

А если последняя строка не имеет CR/LF? (мелкая придирка )
 

Цитата:
Выполнение указанных команд прерывается? Нет? Так откуда вывод, что здесь синтаксическая ошибка?  

Эээ... Может у нас настолько разные системы? У меня Win7 x64. Могу проверить на XP x86.
Выполнение команд прерывается в любом случае с одинаковым сообщением

Код:
Непредвиденное появление: 1!.

Так, как если бы запятая воспринималась как пробел.

Код:
if aa,bb == aa,bb echo 1


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

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 01:33 23-04-2016
YuS_two



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

Цитата:
Правда, не 35%, а 16 (одно %-раскрытие против одного !-раскрытия).

Ну, возможно, есть таки зависимость от конфигурации стенда...
У меня эта цифра вообще в 47% выходит:
http://rghost.ru/8bRQcX7YS/thumb.png
 
Добавлено:
А это уже if "%Variable%"=="%Variable%" vs if "!Variable!"=="!Variable!"
http://rghost.ru/7YyQllCGw/thumb.png
- на 64% быстрее %-раскрытие, причем два последовательных раскрытия %%, примерно равны одинарному по времени, в отличие от !!.  
 
Думаю отличия между !! и %% достаточно наглядны, хоть и отличаются пропорции из-за конфигурации компьютера.

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 06:04 23-04-2016 | Исправлено: YuS_two, 08:19 23-04-2016
GCRaistlin



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

Цитата:
Эээ... Может у нас настолько разные системы?

Не, это я умудрился тестировать enabled expansion, не включив его. Вопрос снят.

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

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 11:49 23-04-2016
   

Страницы: 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 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)
articlebot (21-06-2016 11:40): Следующая часть - Командная строка, батники, сценарии (bat, cmd)


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru