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

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пож-ста кусочком кода...
    Нужно сделать на батник пароль.
     
    ЦЕЛЬ-
    Сделать в батнике что бы при запуске он проверял на удаленной машине СОДЕРЖИМОЕ текстового файлика (это будут только цифры мин 4 макс 6 цифр), далее запрашивал ввести эти цифры не показывая их на экране и при совпадении введенных цифр и содержимого текстового файлика - команды выполняются дальше, при НЕ совпадении их - команда EXIT.
    Путь к файлу такой -

    Код:
    \\terminal_1\c$\WINDOWS\addins\pass.txt

    Делаю так, работает -

    Код:
    @echo off
    :pass
    echo Enter password:
    set /p pwd=
    if %pwd%== 777 goto :_1
    goto :pass
    :_1
    ping 127.0.0.1
    pause

    Но не это цель. Нужно что бы он считал с pass.txt содержимое и при совпадении этого содержимого и введенного с клавиатуры, выполнял команды дальше...
    ТАК ВОТ КАК ЗАСТАВИТЬ ЕГО СЧИТЫВАТЬ ПО УКАЗАННОМУ ПУТИ, И СРАВНИВАТЬ ЭТИ ДАННЫЕ???
     
     
    Очень надеюсь на вашу помощь, заранее благодарю...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 23:36 08-05-2010 | Исправлено: Mark_Titov, 01:51 09-05-2010
    BorlandIMHO

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    METAJIJI
    Тогда блок вывода выглядит где-то так:
    Код:
    copy /y nul out.ini
    for /f "eol=# tokens=1,2 delims==" %%A in (my.ini) do 1>>out.ini (
    REM если строка - название секции - просто выводим её в новый файл. Признак - символ "["
    echo %%A|find "["  
    REM закомментированная строка. Признак - символ ";"
    echo %%A=%%B|find ";"
    REM Строки с изменяемыми переменными. По одному эху на каждую изменяемую переменную. Или вообще на каждую, что эффективнее (см. ниже)
    echo %%A=%abc% |find /V ";"|find /V "["|find /I "abc="  
    echo %%A=%val% |find /V ";"|find /V "["|find /I "val="  
    echo %%A=%qwerty% |find /V ";"|find /V "["|find /I "qwerty="  
    echo %%A=%zxc% |find /V ";"|find /V "["|find /I "zxc="  
    REM Остальные строки с переменными. По одному блоку |find /V на все переменные, выведенные выше. Если есть полная уверенность, что выведены все используемые переменные - эта команда не нужна! Лучше обойтись без неё в силу громоздкости (подозреваю, что и работать она будет сильно долго, если переменных сильно много)
    echo %%A=%%B |find /V ";"|find /V "["|find /V "abc=" |find /V "val="|find /V "qwerty="|find /V "zxc="
    )
     

    Важно: переменные должны иметь существенно различные имена. Т.е. недопустимо, например, иметь переменные "abc" и "zxabc" - фильтр "abc=" сработает на обе и для "zxabc" будут выведены 2 значения: правильное и значение "abc". Практически такая же петрушка, кстати, в вашем варианте...
    "eol=#" добавлено дабы изменить использовавшийся в предыдущем for ";" - без этого будут отфильтрованы все закомменченные строки чего, как я понимаю, не нужно. Побочный эффект: использование данного символа в ini-файле также недопустимо (точнее - приведёт к трудно предсказуемым результатам).
    Блок считывания с приведёнными ограничениями будет такой (уже приводился выше):

    Код:
    for /f "eol=; delims=" %%A in ('type my.ini^|find /I /V "["') do SET "%%A"  

     
    P.S. Описанный блок вывода обрабатывает ~2 строки исходного my.ini в секунду. С отключённым последним echo - ~3 строки в секунду.
    Больше переменных - больше тормозов.
    Батники не предназначены для редактирования ini-файлов...


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

    Всего записей: 2745 | Зарегистр. 12-10-2006 | Отправлено: 23:44 08-05-2010 | Исправлено: BorlandIMHO, 23:58 08-05-2010
    METAJIJI

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А пустые строки будут выводиться?

    Код:
    val=
     
    abc=

    и как быть со строками вида:

    Код:
    GameLog=(X=0,Y=0,XL=512,YL=256)
    GridSize=(X=16.000000,Y=16.000000,Z=16.000000)


    Всего записей: 27 | Зарегистр. 11-03-2010 | Отправлено: 00:07 09-05-2010 | Исправлено: METAJIJI, 00:07 09-05-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mark_Titov
    Цитата:
    ТАК ВОТ КАК ЗАСТАВИТЬ ЕГО СЧИТЫВАТЬ ПО УКАЗАННОМУ ПУТИ, И СРАВНИВАТЬ ЭТИ ДАННЫЕ???  

    1. не капси, читать противно.
    2. сравнить две переменные сам сможешь?
    3. чтение строки из файла в переменную было например на предыдущей странице.
     
    альтернативное решение - с помощью findstr проверить что в файле есть строка, полностью совпадающая с нужной переменной. справку сам прочитать способен?
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 03:48 09-05-2010 | Исправлено: wolf0425, 03:53 09-05-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ...Голова уже беременная ))) от этих переменных, но делать нужно.
    Думал про findstr, но с переменными туго у меня...
    Щас пробовать буду...
    Спасибо.
    Если что напишу...
     
    Добавлено:
    Решение нашел, спасибо с переменными помогли мне...

    Код:
    @echo off
    setlocal
    set sPath=\\terminal_1\c$\WINDOWS\addins\pass.txt
    for /f "usebackq delims==" %%i in ("%sPath%") do set sPassword=%%i
    set /p sInPassword=Enter password:
    if "%sPassword%" neq "%sInPassword%" exit /b 1
    ping 127.0.0.1
    pause
    endlocal
    exit /b 0

    Только как сделать так что бы данные считывались только с первой строки в файле pass.txt, а все остально игнорировалось?

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 04:02 09-05-2010
    NIKZZZZ



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

    Цитата:
    Только как сделать так что бы данные считывались только с первой строки в файле pass.txt, а все остально игнорировалось?

     

    Код:
    @echo off
    setlocal
    set sPath=\\terminal_1\c$\WINDOWS\addins\pass.txt
    for /f "usebackq delims==" %%i in ("%sPath%") do (
      set sPassword=%%i
      goto _1
    )
    :_1
    set /p sInPassword=Enter password:
    if "%sPassword%" neq "%sInPassword%" exit /b 1
    ping 127.0.0.1
    pause
    endlocal
    exit /b 0

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 08:30 09-05-2010
    mbku14

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте, заранее извините, если вопрос глупый.
     
    Есть bat файл, вызывающий много других bat-файлов, суть которых с помощью команды for построчно разбирать файлы и что-то там делать. Файлы большие где-то по 2000 строк. Вcё это как-то работает.
     
    Но мне сказали всё перенести на другой комп, подключить как сетевой диск, перенести всё свое туда: и bat-файлы и  обрабатываемые файлы, чтоб и другие могли запустить.  
     
    Запускать и работать все должны с этого сетевого диска, но при этом никакого  удаленного рабочего стола, а работать со своего компа..
     
    И в результате каждый bat-файл работает минут по 10.
    Нельзя ли как-то сделать чтоб работало быстро.
     
    Копировать всё себе на комп перед запуском не пойдет, т.к. не у всех для этого есть место на компе.

    Всего записей: 6 | Зарегистр. 09-05-2010 | Отправлено: 08:38 09-05-2010
    wolf0425



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

    Цитата:
    Только как сделать так что бы данные считывались только с первой строки в файле pass.txt, а все остально игнорировалось?
    тогда for лишний
    set /p sPassword=<\\terminal_1\c$\WINDOWS\addins\pass.txt

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 09:25 09-05-2010
    king_stiven

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

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 09:41 09-05-2010 | Исправлено: king_stiven, 09:44 09-05-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ...спасибо, работает!
    Но теперь проблемка в связи с этим нарисовалась -
    - если удалить файл пароля pass.txt, то в моей консоли можно просто нажать ENTER и без проблем войти в меню.
     
    Нужно к этому коду прикрутить проверку наличия этого файла (pass.txt) и если его нет - надпись типа "SORRY, PASSWORD NO VALID, press any key for exit".
    А если файл есть, но пустой, та же надпись - "SORRY, PASSWORD NO VALID, press any key for exit".
     
    Буду очень признателен вам если поможете в этом, уже все практически готова консоль, это последние штрихи по безопасности...
     
    wolf0425  us0r  NIKZZZZ
    Благодарю вас! Вы очень мне помогли...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 10:23 09-05-2010 | Исправлено: Mark_Titov, 10:23 09-05-2010
    Rush

    Уже за тридцать...
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mark_Titov

    Код:
     
    if exist %sPath% (
    if "%sPassword%"=="" echo SORRY, PASSWORD NO VALID, press any key for exit
    ) else (echo SORRY, PASSWORD NO VALID, press any key for exit)
     

    или еще проще:

    Код:
    if "%sPassword%"=="" echo SORRY, PASSWORD NO VALID, press any key for exit

    Всего записей: 3551 | Зарегистр. 20-11-2003 | Отправлено: 11:29 09-05-2010 | Исправлено: Rush, 11:39 09-05-2010
    BorlandIMHO

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

    Будут.

    Цитата:
    как быть со строками вида:

    А откуда они вообще взялись? В первоначальной постановке задачи таких не было...
    Наиболее правильным было бы просто отказаться от их использования - заменив каждую на секцию вида  

    Код:
    [GameLog]
    X=0
    Y=0
    XL=512
    YL=256

     
    Или тогда уже писАть отдельную подпрограмму вывода под каждую используемую переменную, которую вызывать из цикла командой "call :%%A_OUT". Оно, теоретически, и работать будет быстрее - но сложность кода возрастает на порядок...
    А ещё проще - поскольку структура данного ini вам известна - просто тупо написать вывод его эхом без всяких циклов...
     
    Правда, если вы такие переменные не изменяете - достаточно в выводящем цикле for поменять tokens=1,2 на tokens=1,*

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

    Всего записей: 2745 | Зарегистр. 12-10-2006 | Отправлено: 11:44 09-05-2010 | Исправлено: BorlandIMHO, 11:59 09-05-2010
    wolf0425



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

    Цитата:
    А откуда они вообще взялись? В первоначальной постановке задачи таких не было...  

    первоначально приведенный код такие строки переваривал, вроде.
     

    Цитата:
    Или тогда уже писАть отдельную подпрограмму вывода под каждую используемую переменную,
    это ещё зачем? строки как строки - "^<>% нет и ладно.

    Цитата:
    Правда, если вы такие переменные не изменяете
    да и если изменяет - нет никакой проблемы
     

    Цитата:
    А ещё проще - поскольку структура данного ini вам известна - просто тупо написать вывод его эхом без всяких циклов...  
    вот-вот.  
    в чем смысл что-то извращенно циклить, если все параметры первоначально загоняются в переменные, а потом все переменные загоняются в новый инишник?
    разве только комментарии переносить...

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 12:51 09-05-2010 | Исправлено: wolf0425, 13:41 09-05-2010
    BorlandIMHO

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

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

    Подумал. Действительно нету.
    Просто на неё надо будет добавить отдельную строчку.

    Цитата:
    разве только комментарии переносить...

    других причин тоже не вижу...
     
    Если уж на то пошло - редактирование ini батником вообще большой изврат...

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

    Всего записей: 2745 | Зарегистр. 12-10-2006 | Отправлено: 14:01 09-05-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Rush спасибо...
    Теперь при отсутствии файла он НЕ открывает меню консоли!
     
    Нужно решить теперь как при наличии файла НО отсутствии в нем пароля тоже что бы не открывался. (если файл есть - но пустой)...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 15:04 09-05-2010 | Исправлено: Mark_Titov, 15:08 09-05-2010
    wolf0425



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

    Цитата:
    Нужно решить теперь как при наличии файла НО отсутствии в нем пароля тоже что бы не открывался. (если файл есть - но пустой)...
    давай вообще устрой проверку первой буквы пароял на букву-цифру, чего мелочиться то
    echo.%sPassword%|findstr /i /r /b /c:"[a-z0-9]">nul && goto:goodpass
     
     
    Добавлено:

    Цитата:
    Если уж на то пошло - редактирование ini батником вообще большой изврат...
    не, пока несколько строк поменять - нет проблем, sed или for+findstr прикручиваем и вперед, с песней, инишник такой же текстовый файл как все прочие.
    А нафига ВЕСЬ инишник менять построчно - непонятно.
     
    BorlandIMHO
    хотя если кому-то очень хочется - почему нет?

    Код:
    @echo off
    for /f "tokens=1* delims==" %%a in (file.txt) do if .%%b neq . set %%a=%%b
    del file2.txt  
    set xx100=1000
    for /f "tokens=1* delims=]" %%a in ('find /n /v "" ^<file.txt ') do echo.%%b | find "=">nul && ( for /f "tokens=1 delims==" %%c in ('echo.%%b') do 1>>file2.txt call echo.%%c=%%%%c%%) || (1>>file2.txt echo.%%b)
     
    тестировал на
    Код:
    [123]
    ;"123"
    xx100=100
     
    xx101=101, 143, (z=662)
    xx102=102
    тут ещё 50 строк фигни. пустые строки и прочие комментарии - копируются "как есть"
    set xx100=1000 - это для проверки того что изменения переменных - пишутся.
    ~6 секунд на моем стареньком компе. 20 строк = 2 сек.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 15:49 09-05-2010 | Исправлено: wolf0425, 01:19 10-05-2010
    Mark_Titov



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

    Цитата:
    давай вообще устрой проверку первой буквы пароял на букву-цифру, чего мелочиться то  
    echo.%sPassword%|findstr /i /r /b /c:"[a-z0-9]">nul && goto:goodpass

    ...а что, это не плохая идея! )
     
    Я не много переделал строку (скомбинировал), по идее должна работать, но почему-то не хочет.
     

    Код:
    dir \\terminal_1\c$\WINDOWS\addins\pass.txt* /a-d 2>nul >nul| findstr /i /r /b /c:"[a-z0-9]">nul && goto :_menu
    goto  :_error

     
    По логике этот код должен проверять сначала наличие самого файла, потом проверяет наличие первой буквы или цифры, и если и то и другое в присутствует - должен пропускать дальше выполнение кода. Если нет хоть одного условия проверки то перенаправление на строки кода с ошибкой (goto  :_error)...
     
    В чем грабли, где я ошибся, подскажи пож-ста?!

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 16:37 09-05-2010 | Исправлено: Mark_Titov, 16:41 09-05-2010
    wolf0425



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

    Цитата:
    по идее должна работать, но почему-то не хочет.  

    да и по идее работать не должна, тебе только кажется.

    Цитата:
    По логике этот код должен проверять сначало наличие самого файла,  
    проверяет,
    кстати наличие pass.txt.bak такую проверку устроит
    Цитата:
    потом проверяет наличие первой буквы или цифры,
    покрась синеньким -какое место кода отвечает за отправку содержимого файла на проверку.
     
    но смысла проверять дважды (существование и содержание) - нет никакого, проще сразу содержание, только подавить сообщение об отсутсвии файла. нулевое содержание проверку не пройдет же.
     

    Код:
    type \\terminal_1\c$\WINDOWS\addins\pass.txt 2>nul | findstr /i /r /b /c:"[a-z0-9]">nul && goto :_menu
    goto  :error  

     
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 16:46 09-05-2010 | Исправлено: wolf0425, 16:48 09-05-2010
    Mark_Titov



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

    Цитата:
    но смысла проверять дважды (существование и содержание) - нет никакого, проще сразу содержание, только подавить сообщение об отсутсвии файла. нулевое содержание проверку не пройдет же.

    ...Действительно )) не подумал что-то...
    Большое человеческое спасибо тебе и остальным гуру командной строки которые мне помогали в этом...
     
    P.s.
    Я знаю что cmd не поддерживает *** звездочки, а можно как-нибудь скрыть ввод паролей в консоль?
     
    И еще, этот код будет на vista и 7-ке работать? Сам на XP сижу, пока не переходил еще, да и под рукой их нет - не могу проверить...
     
    Спасибо за помощь...
    С уважением...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 17:20 09-05-2010
    wolf0425



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

    Цитата:
    Я знаю что cmd не поддерживает *** звездочки, а можно как-нибудь скрыть ввод паролей в консоль?
    вроде нет. а от чего конкретно должны защищать звездочки? от наблюдательного человека стоящего за спиной?

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 17:48 09-05-2010 | Исправлено: wolf0425, 17:49 09-05-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