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

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

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

vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 12:40 25-01-2010 | Исправлено: bomzzz, 13:37 20-08-2010
    jek1976



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

    Цитата:
    О! Есть такая фигня в винде, как портфель... Честно- сам не юзал... Но вроде бы он отвечает за синхронизацию...  

    Он нам ничем не поможет, т.к. к профилям отношения не имеет. Что будем "портфелить"?

    Всего записей: 1057 | Зарегистр. 15-04-2005 | Отправлено: 17:13 01-07-2010
    us0r



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Портфель- синхронизатор файла...
    Закинь в планировщик заданий и ОК!

    Всего записей: 406 | Зарегистр. 06-12-2007 | Отправлено: 17:26 01-07-2010
    jek1976



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    us0r
    Нет, ты меня, видимо, не понял до конца.
     
    Зачем нам что-то синхронизировать? Нам нужно только проверить, была ли до нас сделана синхронизация профиля или не была сделана!

    Всего записей: 1057 | Зарегистр. 15-04-2005 | Отправлено: 17:29 01-07-2010
    us0r



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Обычно логика работы синхронизатора такова, что если что- то синхронизировано, то синхронизатор и не дёргается. Если нет- тогда синхронизировать (соответственно)...

    Всего записей: 406 | Зарегистр. 06-12-2007 | Отправлено: 17:34 01-07-2010
    VV2006

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

    Цитата:
    Что такое drop.exe?
    Drop My Rights (c) M$
    Вариант drop.exe opera.exe -U у меня всегда работал - с него и начинал. Но, увы, при запуска из самораспака не канает: Error initializing Opera: module 10

    Всего записей: 2123 | Зарегистр. 10-02-2006 | Отправлено: 18:01 01-07-2010
    Engraf



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вроде бы я уже неплохо знаю cmd.exe. Но вот этот пример отсюда ну никак не разберу. Проведите ликбез если не жалко

    Код:
    Displaying the first X lines
    This example prints one, two and three.
     
    @echo off & setlocal ENABLEEXTENSIONS
    set "lines=3"
    set i=-1
    set "ok="
    for /f "delims=" %%a in ('more ^< numbers.txt') do (
      set/a i+=1 & for /f %%z in ('echo/%%i%%') do (
        if "%%z"=="%lines%" set ok=1
      )
      if not defined ok echo/%%a
    )

    Жирным выделены особенно непонятные конструкции...

    Всего записей: 67 | Зарегистр. 07-08-2007 | Отправлено: 18:45 01-07-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Engraf а какие непонятки с set ? чтение set /? не помогло?
    установить одну переменную в значение три и разопределить другую переменную если она случайно была определена ранее.
    кавычки - чтоб  со случайно затесывающимися в конец строк  пробелами путаницы не было.
     
    more ^< numbers.txt
    в чем тут непонятнка? это more < numbers.txt с заэкранированной для for скобкой.
    чем  лучше чем type numbers.txt в данном варианте - не знаю, но может тот numbers.txt - уникодный...
    выход этой печати файла перехватывается циклом for /f "delims=" %%a
     
    set /a i += 1  
    увеличить значение переменной i на единичку, читаем set /?
     
    'echo/%%i%%'
    это опять специфика исполняемой команды в for и порядка парсинга строк.
    удвоение % нужно чтоб переменная %i% НЕ была заменена на значение в момент парсинга команды for /f "delims=" %%a in. с такими удвоенными процентами - в тот момент команда вложенного цикла станет ('echo/%i%') и %i% заменится на значение счетчика только в тот момент когда вызовется выполнение цикла.
    причем символ / - в такой позиции строки не печатается, но его наличие в той позиции не-пробела приводит к печати пустрой строки в случае пустого значения %i%, тут такого не бывает - просто у автора правильная привычка, я тоже стараюсь писать echo.%var% даже если та var определяется строкой выше (не говоря о более неопределенных случаях)
     
    Добавлено:
    в целом батник делает:
    на каждую непустую строку numbers.txt цикл производит:
        инкремент %i%  
        после чего извращенным вложенным циклом делается сравнение,  
            при достижении %i% значения 3 (т.е. на 4й строке numbers.txt) устанавливается переменная ок.  
        последняя строка - печатает тукущую строку numbers.txt если ок не определена,  
    т.е. от всего numbers.txt цикл печатает три первых строки, что и обещали.
     
    в общем и целом - пример как можно извратиться но не нужно делать

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set lines=3
    set i=0
    for /f "delims=" %%a in ('more ^< numbers.txt ') do (
        set /a i += 1  
        if !i! leq %lines% echo.%%a
    )
    читается гораздо легче, правда?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 19:13 01-07-2010 | Исправлено: wolf0425, 20:06 01-07-2010
    jek1976



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

    Цитата:
    Обычно логика работы синхронизатора такова, что если что- то синхронизировано, то синхронизатор и не дёргается. Если нет- тогда синхронизировать (соответственно)...

    Во-во! А как синхронизатор это определяет???

    Всего записей: 1057 | Зарегистр. 15-04-2005 | Отправлено: 20:25 01-07-2010
    us0r



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Метки времени, размер файла, хэш файла (в запущеном случае)...
    Можно поискать консольную утилиту расчёта тогоже CRC файла и при несовпадении- обновлять... что логично...
    drop.exe- дефолтная прога в XP?
    VV2006
    Скорее всего виноват сам drop.exe.
    Хотя ковырни opera_prefs.ini в папке с оперой и поставь MultiUser=0- может помочь...

    Всего записей: 406 | Зарегистр. 06-12-2007 | Отправлено: 20:57 01-07-2010
    VV2006

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    us0r, да нет же, с двумя батниками, один из которых запускает другого, Опера работает нормально и так же нормально удаляется по завершению работы Оперы и её каталог в темпе.
    Единственное неудобство - вручную закрывать окно первого батника (его закрытие автоматически закрывает и второй). Вот на всякий случай sfx-конфиг Opera.txt:  

    Код:
    п>ї;!@Install@!UTF-8!
    InstallPath="%TEMP%\\Opera"
    OverwriteMode="1"
    RunProgram="hidcon:0.CMD"
    GUIMode="2"
    Delete="%TEMP%\\Opera"
    ;!@InstallEnd@!

    Да, насчёт Multi User=0 - всегда так и  делаю, папку своего настроенного профиля тоже всегда держу в корне папки Оперы. Все пути поправлены с учётом запуска из каталога %temp%\Opera.
    Добавил hidcon: перед батником - одно окошко при запуске исчезло.  
    Борьба продолжается.

    Всего записей: 2123 | Зарегистр. 10-02-2006 | Отправлено: 21:29 01-07-2010 | Исправлено: VV2006, 11:05 02-07-2010
    jek1976



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

    Цитата:
    Метки времени, размер файла, хэш файла (в запущеном случае)...  

    СТОП! Чтобы сравнить метки времени у файлов в профиле, надо, как минимум, прочитать у всех этих файлов эти временные метки! Это сколько же времени у винды будет занимать такая проверка, если просматриваться будут все файлы из профиля!?
    Логичнее проверять одну специальную метку в локальном профиле и сравнивать ее с аналогичной меткой в перемещаемом профиле на сервере: если они совпадают, то синхронизация не нужна, и наоборот...

    Всего записей: 1057 | Зарегистр. 15-04-2005 | Отправлено: 23:55 01-07-2010
    bomzzz



    Запрет на пост
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    люди ну как же сделать включалку отключалку для видимости зарегистрированных расширений. меню-обновить не помогаит, F5 не помогаит - только или штатно или через контекстное меню эксплорера  
       
    вообще наверно окну эксплорера надо послать некую команду

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 00:08 02-07-2010 | Исправлено: bomzzz, 00:15 02-07-2010
    BVV63



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Что-то никак не могу придумать универсальный способ, как в батнике временно отключить работу RDP, дабы пользователи во время исполнения батника не цеплялись к серверу. Самый естественный способ, остановить службу "Terminal Services", не прокатывает: служба останавливаться не желает. На крайний случай - вообще отключить работу локальной сети (понятно, без перезагрузки). Может, кто подкинет идею?
     
    Добавлено:
    Хотя нет, локальную сеть трогать нельзя. Только RDP.

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 07:32 02-07-2010 | Исправлено: BVV63, 07:42 02-07-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    BVV63
    можно попробовать на встроеном виндовом фаерволе заблокировать порт RDP (TCP 3389).
    Только как это сделать из батника - не знаю
    Наверняка фаервол где-то в реестре хранит свои настройки. Значит править реестр и дать фаеру команду обновить конфиг.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 08:38 02-07-2010
    bomzzz



    Запрет на пост
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    барндмауер тута живет.

    Цитата:
     
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List]
    "%windir%\\Network Diagnostic\\xpnetdiag.exe"="%windir%\\Network Diagnostic\\xpnetdiag.exe:*:Enabled:@xpsp3res.dll,-20000"
    "%windir%\\system32\\sessmgr.exe"="%windir%\\system32\\sessmgr.exe:*:enabled:@xpsp2res.dll,-22019"
    "C:\\Program Files\\FlashFXP\\FlashFXP.exe"="C:\\Program Files\\FlashFXP\\FlashFXP.exe:*:Enabled:FlashFXP v3"
     
     
     

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 08:43 02-07-2010
    BVV63



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    bomzzz
    Спасибо, но не прокатывает. Отключён. Да и непонятно, как заставить брандмауэр обновить текущие установки, взяв новые из реестра.
    Пытаюсь сваять скрипт, который опрашивал бы группу "Remote Desktop Users", используя счётчик сохранял бы членов группы в переменных, и удалял бы их из группы. А впоследствие из переменных при помощи счётчика восстановил бы. Геморно, конечно...
    Можно, конечно, и в файл сохранять, тогда без счётчика можно обойтись. Но не люблю как-то использовать временные файлы, предпочитаю (если есть возможность) переменные.

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 09:00 02-07-2010 | Исправлено: BVV63, 09:15 02-07-2010
    wolf0425



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

    Цитата:
    Пытаюсь сваять скрипт, который опрашивал бы группу "Remote Desktop Users", используя счётчик сохранял бы членов группы в переменных, и удалял бы их из группы. А впоследствие из переменных при помощи счётчика восстановил бы. Геморно, конечно...  

    а чего геморного то? счетчик нужен только при создании списка
    net...чего-тотам') do (
        set /a i+=1  
        set "_duser_!i!=%%a"
        net localgroup "remote desktop users" %%a /delete
    )
    a при восстановлении просто 'set _duser_' в фор и вытаскиваешь все имена, загоняешь обратно в группу.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 10:46 02-07-2010 | Исправлено: wolf0425, 11:26 02-07-2010
    BVV63



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Ну, в приведённом Вами примере счётчик наверное совсем не нужен. Очевидно, я его и возьму на вооружение.
    Я пытался сделать так:
     

    Код:
    Set RemoteUsersCounter=0
    SetLocal EnableDelayedExpansion
    For /F "Tokens=* UseBackQ" %%A In (`Net LocalGroup "Remote Desktop Users" ^| Find /I "\"`) Do (
        Set /A RemoteUsersCounter+=1
    echo !RemoteUsersCounter!
        Set RemoteUser_%%A=%%A
      пробовал также другой вариант
        Set RemoteUser_!RemoteUsersCounter!=%%A
    echo !RemoteUser_RemoteUsersCounter!
        )
    EndLocal

     
    Первое эхо отрабатывает как надо. Второе в обоих случаях - нет. Переменная не создаётся. И я хочу ПОНЯТЬ: почему?
     
    Добавлено:
    Немножко наврал. Оказалось что я в обоих случаях использовал
    echo !RemoteUser_RemoteUsersCounter!
    В первом проверку надо было осуществить через Set. Переменные создаются, но на одну меньше, чем нужно. Правда, ещё и лишняя создаётся, сейчас буду разбираться. ... А нет, число-то верное, просто не туда взглянул. ...Всё, и причину дубликации тоже выяснил.
    А почему во втором случае
    Set RemoteUser_!RemoteUsersCounter!=%%A
    переменная не создаётся?
     
    Добавлено:
    Добился, что всё работает, но тут выяснилось, что выполняется-то это под SetLocal, так что я запарюсь вытаскивать переменные. Эк, лоханулся! Ладно, попробую способ, предложенный wolf0425.
     
    Добавлено:
    А с другой стороны, если счётчик не нужен, то оставить всё как есть, а SetLocal - убрать.
    Что-й то у меня сегодня "творческие страдания" .

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 11:29 02-07-2010 | Исправлено: BVV63, 12:15 02-07-2010
    res2001



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

    Код:
    net...чего-тотам') do (
        call set "_duser_=%%_duser_%% %%a"
        net localgroup "remote desktop users" %%a /delete
    )

     

    Цитата:
    a при восстановлении просто 'set _duser_' в фор и вытаскиваешь все имена, загоняешь обратно в группу.


    Код:
     
    for %%a in (%_duser_%) do net localgroup "remote desktop users" %%a /add

    Добавлено: Исправлен код

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 12:29 02-07-2010 | Исправлено: res2001, 15:44 02-07-2010
    BVV63



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

    Код:
    For /F "Tokens=* UseBackQ" %%A In (`Net LocalGroup "Remote Desktop Users" ^| Find.Exe /I "\"`
        ) Do (
        Set RemoteUser_%%A=%%A
        Net LocalGroup "Remote Desktop Users" "%%A" /Delete
        )

    Потом воспользуюсь шаблоном "RemoteUser_" для восстановления.
    А почему у меня не создавалась переменная под SetLocal, когда для её создания я пользовался другой переменной?

    Код:
    SetLocal EnableDelayedExpansion  
    For /F "Tokens=* UseBackQ" %%A In (`Net LocalGroup "Remote Desktop Users" ^| Find /I "\"`) Do (  
        Set /A RemoteUsersCounter+=1  
        Set RemoteUser_!RemoteUsersCounter!=%%A  
        )
    EndLocal

     
    Добавлено:
    Наверное, нужно было использовать не Set, а Call Set.

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 12:42 02-07-2010 | Исправлено: BVV63, 12:45 02-07-2010
       

    Страницы: 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 » Операционные системы » Microsoft Windows » Задачи на bat-файлах 8
    vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru