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

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

Модерирует : KLASS, IFkO

KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

hErAx

Редактировать | Цитировать | Сообщить модератору
Задачи на bat-файлах 12
Предыдущие части: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
 
Для перекодирования кирилицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы

 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки
 
Полезные утилиты
 
Готовые решения и частые вопросы:
  • При запуске batch-файла от Администратора текущая директория меняется на system32
  • Встроенный справочник по командам
  • Создание помощи по всем командам консоли 2000 и XP
  • Делаем паузу в командном файле стандартными средствами Windows
  • Альтернативные решения »
  • Работа с текстом, датой, и файлами »
  • Администрирование, автоматизация и сеть »
  • Работа с переменными и параметрами ком. строки »
     
    Описания работы команд и символов участниками темы:
    · setlocal enabledelayedexpansion и переменные окружения
    · символы & и && в командной строке
    · Переменная %0

  • Отправлено: 01:53 25-10-2015 | Исправлено: Paromshick, 21:51 18-12-2017
    GCRaistlin



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

    Цитата:
    удаление значений из переменной это лишние затраты и не столь оптимизировано

    В погоне за оптимизацией главное - не побежать в обратную сторону. Хинт: findstr - это внешний экзешник. Со всеми вытекающими тормозами и, главное, с шансом его отсутствия.
     
    yurkesha

    Цитата:
    Во-вторых отложенное выполнение чуть дольше отрабатывает на больших объемах.

    А зачем его включать на больших объемах? Включаем только при обработке "подозрительных" значений.

    Цитата:
    при стыковке разнородного кода могут быть напряги

    Если все сделано грамотно, напрягов не будет. А если неграмотно, то и без delayed expansion может вылетать.

    Цитата:
    практический пример работы со спецсимволами вот

    О, да. Образец лаконичности и производительности.
     
    Добавлено:
    yurkesha

    Цитата:
    проблема с заменой... решается замыканием слева

    Ну тогда уж

    Код:
     
    set listvars=!listvars:;%%I;=;!
     

    И поменять условие перехода на loop, ибо listvars пустым не будет.

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

    Всего записей: 3960 | Зарегистр. 18-04-2005 | Отправлено: 15:28 16-12-2016
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GCRaistlin
    Цитата:
    Хинт: findstr - это внешний экзешник. Со всеми вытекающими тормозами и, главное, с шансом его отсутствия.
    Вот тут РЕШИТЕЛЬНО не соглашусь:
    - начиная с W2K во всех системах есть
    - это ЕДИНСТВЕННЫЙ штатный системный способ БЫСТРО обработать огромные объемы данных(ну скажем от 10к строк и больше).

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

    Цитата:
    Ну тогда уж
    Код: set listvars=!listvars:;%%I;=;!  
    асолютно верно. Я допустил ошибку.


    ----------
    Всем непричастным рекомендую прогулки на свежем воздухе

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 15:35 16-12-2016
    GCRaistlin



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

    Цитата:
    начиная с W2K во всех системах есть

    Так никто ж не мешает его потереть .

    Цитата:
    это ЕДИНСТВЕННЫЙ штатный системный способ БЫСТРО обработать огромные объемы данных

    Не спорю. Но в данном случае у нас не такие объемы.

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

    Ну так, получается, и в реальном коде будет такой же монстр, если мы хотим отказоустойчивости. И зачем, если все делается гораздо проще с delayed expansion?

    Цитата:
    Так что твой сарказм неуместен.

    А сарказм был вызван исключительно упоминанием о том, что

    Цитата:
    отложенное выполнение чуть дольше отрабатывает на больших объемах


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

    Всего записей: 3960 | Зарегистр. 18-04-2005 | Отправлено: 15:53 16-12-2016
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GCRaistlin
    Цитата:
    Ну так, получается, и в реальном коде будет такой же монстр, если мы хотим отказоустойчивости.
    нет - так как в примере показано несколько разных методов, при этом произведено дублирование вывода с учетом вариантов вывода на экран и в файл. Реальный код будет в десятки раз лаконичней.
     
     
    Добавлено:

    Цитата:
    Так никто ж не мешает его потереть .  

    ну мало что можно потереть - могу предложить варианты такие что потом вообще система работать не будет.

    ----------
    Всем непричастным рекомендую прогулки на свежем воздухе

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 16:00 16-12-2016 | Исправлено: yurkesha, 16:01 16-12-2016
    GCRaistlin



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

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

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

    Код:
     
    set a="&"
    set "b=&"
     


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

    Всего записей: 3960 | Зарегистр. 18-04-2005 | Отправлено: 16:42 16-12-2016
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GCRaistlin
    не проще - отложенное выполнение на самом деле полностью проблему не решает. Так что останемся при своих

    ----------
    Всем непричастным рекомендую прогулки на свежем воздухе

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 19:54 16-12-2016
    latin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yurkesha
    Почему не решает? Ведь спецсимволы не будут обрабатываться.

    Всего записей: 781 | Зарегистр. 01-03-2006 | Отправлено: 20:01 16-12-2016
    GCRaistlin



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

    Цитата:
    Почему не решает?

    Вот именно - почему это не решает? Пример?

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

    Всего записей: 3960 | Зарегистр. 18-04-2005 | Отправлено: 20:12 16-12-2016
    Furee



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Люди добрые,
    Подскажите пожалуйста, как правильно провериться по команде применения прав хост файлу?  

    Код:
    attrib +r +s +h "%WINDIR%\SYSTEM32\drivers\etc\hosts" > NUL  
    IF %ERRORLEVEL% GTR 0 goto next

    Дело в том, что при любых раскладах, т.е. не важно какой бы результат, выдает код ошибки 0.
    Или, если я не правильно задаю условия проверки, то поправьте меня пожалуйста.

    Всего записей: 766 | Зарегистр. 13-10-2014 | Отправлено: 21:03 16-12-2016
    latin



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

    Код:
    set listvars=a;b;c;d;e;  
       
     :loop  
       
     setlocal enableextensions enabledelayedexpansion  
     for /f "tokens=1* delims=;" %%I in ("!listvars!") do (  
       endlocal  
       echo %%I  
       set listvars=%%J  
       if defined listvars goto :loop  
     )  
    Что-то не работает. Уходит в бесконечный цикл.

    Всего записей: 781 | Зарегистр. 01-03-2006 | Отправлено: 21:10 16-12-2016
    Pasha_ZZZ



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Furee
    При успешном выполнении вывода нет, при неуспешном - есть. Можно использовать с FOR /F

    Всего записей: 12360 | Зарегистр. 11-03-2002 | Отправлено: 21:16 16-12-2016
    GCRaistlin



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    latin
    Концевые пробелы уберите в строке с set.

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

    Всего записей: 3960 | Зарегистр. 18-04-2005 | Отправлено: 21:23 16-12-2016
    Furee



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

    Цитата:
    При успешном выполнении вывода нет, при неуспешном - есть. Можно использовать с FOR /F

    Спасибо за ответ.
    Да вот как раз вот на этом я и застрял, что при не успешном выполнении на win 8.1 x64, у меня все равно IF 0 GTR 0.
    Попробую тогда с FOR /F.

    Всего записей: 766 | Зарегистр. 13-10-2014 | Отправлено: 21:29 16-12-2016
    latin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GCRaistlin
    Блин, ну и тупень же! Даже в "шапке" это написано.
    Спасибо!
     
    Добавлено:
    GCRaistlin
    Так всё же по отложенному исполнению и обработке спецсимволов к чему пришли?

    Всего записей: 781 | Зарегистр. 01-03-2006 | Отправлено: 21:36 16-12-2016
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GCRaistlin
    Цитата:
    Вот именно - почему это не решает? Пример?
    готов привести пример если ты дашь гарантию выполнить код примера на своем рабочем компе от имени админа: в скрипте будет отложенное выполнение, присвоения и вывод на экран
    Согласен на таких условия проводить эксперимент? По другому - мне не интересно.
    И кстати  - я понял прочему ты на спецсимволы взъелся - ты спутал проблему подстановочных знакок в цикле FOR с проблемой спецсимволов - так вот ничего общего эти проблемы не имеют.
     
    latin
    Цитата:
    Так всё же по отложенному исполнению и обработке спецсимволов к чему пришли?
    к тому что работает и так и так - пиши код как больше нравится.
     


    ----------
    Всем непричастным рекомендую прогулки на свежем воздухе

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 22:01 16-12-2016
    latin



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

    Цитата:
    к тому что работает и так и так - пиши код как больше нравится.

    Мне больше нравится так как правильно и оптимально. То что работает и так, и так это уже понятно. Но ведь не даром у вас такая дискуссия возникла.  
     
    Добавлено:

    Цитата:
    И кстати  - я понял прочему ты на спецсимволы взъелся - ты спутал проблему подстановочных знакок в цикле FOR с проблемой спецсимволов - так вот ничего общего эти проблемы не имеют.  

    А какие имеют? Если не сложно, то разъясните.

    Всего записей: 781 | Зарегистр. 01-03-2006 | Отправлено: 22:08 16-12-2016
    BorlandIMHO

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Furee
    Pasha_ZZZ
    Можно и без for. Вполне достаточно find:

    Код:
    1>nul (attrib +r +s +h "%WINDIR%\SYSTEM32\drivers\etc\hosts"|find /i "hosts") && echo attrib отработал неудачно || echo attrib отработал удачно

    Вместо echo, естественно, можно ставить goto куда надо...

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

    Всего записей: 2376 | Зарегистр. 12-10-2006 | Отправлено: 23:57 16-12-2016 | Исправлено: BorlandIMHO, 00:04 17-12-2016
    Pasha_ZZZ



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    BorlandIMHO
    1. FIND внешняя команда, FOR внутренняя.
    2. Лучше искать - так по имени файла с путем, а то если язык пользователя не расеянский...

    Всего записей: 12360 | Зарегистр. 11-03-2002 | Отправлено: 00:05 17-12-2016
    BorlandIMHO

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

    Цитата:
    если язык пользователя не расеянский

    Сам об этом подумал, да. В find лучше искать имя файла, поправил. Путь, в общем-то, необязательно.
    А то, что find внешний по отношению к cmd - не столь уж и важно. Это штатная утилита винды, и если её где-то кто-то удалил - то не факт, что оставил на месте cmd.
    Не та вероятность, на которую стОит закладываться.

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

    Всего записей: 2376 | Зарегистр. 12-10-2006 | Отправлено: 00:11 17-12-2016
    Pasha_ZZZ



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

    Всего записей: 12360 | Зарегистр. 11-03-2002 | Отправлено: 00:33 17-12-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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 12
    KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru