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

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

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

vu1tur (25-01-2010 12:41): лимит страниц, продолжение: http://forum.ru-board.com/topic.cgi?forum=62&topic=19668  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:37 26-05-2009 | Исправлено: TechnicsKuzya, 13:53 27-12-2009
    wolf0425



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

    Цитата:
    Вопрос остался на счет надписи. И как можно скрыть батник, а то висит на виду...

    по секрету скажу - это не два вопроса, а один.
     
    cmdow.exe ищи в шапке раздела или в яндексе

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 17:22 19-01-2010 | Исправлено: wolf0425, 17:23 19-01-2010
    svobodny



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Все понял Но это надо ставить доп. проги и т.д. Я нашел лучший способ - Bat_To_Exe_Converter. Все равно я собирался добавить к этому батнику иконку. А в этом компиляторе есть режим скрытия.
     
    Спасибо за помощь!

    Всего записей: 583 | Зарегистр. 14-02-2009 | Отправлено: 17:35 19-01-2010
    Pacho



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как проверить значение параметра в реестре и, если оно пустое, то заменить на своё?
    К примеру, создаём параметр:
    Код:
    reg add HKLM\Software\Classes\.!!! /v PerceivedType
    Если бы он имел значение, то можно было бы его прочесть:
    Код:
    @for /f "tokens=3" %%k in ('reg query HKLM\Software\Classes\.!!! /v PerceivedType') do @echo %%k
    но параметр без значения так не проверить.

    ----------
    Нет судьбы, кроме той, которую мы выбираем.

    Всего записей: 263 | Зарегистр. 02-04-2005 | Отправлено: 18:10 19-01-2010
    mugil_cephalus

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

    Цитата:
    Если бы он имел значение, то можно было бы его прочесть:

    а если "прочесть" и if error тогда то-то

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 18:35 19-01-2010
    Kirillhome



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Pacho
    А вот так вот что мешает?

    Код:
     
    set ZZZ=""
    for /f "skip=2 tokens=3" %%k in ('reg query HKLM\Software\Classes\.!!! /v PerceivedType') do set ZZZ="2"
    if not %zzz%=="2" echo Missing
     

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 18:36 19-01-2010
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kirillhome
    wolf0425
    если не напутал, то тогда решение задачи походу такое:

    Код:
    mode con lines=6000  
    cd\  
       
    for /f "tokens=*" %%i in ('reg query "hklm\system" /s ^|findstr /i "HKEY_LOCAL_MACHINE\system D3DOGL_70835937"') do call:_1 "%%i"  
    goto:eof  
       
    :next1  
    echo _%var1%_  
    rem еще одна проверка, чтобы не удалить не то  
    reg query %var1%|find /i "D3DOGL_70835937"|find /i "00000200" &&reg add "%var1%" /v D3DOGL_70835937 /t REG_BINARY /d 00000010 /f
    pause  
    goto:eof
       
    :_1  
    echo %~1|find /i "HKEY_LOCAL_MACHINE\system" &&set "var1=%~1"  
    echo %~1|find /i "D3DOGL_70835937"|find /i "00000200" &&goto:next1  
    goto:eof

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 18:39 19-01-2010
    Kirillhome



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    mugil_cephalus
    А не так?
     
    было:

    Код:
     
    reg query %var1%|find /i "D3DOGL_70835937"|find /i "00000200" &&reg add "%var1%" /v D3DOGL_70835937 /t REG_BINARY /d 00000010 /f  
     

     
    предлагаю:

    Код:
     
    reg query %var1% /v "D3DOGL_70835937"|find /i "00000200" &&reg add "%var1%" /v D3DOGL_70835937 /t REG_BINARY /d 00000010 /f  
     

     
    Это если не менять логику findstr и find наоборот (а я бы именно так и сделал - т.е. сначала - find - что бы "не ругалось", а уж в детальной проверке - findstr... Или всё же вывел бы сначала в файл - тогда вообще без "ругани" и полный поиск).

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 20:16 19-01-2010
    Julgo



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте не подскажите, как прочитать первые N символов/байт из файла?

    Всего записей: 19 | Зарегистр. 10-12-2006 | Отправлено: 20:32 19-01-2010
    Pacho



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

    Цитата:
    а если "прочесть" и if error тогда то-то

    Ошибки никакой нет. Параметр-то существует.
     
    Kirillhome
    А как бы теперь сделать, чтобы выводилось значение параметра, а при его отсутсвии (значения) выводилось "Missing"?

    Всего записей: 263 | Зарегистр. 02-04-2005 | Отправлено: 21:41 19-01-2010
    Kirillhome



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

    Код:
     
    set zzy=""
    for /f "skip=2 tokens=3" %%k in ('reg query HKLM\Software\Classes\.zip /v PerceivedType') do call :_1 %%k
    if %zzy%=="" (
      echo Missing ) else (
      echo %zzy%)
    goto :EOF
     
    :_1
    set zzy=%1
    goto :EOF
     

    Могут возникнуть проблемы, если значение параметра содержит кавычки, пробелы (хотя с этим проще - в данном примере выйдет текст до пробела), спецсимволы (>,<, |, &, ^)...
     
    Или - вот так вот:

    Код:
     
    set zzy=""
    for /f "skip=2 tokens=3" %%k in ('reg query HKLM\Software\Classes\.!!! /v PerceivedType') do set zzy="1"
    if %zzy%=="1" (
      for /f "skip=2 tokens=3" %%k in ('reg query HKLM\Software\Classes\.!!! /v PerceivedType') do echo "%%k" ) else (
      echo Missing)
    goto :EOF
     

    По идее - избавлено от этих проблем (единственное - значение выведет в кавычках).

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 22:13 19-01-2010 | Исправлено: Kirillhome, 22:24 19-01-2010
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pacho
    прочесть не параметр, а любое значение параметра, например, - /d 1
    точнее так - reg query HKLM\Software\Classes\.!!! /v PerceivedType |find /i /v "HKEY_LOCAL_MACHINE"
    Kirillhome
    %var1% возвращает раздел параметра, у параметра несколько значений и если значение не то, которое нужно, то нужное значение может быть в одноименном параметре, НО уже в другом разделе - поэтому проверка нужна в цикле, а позже - поздно

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 22:36 19-01-2010 | Исправлено: mugil_cephalus, 22:50 19-01-2010
    Sereoga

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста, как в батнике запустить какую-то программу (например, TrueImage.exe), так, чтобы управление сразу вернулось в родительский батник (сразу, а не после завершиния вазванной программы)?
     
    так:
    start "%ProgramFiles%\AcronisTruImHom\TrueImage.exe"
     
    и так:
    "%ProgramFiles%\AcronisTruImHom\TrueImage.exe"
     
    не получается - Акронис запускается, но управление в батник на возвращается пока Акронис не завершится.

    Всего записей: 62 | Зарегистр. 20-12-2008 | Отправлено: 23:06 19-01-2010
    mugil_cephalus

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

    Цитата:
    так:  
    start "%ProgramFiles%\AcronisTruImHom\TrueImage.exe"

    start "" "%ProgramFiles%\AcronisTruImHom\TrueImage.exe"
    см. start /?
     
    Добавлено:
    Kirillhome
    мне нужно получить в вывод, с которым дальше работать, - или "HKEY_LOCAL_MACHINE\hardware"  или  "VideoBiosDate", то есть поиск обоих значений - как это сделать find'om, а не findstr - не знаю

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 23:07 19-01-2010
    Kirillhome



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

    Цитата:
    %var1% возвращает раздел параметра, у параметра несколько значений и если значение не то, которое нужно, то нужное значение может быть в одноименном параметре, НО уже в другом разделе - поэтому проверка нужна в цикле, а позже - поздно

    Если честно, не очень понял.
     
    "От печки"....
    Что вижу

    Код:
     
    mode con lines=6000
    cd\
       
    for /f "tokens=*" %%i in ('reg query "hklm\system" /s ^|findstr /i "HKEY_LOCAL_MACHINE\system D3DOGL_70835937"') do call:_1 "%%i"
    goto:eof
       
    :next1  
    echo _%var1%_
    rem еще одна проверка, чтобы не удалить не то
    reg query %var1%|find /i "D3DOGL_70835937"|find /i "00000200" &&reg add "%var1%" /v D3DOGL_70835937 /t REG_BINARY /d 00000010 /f
    pause
    goto:eof
       
    :_1
    echo %~1|find /i "HKEY_LOCAL_MACHINE\system" &&set "var1=%~1"
    echo %~1|find /i "D3DOGL_70835937"|find /i "00000200" &&goto:next1
    goto:eof
     

    Т.е. в конце концов, у параметр, имя которому D3DOGL_70835937 (и видимо, значение - 00000200) мы заменяем значение на 00000010
    Я предложил в данном поиске

    Код:
     
    rem еще одна проверка, чтобы не удалить не то  
    reg query %var1%|find /i "D3DOGL_70835937"|find /i "00000200" &&reg add "%var1%" /v D3DOGL_70835937 /t REG_BINARY /d 00000010 /f
     

    т.к. у нас уже известна ветка - %var1%, обратиться сразу к значению параметра в данной ветке

    Код:
    reg query %var1% /v "D3DOGL_70835937"|find /i "00000200" &&reg add "%var1%" /v D3DOGL_70835937 /t REG_BINARY /d 00000010 /f
     

    т.е. - удалить один FIND
     
    Где здесь "уже поздно" - я не вижу.
     
    Если же 00000200 - НЕ текущее значение параметра D3DOGL_70835937 ветки %var1%, а обязательное значение какого угодно параметра ветки %var1% (или какой-либо параметр в этой ветке) - то тогда моё предложение, конечно, ошибочно.
     
    Совсем для красоты, конечно, можно перед заменой ещё и экспортировать (сохранять) ветку %var1%.

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 23:53 19-01-2010
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kirillhome
    заказчик уже поменял условия задачи - мы там - http://forum.ru-board.com/topic.cgi?forum=5&topic=29819&start=1680#2

    Цитата:
    Код:reg query %var1% /v "D3DOGL_70835937"|find /i "00000200" &&reg add "%var1%" /v D3DOGL_70835937 /t REG_BINARY /d 00000010 /f  
     
     
    т.е. - удалить один FIND  

     да так можно, я подумал про другой find , а там
    Цитата:
    C:\Documents and Settings\Administrator>reg query "hklm\system" /s|find /i "D3DOGL_70835937"  
        D3DOGL_70835937    REG_BINARY    00000010  
        D3DOGL_70835937    REG_BINARY    00000200  
        D3DOGL_70835937    REG_BINARY    00000010  
     

    но условия уже поменялись (повторюсь)
     
    Добавлено:
    F:\Documents and Settings\admin>reg query "hklm\hardware" /v VideoBiosDate /s
     
    Ошибка: Слишком много параметров в командной строке.
     
    что не правильно?
    судя по ntcmds - "reg query имя_раздела [{/v имя_записи|/ve}] [/s]" - /v и /s можно употреблять вместе

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 00:27 20-01-2010
    dima1978



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

    Подскажите, пожалуйста, есть ли возможность экранировать символ двойной кавычки (") в батнике или командной строке? Все остальные спецсимволы экранируются как раз с помощью этих двойных кавычек.
     
    Для примера нужно разархивировать файл с паролем, в котором присутствует символ ("):  
    RaR x -ad -pp"Rx0#nwU5cd sample.rar
     

    Всего записей: 3767 | Зарегистр. 06-11-2003 | Отправлено: 03:29 20-01-2010
    Sereoga

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

    Всего записей: 62 | Зарегистр. 20-12-2008 | Отправлено: 04:49 20-01-2010
    Kirillhome



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    dima1978
    В общем случае - есть спец-символ ^
    Для других спец.символов (&|<>) - всё срабатывает, а вот для кавычки... Похоже - нет.
     
     
    mugil_cephalus

    Цитата:
    F:\Documents and Settings\admin>reg query "hklm\hardware" /v VideoBiosDate /s
    Ошибка: Слишком много параметров в командной строке.
    что не правильно?

    Ну, "опыт, сын ошибок трудных" говорит следующее:
    reg query "hklm\software\classes\.zip"
    выведет список ключей и их значения (текущего уровня), и все подуровни
     
    reg query "hklm\software\classes\.zip" /s
    выведет список ключей и их значения (текущего уровня), и все подуровни, с их списком ключей и значениями
     
    reg query "hklm\software\classes\.zip" /v Perceivedtype
    выведет только значение ключа
     
    И фигурных скобочек ещё одних (в описании команды) - ой, не хватает.
    Возможно - имеет смысл "стянуть" REG из Win'2003 - там следующий пример работает:

    Код:
     
    reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" /v GlobalFlag /s
     

    (а в XP - не работает - выдаёт ошибку)
     
    Добавлено:
    Нет, просто так не "стянешь" - попробовал, пишет ошибку - "Точка входа в процедуру RegGetValueW не найдена в библиотеке DLL advapu32.dll"

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 04:54 20-01-2010
    dima1978



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

    Kirillhome

    Цитата:
    В общем случае - есть спец-символ ^  
    Для других спец.символов (&|<>) - всё срабатывает, а вот для кавычки... Похоже - нет.

     
    Да, действительно, спецсимвол (^) экранирует все остальные спецсимволы командной строки без проблем, кроме злополучных кавычек (").
     
    Вопрос пока остается.
     

    Всего записей: 3767 | Зарегистр. 06-11-2003 | Отправлено: 10:01 20-01-2010
    Pacho



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всё оказалось гораздо проще:

    Код:
    for /f "skip=2 tokens=2,*" %%c in ('reg query HKLM\Software\Classes\.!!! /v PerceivedType') do echo PerceivedType=%%d

    Всего записей: 263 | Зарегистр. 02-04-2005 | Отправлено: 10:07 20-01-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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 7
    vu1tur (25-01-2010 12:41): лимит страниц, продолжение: http://forum.ru-board.com/topic.cgi?forum=62&topic=19668


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru