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

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

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

evle (19-03-2008 19:44): Лимит страниц.
Задачи на bat-файлах 5
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 15:21 11-09-2007 | Исправлено: Elroir, 01:52 26-02-2008
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    дано: папка, в ней подпапки(1) с неизвестными именами, в каждой - файл с известным именем и куча подпапок.
    надо найти подпапку(1) в которой этот файл модифицировался последним.
    делать вложенные for /d ... for и переставлять циферки в результате %~ti для сравнения через if - мне кажется слишком громоздким, хотя заведомо сработает и других идей пока нет.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 01:21 21-12-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
     
    Понял задачу так:
    В папке C:\ находятся папки
     
    1
    2
    3
    4
    5
    ...
     
    В этих паках есть или нет файлы file.ext
     
    1\file.ext
    2\file.ext
    3\file.ext
    4\2.txt
    5\file.ext
    ...
     
    а также в этих папках есть куча подпапок с большим количеством файлов, ненужных для обработки
     

    Код:
    @echo off
    set data1=0
    set data2=0
    for /f "tokens=*" %%a in ('dir /b /a:d') do (
        set "d=%cd%\%%a"
        call :yui
    )
    echo %papka%
    goto :eof
    :yui
    for %%b in ("%d%\file.ext") do (
        for /f "tokens=1,2,3,4,5 delims=.,:, " %%c in ("%%~tb") do (
            if %%e%%d GTR %data1% (
                set "papka=%d%"
                set "data1=%%e%%d"
                set "data2=%%c%%f%%g"
            )
            if "%%e%%d"=="%data1%" (
                if %%c%%f%%g GTR %data2% (
                    set "papka=%d%"
                    set "data1=%%e%%d"
                    set "data2=%%c%%f%%g"
                )
            )
            goto hj
        )
    )
    :hj

     
    У меня сработало за 0,05 секунд
     
    Добавлено:
    ещё быстрее
     
    @echo off
    set data1=0
    set data2=0
    for /d %%a in (*.*) do (
        for %%b in ("%%a\file.ext") do (
            for /f "tokens=1,2,3,4,5 delims=.,:, " %%c in ("%%~tb") do (
                set "d=%%a"
                call :yui %%e%%d%%c %%f%%g
            )
        )
    )
    echo %papka%
    goto :eof
    :yui
    if %1 GTR %data1% (
        set "papka=%d%"
        set "data1=%1"
        set "data2=%2"
    )
    if "%1"=="%data1%" (
        if %2 GTR %data2% (
            set "papka=%d%"
            set "data1=%1"
            set "data2=%2"
        )
    )

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 08:37 21-12-2007
    01MDM



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

    Код:
     
    @echo off
    setlocal
    for /d %%i in (*) do (
        pushd "%%i"
        for /f %%i in ('dir /b /ah file.ext') do set "file-%%~ti=%%~fi"
        popd
    )
    for /f "tokens=2,3 delims=-=" %%i in ('set file ^| sort /r') do echo %%j && goto:eof
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 10:11 21-12-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    последнее, от 01MDM - похоже в неадекватном порядке отсортирует: у %%~ti весьма неудобный формат.
     
    а у king_stiven - получилось наверно то, что мне так не хотелось писать. в обед проверю.
    А идея перетасовывать дату определив набор разделителей, а не просто позиционно - понравилась

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 11:18 21-12-2007 | Исправлено: wolf0425, 11:20 21-12-2007
    01MDM



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

    Цитата:
    похоже в неадекватном порядке отсортирует:

    Да, возможны ошибки, вот немного изменил

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    for /d %%i in (*) do (
        pushd "%%i"
        for /f %%i in ('dir /b /ah file.ext 2^>nul') do (
            for /f "tokens=1-5 delims=.: " %%1 in ("%%~ti") do set tc=%%3%%2%%1%%4%%5    
            set "file-!tc!=%%~fi"
        )
        popd
    )
    for /f "tokens=2,3 delims=-=" %%i in ('set file ^| sort /r') do echo %%j && goto:eof
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 12:31 21-12-2007 | Исправлено: 01MDM, 12:37 21-12-2007
    BasiL



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Опять нужна помощь с парсингом текста.
    Задача - пропарсить текст с восклицательным знаком внутри цикла с  включеным  
    setlocal enabledelayedexpansion
    Т.к. знак ! это вновь посчитаная переменная, то сама переменная не может содержать знака !
    Сначала у меня вообще строки с ! не парсились, т.к. обработчик считал что это переменная... и строки коверкались. Потому я для начала (перед setlocal enabledelayedexpansion) поместил код замены ! на #1#:

    Код:
    for /r %source% %%a in (*.h,*.c,*.cpp) do (
        echo %%a
        for /f "eol=/ delims=! tokens=1-6" %%b in ('"findstr /c:"LPGEN(" /c:"LPGENT(" /c:"TranslateT(" /c:"_T(" "%%a""') do (
            echo %%b#1#%%c#1#%%d#1#%%e>>%tempfile%
                            )
    )
     

     
    теперь восклицательные знаки не мешают парсить строки.
    Но дело в том, что нужные мне параметры тоже могут содержать "!".
    И как потом заменить #1# на "!" я никак не придумаю...
    т.к.
    Код:
        set out=!out:#1#==^!!
    не помгает.
    Вообще проескейпить восклицательный знак не получается...
     
     
    вообще этот батник я делаю для себя, чтобы переводить миранду. Он будет выдергивать из сырцов строки для перевода. Но вот с восклицательными знаками пока засада, я их либо теряю, либо теряю всю строку с восклицательным знаком. А их давольно много Полный листинг батника подкатом
    полный листинг батника
    пример исходных строчек для анализа:

    Код:
    _T( "asfsdfa ! asdaf | sdfdf > asdf < sdf && sdfdf") asdf
     
    LPGENT("None"),  LPGENT("None *"), ROLE_NONE, AFFILIATION_AD
     
    TranslateT("asdf \' asdf \' 1" ); _T( "asdf \"ddd\" 2"); LPGEN("asdf 3" ); LPGENT( "asdf 4" );

    надо получить на выходе:

    Код:
    [asfsdfa ! asdaf | sdfdf > asdf < sdf && sdfdf]
    [None]
    [None *]
    [asdf ' asdf ' 1]
    [asdf "ddd" 2]
    [asdf 3]
    [asdf 4]

    в целом, все работает... за исключением "!"

    Всего записей: 3247 | Зарегистр. 13-03-2004 | Отправлено: 13:21 21-12-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BasiL
     
    Я пользуюсь утилиткой replacer.exe, вот пример замены !
    replacer.exe SOURCE="нужный текст.txt" SEARCH="!" REPLACE="^!"

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 13:48 21-12-2007
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BasiL
    Я особо не вникал в суть скрипта, насколько я понял, он меняет знаки в строке?
    Если так, то пример, как заменить в файле все "!" на "%"

    Код:
     
    @echo off
    for /f "tokens=*" %%i in  ('type test.cmd') do (
        set "str=%%i"
        call:parse
    )
    goto:eof
     
    :parse
    set "str=%str:!=Ё%" && call:write
    goto:eof
     
    :write
    setlocal enabledelayedexpansion
    set "str=!str:Ё=%%!"
    echo !str!
     

    Т.е знак "!" нужно обрабатывать в области вне setlocal, а "%" наоборот

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 14:38 21-12-2007
    BasiL



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    да, кажется это должно сработать.. проверю, спасибо.
    king_stiven

    Цитата:
    Я пользуюсь утилиткой replacer.exe

    Понятно, что используюя стороннию утилитку можно значительно упросить процесс... Особенно, если использовать регулярные выражения.
    Но ради спортивного интереса и в целях самообразования хотелось бы получить вариант только с использованием средств системы (WinXP)
     
    Добавлено:
    01MDM

    Цитата:
    пример, как заменить в файле все "!" на "%"

    не подходит, т.к. токен может содержать символ пайпа  - | и символы перенаправления ввода вывода - > и <, или &
     
    смотри

    Цитата:
    пример исходных строчек для анализа:

    поэтому echo обламывается
    Да и set тоже...
    если только и эти знаки все менять...

    Всего записей: 3247 | Зарегистр. 13-03-2004 | Отправлено: 14:57 21-12-2007 | Исправлено: BasiL, 15:31 21-12-2007
    Wenzel



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Каким образом можно получить путь из полного имени файла?
    Скажем, есть переменная содержащая "C:\dir1\dir2\dir3\file.ext", надо отбросить file.ext.
    Причем имена могут быть любыми. Поискал - не нашел как сделать.
    Думал использовать %variable:~x,y% но вместо x и y не удается использовать переменные

    Всего записей: 587 | Зарегистр. 10-08-2004 | Отправлено: 21:13 22-12-2007
    king_stiven

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

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 21:39 22-12-2007
    SergPfor



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Wenzel
    Посмотрите "Использование пакетных параметров командной строки" в справке.

    Всего записей: 6 | Зарегистр. 28-03-2006 | Отправлено: 22:09 22-12-2007
    01MDM



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

    Код:
     
    @echo off
    set "var=C:\dir 1\dir 2\dir 3\file.ext"
    call:var "%var%"
    goto:eof
    :var
    echo %~dp1
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 22:51 22-12-2007
    Wenzel



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    SergPfor
    01MDM
    Спасибо, разобрался!
     
    01MDM

    Цитата:
    call:var "%var%"  
    goto:eof  
    :var  
    echo %~dp1  

    Очень интересная конструкция, запомню на будущее.

    Всего записей: 587 | Зарегистр. 10-08-2004 | Отправлено: 22:54 22-12-2007
    compi

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите кто. хочу батником обновлять программу.
     
    нашёл такой вот вариант на проверку версии программы
     
    reg query "HKLM\SOFTWARE\программа\CurrentVersion\Info" /ve ProductVersion
     
    мне нужно чтобы вывело на экран значение ProductVersion, без типа значения.  
    Т.е. по простому, хочу чтобы показало версию установленной ПРОГРАММЫ
    И при условии, что версия ПРОГРАММЫ 1.0.0 начать установку обновления, а при условии, что версия ПРОГРАММЫ 2.0.0  пропустить установку обновления

    Всего записей: 56 | Зарегистр. 18-12-2005 | Отправлено: 00:02 23-12-2007
    Elroir



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

    Код:
     
    @echo off
    setlocal
    for /f "skip=3 tokens=3" %%a in ('reg query "HKLM\SOFTWARE\программа\CurrentVersion\Info" /v ProductVersion') do  
    if "%%а"=="2.0.0" goto after
    :: Здесь установка обновления
    ...
    ...
     
    :after
    :: После обновления или при пропуске
    ...
    ...
     


    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 01:55 23-12-2007
    compi

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

    Код:
     
     @echo off
    setlocal
    for /f "skip=3 tokens=3" %%a in ('reg query "HKLM\SOFTWARE\main\program\CurrentVersion\Info" /v ProductVersion') DO if "%%а"=="3.0.000.0" goto after
    net use v: \\192.168.42.1\public\LAN
    ping -n 5 localhost > nul
    msiexec /package v:\setup
    GOTO after
    :after
    ping -n 5 localhost > nul
     

    Всего записей: 56 | Зарегистр. 18-12-2005 | Отправлено: 03:22 23-12-2007 | Исправлено: compi, 03:24 23-12-2007
    Elroir



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

    Код:
     
    reg query "HKLM\SOFTWARE\main\program\CurrentVersion\Info" /v ProductVersion
     

    Что выдает (полностью)?

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 03:33 23-12-2007
    compi

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

    Код:
         
    HKEY_LOCAL_MACHINE\SOFTWARE\main\program\CurrentVersion\Info
        ProductVersion    REG_SZ    3.0.000.0
     

    Всего записей: 56 | Зарегистр. 18-12-2005 | Отправлено: 03:38 23-12-2007 | Исправлено: compi, 03:40 23-12-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    compi
    ОК. Во первых, в моем коде, замени skip=3 на skip=4.
    Во вторых - ты же сравниваешь с "3.0.000.0", а у тебя там 3.0.566.0? Или я чего-то не понимаю?

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 03:43 23-12-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 101 102 103

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 4
    evle (19-03-2008 19:44): Лимит страниц.
    Задачи на bat-файлах 5


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru