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

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

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

vu1tur (27-04-2007 11:55): продолжаем в теме «Задачи на bat-файлах 3»  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 16:59 14-11-2006 | Исправлено: Elroir, 04:30 26-04-2007
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igor_andreev
    Если честно, не разобрался я Не дорос еще до такого кода.
    Также подумал, что для той задачи подсчитать кол-во пробелов - не выход, т.к. слово может быть отделено и 2-мя и 3-мя и сколько хошь пробелами.
    Решил полностью задачу Ysan Надеюсь, она сюда заглянет. Знаю, что коряво - создает темповые файлы, допускает не более 26 слов в строке, опять же проблемы со спецсимволами (но тут похоже можно обойти - просто записывать слова в temp.txt в кавычках) и долго на больших файлах, но как умею
     

    Код:
    @echo off
    setlocal enabledelayedexpansion
     
    if "%~1"=="" (
       echo Не задан текстовый файл для анализа
       goto end)
     
    set file=%~1
     
    ::Выяснение кол-ва слов
    for /f "tokens=1-26 delims= " %%a in (%file%) do (
       (
       echo %%a
       echo %%b
       echo %%c
       echo %%d
       echo %%e
       echo %%f
       echo %%g
       echo %%h
       echo %%i
       echo %%j
       echo %%k
       echo %%l
       echo %%m
       echo %%n
       echo %%o
       echo %%p
       echo %%q
       echo %%r
       echo %%s
       echo %%t
       echo %%u
       echo %%v
       echo %%w
       echo %%x
       echo %%y
       echo %%z
       )>>temp.txt
    )
     
    findstr /r /v "Режим вывода команд на экран (ECHO) отключен." temp.txt>words.del
    del /q temp.txt
     
    set counter=0
    for /f "tokens=*" %%a in (words.del) do (
       set /a counter=!counter!+1)
     
    del /q words.del
    set words_quantity=%counter%
     
    ::Выяснение кол-ва строк
    ::Выяснение кол-ва непустых строк
    set counter=0
    for /f "tokens=*" %%a in (%file%) do (
       set /a counter=!counter!+1)
     
    ::Выяснение кол-ва пустых строк
    set count=0
    for /f "tokens=*" %%a in ('findstr /r /v /n "." %file%') do (
       set /a count=!count!+1)
     
    ::Выяснение общего кол-ва строк
    set /a line_quantity=%counter%+%count%
     
     
    ::Выяснение кол-ва символов
    ::Выяснение размера текстового файла
    for %%a in (%file%) do set /a "file_length=%%~za"
     
    ::Выяснение кол-ва непечатаемых символов в конце каждой строки
    set /a invisible_symbols=2*%line_quantity%
     
    ::Вычет невидимых символов от размера файла
    set /a symbols_quantity=%file_length%-%invisible_symbols%-1
     
    echo Всего символов (вместе с пробелами) в файле %file%: %symbols_quantity%
    echo Всего слов в файле %file%: %words_quantity%
    echo Всего строк в файле %file%: %line_quantity%
     
    :end

     
    Добавлено:
    Elroir

    Цитата:
    Кстати, откуда взялась цифра 4, которая отнимается от длины строки?

    Ну мы записываем строку в темповый файл с добавлением кавычек в начало и конец строки - чтоб не мучаться со спецсимволами - это 2 байта. Еще 2 байта - символы возврата каретки и перевода строки
     
    all Просьба покритиковать код

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 06:59 01-03-2007 | Исправлено: Tipulatoid, 07:28 01-03-2007
    NIKZZZZ



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

    Цитата:
    Задачка совсем не тривиальная. С количеством строк и символов проблем нет, а вот с количеством слов - огромные.

    Самое простое - передать строку другому батнику, а он посчитает к-во переданных аргументов (слов).
    ******************
    @echo off
    set /a n=0
    :_1
    if "%1"=="" goto _2
    set /a n=n+1
    echo %1
    shift
    goto _1
    :_2
    Echo   %n% words.
    pause
    ******************
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 10:57 01-03-2007
    Elroir



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

    Цитата:
    Самое простое - передать строку другому батнику, а он посчитает к-во переданных аргументов (слов).

    Все не так просто - допустим в переданной батнику строке есть два слова в кавычках:
    "один два". При этом они будут посчитаны не как 2 слова, а как одно. И снова повторю - если в строке есть спец. символы - будут проблемы.
     
    Tipulatoid
    Критикую:

    Цитата:
    допускает не более 26 слов в строке


     

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 19:06 01-03-2007 | Исправлено: Elroir, 19:07 01-03-2007
    drondo



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    не сработал батник. Тот где на сетевом диске найти новый файл и открыть его. после запуска в консоли пишет "не найден сетевой путь" или что то в этом роде.
    Пробовал слэши на бекслеши поменять перед server, результат такой же. Netbios работает, через проводник в эту папку заходит. Путь копировал из строки адреса в проводнике. Что еще может быть причиной?

    Всего записей: 461 | Зарегистр. 28-10-2005 | Отправлено: 20:46 01-03-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    drondo
    Я на самом деле не проверял как он работатет - просто вставил свою часть в код, который написал Tipulatoid.
    Вот так должно работать:

    Код:
     
    @echo off
    setlocal
    set "source=\\server\path to\network folder"  
    for /f "usebackq tokens=*" %%a in (`dir "%source%" /a-d /od /b /tc`) do set file_to_copy=%%a
    copy /y "%source%\%file_to_copy%" > nul
    start /b "" "%file_to_copy%"
     

     

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 01:29 02-03-2007
    vbugay



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    кто поможет я не силён в этом а ручками долго там лишь только  опечатка не в 7 строке а в 17 инн
    http://forum.ru-board.com/topic.cgi?forum=33&topic=8043&start=0#3

    Всего записей: 9 | Зарегистр. 01-03-2007 | Отправлено: 12:14 02-03-2007
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vbugay
    Стопудово поможет кто-нибудь , задача особой сложности не представляет ни для батника, ни для скрипта. Только ты бы привел для наглядности один типовой файл из этих пяти тысяч с 1-й по 18-ю строку. Еще нужно знать - свалены они в одной папке или и по подпапкам разбросаны(рекурсию применять или нет). И обрабатывать все подряд файлы *.* или с определенным расширением(может еще какие ненужные файлики в этой папке есть).
     
    Добавлено:
    Еще желательно(на всяк. случай) знать, какого плана названия у файликов, типа например 877_OOJU22.EXT или "Wow & гип-гип !! Жырик рулит(@).ext"

    Всего записей: 1705 | Зарегистр. 08-12-2004 | Отправлено: 12:54 02-03-2007
    jawAka

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    без обхода спецсимволов
     
    @echo off
    setlocal enabledelayedexpansion
    if exist иннren.txt del иннren.txt
    For %%b in (иннотчет*.txt) do (
        (set inn=)
        (set kname=)
        for /f "usebackq skip=16 tokens=*" %%a in ("%%b") do if "!inn!"=="" (set inn=%%a)
        for /f "usebackq skip=2 tokens=*" %%a in ("%%b") do if "!kname!"=="" (set kname=%%a)
        echo "%%b"{!inn!}!kname!>>иннren.txt
    )
    rem for /f "delims={} tokens=1,2,3" %%a in (иннren.txt) do ((if not exist "%%b\" md %%b) & copy %%a "%%b\*.*" )
     
     
    иннотчет*.txt - маска отчётов в текущей директории
    иннren.txt вспомогательный файл - посмотрите его, формат:"название файла"{ИНН}Наименование конторы
    Всё понравится - ремарку снимите в коде...  

    Всего записей: 6 | Зарегистр. 15-02-2007 | Отправлено: 14:23 02-03-2007
    kabolt



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    итак  
     
    задача такая. надо создать два батника, так, чтобы при запуске первого темп становился стандартным типа "c:\\temp", а при запуске второго, темп переназначался в другое место, например "s:\\temp" где s:\\- секретный раздел или флешка. делаецца это для того, чтобы при работе с отдельными приложениями, в винте ничего не кешировалось.
     
    я сделал обычный батник:
    mkdir c:\temp
    set TEMP c:\temp
    и аналогичный с диской "s:\\", но пока я физически не захожу в "переменные среды" в "моем компе" изменения не вступают в силу, а мне надо чтобы это работало оперативно...
     
    как быть?
     
    в идеале было бы сделать скрипт, который по событию (например отключению диска) тер бы темп ну и наоборот

    Всего записей: 74 | Зарегистр. 02-08-2006 | Отправлено: 15:16 02-03-2007
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kabolt
    Тебе нужны консольные SETX.EXE или SETENV.EXE или записывать в реестр в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment или в ветку для текущего юзера HKCU\Environment, и в зависимости от того, где-что изменил или  
    rundll32 user32.dll, UpdatePerUserSystemParameters
    или
    NIRCMDC.EXE sysrefresh environment
     
    Все *.exe гугль находит легко

    Всего записей: 1705 | Зарегистр. 08-12-2004 | Отправлено: 15:31 02-03-2007 | Исправлено: igor_andreev, 15:38 02-03-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kabolt
    Посмотри - http://forum.ru-board.com/topic.cgi?forum=62&topic=9040&start=660#17

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 16:06 02-03-2007
    kabolt



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Elroir
     
    спасибо. все получилось  
     
    Reg Add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" /v TEMP /t REG_SZ /d "s:\temp" /f
     
    Reg Add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" /v TMP /t REG_SZ /d "s:\temp" /f
     
    Reg Add "HKEY_CURRENT_USER\Environment" /v TMP /t REG_SZ /d "s:\temp" /f
     
    Reg Add "HKEY_CURRENT_USER\Environment" /v TEMP /t REG_SZ /d "s:\temp" /f

    Всего записей: 74 | Зарегистр. 02-08-2006 | Отправлено: 16:33 02-03-2007
    Ysan

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    сижу разбираюсь со своей задачкой по подсчету слов... Спасибо за помощь.
    А кто может подробно пояснить про назначение и применение  tokens и delims?

    Всего записей: 15 | Зарегистр. 27-02-2007 | Отправлено: 17:14 02-03-2007 | Исправлено: Ysan, 17:15 02-03-2007
    ViSiToR



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

    Цитата:
    кто может подробно пояснить про назначение и применение  tokens и delims?

    Справка    
     

    Цитата:
    delims=xxx  - определение набора разделителей для замены заданных по умолчанию пробела и знака табуляции.

     

    Цитата:
    tokens=x,y,m-n  - определение номеров подстрок, выделяемых из каждой
                      строки файла и передаваемых для выполнения в тело
                      цикла.  При использовании этого ключа создаются
                      дополнительные переменные.  Формат m-n представляет
                      собой диапазон подстрок с номерами от m по n.  Если
                      последний символ в строке tokens= является
                      звездочкой, создается дополнительная переменная,
                      значением которой будет весь оставшийся текст в
                      строке после обработки последней подстроки.


    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 18:19 02-03-2007 | Исправлено: ViSiToR, 18:21 02-03-2007
    drondo



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    спасибо огромное, все работает! Теперь гораздо проще новые приказы искать, точнее их вообще не надо искать!

    Всего записей: 461 | Зарегистр. 28-10-2005 | Отправлено: 20:18 02-03-2007
    cluster

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите поправить код
    Есть консольная утилитка, преобразующая файлы BMP в GPF. Её команда такая:

    Цитата:
    bmp2gpf.exe -n файл1.bmp имя_файла1_без_расширения файл2.bmp имя_файла2_без_расширения ...

    Меня даже устраивает по одному обрабатывать. Т.е.
    bmp2gpf.exe -n файл1.bmp имя_файла1_без_расширения
    bmp2gpf.exe -n файл2.bmp имя_файла2_без_расширения
    ...
     
    Код такой, но не работает:

    Код:
    @ECHO OFF
     
    FOR %%A IN (*.BMP) DO (
    CALL :NAME %%A
    CALL :START %%A
    )
    GOTO :EOF
     
    :START
    bmp2gpf -n %%A %name%
    GOTO :EOF
     
     
    :NAME
    FOR /F %%I IN ('dir *.BMP /B %%q') do set name=%%~ni
    GOTO :EOF

    Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 14:16 03-03-2007 | Исправлено: cluster, 17:08 03-03-2007
    Elroir



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

    Код:
     
    @echo off
    for %%a in (*.bmp) do (bmp2gpf.exe -n %%a %%~na)
     

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 14:24 03-03-2007
    cluster

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Ого! Оказывается всё так просто. Огромное спасибо.

    Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 17:09 03-03-2007
    CrackMe

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    нужно зделать срузу и много (ос - Виста, но в наличиии нет  - рабоать прдется в слепую):
    во превых жедательно определить запущен ли батник с правами админа, и сели нет сообщить о том , что это не допустимо.
    Во вторых надо остановить службу User Account Control
    я хочу сделать это так:
    [сode]net stop User Account Control[/code]
    в третьих:
    нужно установить драйвер (батник будет в той же папке , что и .inf от дров):
    [сode]rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 InstallDriver.inff1[/code]
    в четвертых:
     рестарт (вс дальнейшие действия можно в  принцип е поместить в отдельный батник, если оч. сложно начать выполнеиня батника с места рестарта)
    в пятых:
    ну типа надо прописать это:
    [сode]SLMGR.VBS -ilc текущая директория\ASUS.XRM-MS[/сode]
    шестое:
    ну это и я осилю
    Заранее спасибо
    P.S.
    предполагю, что потребуется создание перменной set current directory

    Всего записей: 711 | Зарегистр. 18-07-2006 | Отправлено: 18:13 04-03-2007 | Исправлено: CrackMe, 19:07 04-03-2007
    Utasc

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите!!!
    Мне нужно все "\" поменять на "\\\\"(в документе)

    Всего записей: 5 | Зарегистр. 04-03-2007 | Отправлено: 20:32 04-03-2007
       

    Страницы: 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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 2
    vu1tur (27-04-2007 11:55): продолжаем в теме «Задачи на bat-файлах 3»


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru