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

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sergij
    Вроде всё проходит, но если самая последняя строчка в nnn.log пустая, то опять засада. Хотя напиши тут если один показатель в самом конце nnn.log пустой. как будет выглядеть лог файл
    так
    ...
    ...
    12
     
    или так
    ...
    ...
    12
     
     
    ?

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 11:12 15-03-2010 | Исправлено: king_stiven, 11:44 15-03-2010
    mugil_cephalus

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

    Цитата:
     но если самая последняя строчка в nnn.log пустая, то опять засада.

    у меня такая же засада и с непустой последней строкой

    Код:
    chcp 1251  
    setlocal enabledelayedexpansion  
    echo Имя комьютера      MAC-адрес    Пользователь          IP-Адрес           E-Mail >>out.txt  
    :loop  
    for /f "tokens=1* %skp% delims=:" %%i in ('findstr /n $ 001.log') do (  
    0>nul 1>>out.txt 2>&1 set /p="%%j         "  
    for /f "tokens=1* %skp% delims=:" %%i in ('findstr /n $ 002.log') do (  
    0>nul 1>>out.txt 2>&1 set /p="%%j         "  
    for /f "tokens=1* %skp% delims=:" %%i in ('findstr /n $ 003.log') do (  
    0>nul 1>>out.txt 2>&1 set /p="%%j         "  
    if /i "_%skp%" equ "_" set "skp=0"  
    set /a skp=!skp!+1  
    set "skp=skip=!skp!"  
    1>>out.txt 2>&1 echo.  
    goto:loop  
    )))  
    pause

     
    001.log  
    pc1  
    pc2  
    pc3  
     
    002.log  
    mac1  
    mac2
    mac3  
     
    003.log  
    gen1  
    gen2  
    gen3  
     
    out.txt
    Имя комьютера      MAC-адрес    Пользователь          IP-Адрес           E-Mail  
    pc1         mac1         gen1          
    pc2         mac2         gen2          
    pc3         mac3          
     
    почему то все равно она "теряется"   ?

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 12:23 15-03-2010 | Исправлено: mugil_cephalus, 12:25 15-03-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mugil_cephalus
    смысла нет в моём варианте, пока автор не прояснит ситуацию

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 12:59 15-03-2010
    mugil_cephalus

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

    Цитата:
    пока автор не прояснит ситуацию

    абсолютно согласен
    просто я думал, ты используешь предыдущий код

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 13:31 15-03-2010
    sergij

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

    Всего записей: 39 | Зарегистр. 14-03-2006 | Отправлено: 16:20 15-03-2010 | Исправлено: sergij, 23:46 19-03-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mugil_cephalus
    С пустыми строками в логах всё нормально в моём варианте, но если самая последняя строка в любом логе пустая, и нет так называемого символа перехода на следующую строчку, что бывает довольно редко, тогда в последней строчке или столбцы перепутаются или вообще она не выйдет.
     
    Добавлено:
    sergij
    повторяю ещё раз:

    Цитата:
    Хотя напиши тут если один показатель в самом конце nnn.log пустой. как будет выглядеть лог файл  
    так  
    ...  
    ...  
    12  
     
    или так  
    ...  
    ...  
    12  
     
     

    Вроде по русски пишу.
    Ну как бы тебе обьяснить, выбери из своих логов(001.log-nnn.log) такой, у которго самая последняя строка пустая, так как данного параметра просто нет(по крайней мере ты нам обьяснял так происхождения пустых строк в логах), и выложи сюда или напиши есть ли после этой самой последней пустой строки переход на следующую строку.  
    Пример:
    echo 12> 1.txt
    сделает не только вывод 12 в 1.txt, но выведет в 1.txt переход на следующую строку. Если в твоём логе есть такой переход. то я выкладываю решение. Тестить полностью твой код не имею возможности.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 16:21 15-03-2010 | Исправлено: king_stiven, 16:54 15-03-2010
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sergij
    см в шапке Примечание: Большие куски кода заключайте в тэг [more]

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 16:46 15-03-2010
    bdvrt



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

    Цитата:
    встроенной команды нет, есть консольные утилиты  
    http://www.petri.co.il/software/clip.zip
    или  
    ftp://ftp.microsoft.com/Services/TechNet/samples/PS/Win98/Reskit/FILE/CLIP.EXE

    А как правильно подключить CLIP.EXE, а то почему-то при открытии текст не вставляется??
     
    for /f "tokens=1,2,3,4,5,6,7 delims=:,. " %%a in ('echo ReadMe') do echo. > %%c%%b%%a%%d%%e%%f.txt&&start c:\progra~1\Notepad++\Notepad++.exe %%c%%b%%a%%d%%e%%f.txt  
    clip.exe ???

    Всего записей: 275 | Зарегистр. 22-06-2007 | Отправлено: 17:30 15-03-2010 | Исправлено: bdvrt, 17:30 15-03-2010
    sergij

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

    Всего записей: 39 | Зарегистр. 14-03-2006 | Отправлено: 22:32 15-03-2010 | Исправлено: sergij, 23:45 19-03-2010
    wolf0425



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

    Код:
    :loop
    for /f "tokens=1* %skp% delims=]" %%i in ('find /n /v "" ^< 001.log') do (
    0>nul 1>>out.txt 2>&1 set /p="%%j         "              
    for /f "tokens=1* %skp% delims=]" %%i in ('find /n /v "" ^< 002.log') do (
    0>nul 1>>out.txt 2>&1 set /p="%%j         "              
    for /f "tokens=1* %skp% delims=]" %%i in ('find /n /v "" ^< 003.log') do (
    0>nul 1>>out.txt 2>&1 set /p="%%j         "              
    for /f "tokens=1* %skp% delims=]" %%i in ('find /n /v "" ^< 004.log') do (
    0>nul 1>>out.txt 2>&1 set /p="%%j         "              
    for /f "tokens=1* %skp% delims=]" %%i in ('find /n /v "" ^< 005.log') do (
    0>nul 1>>out.txt 2>&1 set /p="%%j         "
    if /i "_%skp%" equ "_" set "skp=0"
    set /a skp=!skp!+1
    set "skp=skip=!skp!"
    1>>out.txt 2>&1 echo.
    goto:loop
    )))))  

     
    всё это не отменяет того, что при проопуске значения в логе строка 0>nul 1>>out.txt 2>&1 set /p="         " ничего не пишет в файл и колонки едут. На этут тему мысли есть какие-то?
    Или просто посоветовать sergij заменить пробелы на разделитель, например ; между полями - чтобы ексель с полями не путался это даже полезнее...
     
    а вообще у идеи сначала создать много логфайлов, а потом их построчно препарировать - плохо  с дуракоустойчивостью. Вот случится глючный .ini  в котором нужной поиску подстроки просто не окажется или окажется две -  и привет, совершенно молча пойдет смещение строк в итоговом логе.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 23:30 15-03-2010 | Исправлено: wolf0425, 10:29 16-03-2010
    sergij

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
     
    А если предварительно обработать ini-Файлы убрав из них пустые строки - а затем всё остальное ?
     
    Сейчас так и происходит  -нет никакой дуракоустойчивости - Вот я и уже по другому начал сочинять  
    Всё за один цикл обработки одного  INI и сразу вывод по всем 33 позициям вот почему мне нужен другой способ вывода
    Код:
    ChCp 1251
    setlocal enabledelayedexpansion
     
     
    for /F "tokens=* " %%i in (001.txt) do set pc=%%i
    for /F "tokens=* " %%i in (002.txt) do set mac=%%i
    for /F "tokens=* " %%i in (003.txt) do set user=%%i
    for /F "tokens=* " %%i in (012.txt) do set ofe7=%%i
    for /F "tokens=* " %%i in (009.txt) do set xpk=%%i
     
    echo Имя_комьютера    MAC-адрес    Пользователь    Процессор    Чипсет    Объем_памяти    Bios    Сер.номер_и_тип_монитор  >>out2.txt
    echo %pc%    %mac%    %user%                        %xpk%            %ofe7%>> out2.txt
     

    Я специально положил 5 ini с разными офисами и без и одну HomeXP - как раз -что бы решить вопрос с Дуракоустойчивостью  - и для правильного их вывода в отчет. Спасибо за вашу работу

    Всего записей: 39 | Зарегистр. 14-03-2006 | Отправлено: 23:35 15-03-2010 | Исправлено: sergij, 00:23 16-03-2010
    king_stiven

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

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set n=1
    :loop
    for %%a in (001.log 002.log 003.log) do call :jkl %%a
    set /a n+=1
    if not defined end goto :eof
    set end=
    set /a skp=!skp!+1
    set "skp=skip=!skp!"
    echo !p!>>out.txt
    set p=
    goto loop
    :jkl
    for /f "tokens=1* delims=:" %%e in ('findstr /n /r "^$" %1') do (
         if %%e gtr !n! goto loop2
         if "%%e"=="!n!" (
            set "p=!p!error         "
            set end=no
            goto loop1
        )
    )
    :loop2
    for /f "tokens=* %skp%" %%i in (%1) do (
        set "p=!p!%%i         "
        set end=no
        goto loop1
    )
    set "p=!p!error         "
    :loop1

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

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 07:27 16-03-2010 | Исправлено: king_stiven, 08:03 16-03-2010
    wolf0425



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

    Цитата:
    Вот я и уже по другому начал сочинять  
    всё целиком за тебя переписывать - точно лень.
    делаешь примерно следующим образом:

    Код:
    @echo off
    ChCp 1251
     
    del /q *.txt
     
    1>>out.txt echo Имя_комьютера  .... и дальше вся твоя длинная шапка
    for %%f in ( *.ini ) do call :ini2line "%%~f"
    exit
     
    :ini2line
    echo proceed %1  
    rem подпрограмма, из одного ini  (%1) формирующая одну строку для out.txt
    for /l %%a in (1,1,33) do call set "var_%%a="
    for /f "tokens=1* delims==" %%a in ('type %1') do (
        if /i "%%a"=="Компьютер" set "var_1=%%b"
        if /i "%%a"=="Сеть|Первичный адрес MAC" set "var_2=%%b"
        if /i "%%a"=="Генератор" set "var_3=%%b"
        rem дальше аналогичные if для остальных 30 нужных выдираемых параметров
    )
    ::set var_
    1>>out.txt echo.%var_1%    %var_2%    %var_3%    ...    %var_33%  
    rem %var_nn% там через табуляцию лучше
     
    rem а если файл нужен только для засовывания в exel - то через ;  
    rem и расширение сразу делать .csv
    goto :eof

     
    если у тебя там есть какие-то параметры, которые должны нелинейно обрабатываться перед попаданием в итоговый файл и у тебя будут с этим проблемы - пиши, а то весь твой батник разбирать лень.  
    но sbs2.com вроде не понадобится и промежуточные логи точно не нужны.
     
    про 24-26 параметры - приведи пример чего ты хотел получить, а то в ini нет подходящего

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 08:30 16-03-2010 | Исправлено: wolf0425, 10:37 16-03-2010
    mugil_cephalus

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

    Цитата:
    сильно подозреваю что у тебя у эта строка не заканчивается crlf

    да, добавил, все ок; мой то код работал и без crlf, а здесь - findstr /n $ берет "не то".
    bdvrt

    Цитата:
    А как правильно подключить CLIP.EXE, а то почему-то при открытии текст не вставляется??  

    см в комстроке - clip /?

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 10:08 16-03-2010
    sergij

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    24-26 позиция это :
     
    FIND /I "=ABBYY Lingvo" *.ini>024.txt  
    FIND /I "=PROMT" *.ini>025.txt  
    FIND /I "=ArchiCAD" *.ini>025a.txt  
    FIND /I "=AutoCAD" *.ini>026.txt  
    FIND /I "Autodesk AutoCAD LT 2006|Ключ продукта=" *.ini>026a.txt  
     
    sbs2.com - понадобится т.к надо будет выводить чистое значение ключей итд - но это уже пост -обработка...
     
    Но это неважно - важно что вы выдали столько идей - что щас буду разбираться в деталях дня 2
    Спасибо большое всем  wolf0425     king_stiven     mugil_cephalus

    Всего записей: 39 | Зарегистр. 14-03-2006 | Отправлено: 10:37 16-03-2010 | Исправлено: sergij, 10:52 16-03-2010
    wolf0425



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

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

    Цитата:
    sbs2.com - понадобится т.к надо будет выводить чистое значение ключей итд
    я же обошелся без него с первыми тремя значениями ключей, пока не вижу причин чтобы он и в дальнейшем понадобился.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 12:09 16-03-2010 | Исправлено: wolf0425, 12:33 16-03-2010
    sergij

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
     wolf0425
     
    Вот иники ещё - извините за задержку Работа понимаете
     

    Всего записей: 39 | Зарегистр. 14-03-2006 | Отправлено: 16:24 16-03-2010 | Исправлено: sergij, 23:44 19-03-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sergij мда, ну и мешанина же там...
     
    И все же отпишись - тебе в итоге то что надо получить?
    табличку для экселя или простыню в которой редактором шариться?
     
    держи вариант твоего батника - как ты его на самом деле хотел написать, но не смог.
    генерит out.csv - табличка для экселя.
    но вообще sbs2 и промежуточные файлы там лишние напрочь, выше я показывал как писать было правильно.
    причесанный вариант твоего батника

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 19:23 16-03-2010 | Исправлено: wolf0425, 19:34 16-03-2010
    mugil_cephalus

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

    Цитата:
    причесанный вариант твоего батника

    стив балмер нанимает команду писать исходники для win 6.2 на bat-файлах. примешь участие?

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 20:47 16-03-2010
    sergij

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Спасибо  конечно Большущее - даже подумать не успел и проверить работу всех Батников Конечно красивее и логичнее 1-й вариант
    но 2-й получше очистит    - а надо мне табличка в экселе  - я просто брал и вставлял out.txt в эксел ....     ну а потом поля растяну и раскрашу как надо  ..... а теперь мне и думать не надо всё уже в экселе --- нельзя же так --- я же отупею -- а я хочу как вы разобраться в Командах операндах переменных итд  а ещё -это же Искусство - такое вот придумать - раньше я смотрел на батники Hiren`s  как на предел мастерства а сейчас они кажутся мне простыми по сравнению с Вашими оригинальными решениями (1-й вариант особенно) .... вот не сочтите это за лесть - Но я просто в ударе - а точнее в нокауте
     
    Проверил 2-й отработал 40 мин  - 345 иников  проц 2-х ядер 1.6 гига - проверяю на ошибки - пока не нахожу - крайне
    удивлен и нет слов способных выразить вам мою Благодарность !!!  
     
     
    Сделал и по первому варианту - работает в 7.5 раза быстрее

    Всего записей: 39 | Зарегистр. 14-03-2006 | Отправлено: 21:23 16-03-2010 | Исправлено: sergij, 13:00 19-03-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