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

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



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

    Цитата:
    Вот новая ссылка... проверил.

    Спасибо. Действительно очень удобно получилось - всем советую скачать (27.2 kb), это намного лучше просматривать справку в таком виде, чем в консольном окне (и по необходимости можно скопировать нужную инфу).
     

    Цитата:
    Есть ли способ включить кодировку?

    CHCP 1251 должно помочь.

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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 23:01 23-01-2007
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ну не знаю - по мне так в виде предложенном Jon_Dow удобнее... Опять же поиск в FAR рулит, копирование без вопросов, открытие нескольких файлов с переключением между нини тоже влегкую...
    И главное - одна строка на все про все - я ее даже воспроизвести по памяти уже почти могу
    Но конечно ежли сравнивать с чиcтой консолью то таки да удобнее

    ----------
    sic transit gloria mundi

    Всего записей: 2710 | Зарегистр. 15-12-2003 | Отправлено: 23:11 23-01-2007
    MMCDion

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, какую команду надо написать в батнике, чтобы выполнить сетевое подключение?
    Подключение ADSL по локальной сети.
    По прикреплённой вверху ссылке "Запуск сетевого подключения" не получается.
    Или может есть возможность запустить ярлык на рабочем столе через bat-файл.
    Путь до ярлыка что-то типа C:\DOCUME~1\0016~1\KRASNE~1.LNK
    Если этот путь вводишь в командной строке, то всё ОК, соединение подключается, а через батник не получается...

    Всего записей: 1 | Зарегистр. 24-01-2007 | Отправлено: 08:07 24-01-2007 | Исправлено: MMCDion, 08:13 24-01-2007
    regular



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет!
    Интересная задачка появилась.
    Есть текстовый файл. Как все буквы перевести в верхний регистр?

    Всего записей: 27 | Зарегистр. 02-11-2004 | Отправлено: 13:01 24-01-2007
    Elroir



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

    Цитата:
    Интересная задачка появилась.

    Для кого интересная?

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    del /q tmp_rep.txt 2>nul
    FOR /f "tokens=*" %%a IN (test.txt) DO (
    SET string=%%a
    SET string=!string:q=Q!
    SET string=!string:w=W!
    SET string=!string:e=E!
    SET string=!string:r=R!
    SET string=!string:t=T!
    SET string=!string:y=Y!
    SET string=!string:u=U!
    SET string=!string:i=I!
    SET string=!string:o=O!
    SET string=!string:p=P!
    SET string=!string:a=A!
    SET string=!string:s=S!
    SET string=!string:d=D!
    SET string=!string:f=F!
    SET string=!string:g=G!
    SET string=!string:h=H!
    SET string=!string:j=J!
    SET string=!string:k=K!
    SET string=!string:l=L!
    SET string=!string:z=Z!
    SET string=!string:x=X!
    SET string=!string:c=C!
    SET string=!string:v=V!
    SET string=!string:b=B!
    SET string=!string:n=N!
    SET string=!string:m=M!
     
    echo !string!>>tmp_rep.txt
    )
    rem del /q test.txt
    rem ren tmp_rep.txt test.txt  
     

    Вместо test.txt, подставляешь имя нужного тебе файла.
    Ограничения:
    1. Батник работает только с английским языком.
    2. Батник удаляет все пустые строчки из файла.
    3. Если в тексте содержатся специальные символы (&,|,..), то во время работы произойдет ошибка - с различными возможными последствиями.

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Задача. Программа создает папки в виде текущей даты DDMMYYYY. Внутри этой папки есть некоторая жестко заданная иерархия папок. Внутри одной из них регулярно создаются файлы. Нужно, просмотреть структуру папок, сравнить с текущей датой, и из одной папки скопировать самый свежий файл.

    Всего записей: 29 | Зарегистр. 11-09-2003 | Отправлено: 14:51 24-01-2007
    Elroir



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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 15:27 24-01-2007
    evgeni666



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

    Цитата:
     
    @echo off
    for /f "skip=2 tokens=2*" %%i in ('reg QUERY "HKCU\Control Panel\International" /v sDate') do set sdate=%%j
    for /f "delims=%sdate% tokens=1,2,3" %%i in ("%DATE%") do call :getpackage %%i %%j %%k
     
    :: проверочка
    echo %year%
    echo %month%
    echo %day%
    echo %package%
     
     
    :: тут можно поместить необходимые нам команды
     
    goto :EOF
     
    :getpackage
    set day=%1
    set month=%2
    set /a year=%3
    set lastdays="31 28 31 30 31 30 31 31 30 31 30 31"
    if %day% leq 9 set /a day=%day:~-1%
    if %month% leq 9 set /a month=%month:~-1%
    set /a day-=1
    if "%day%"=="0" set /a month-=1
    if "%month%"=="0" set /a month=12,year-=1
    set /a isleap="(year%%4)&((year%%100)|(year%%400))"
    if "%isleap%"=="0" set lastdays=%lastdays:28=29%
    if "%day%"=="0" for /f "tokens=%month%" %%i in (%lastdays%) do set day=%%i
    if %day% leq 9 set day=0%day%
    if %month% leq 9 set month=0%month%
    set package=%year%-%month%-%day%
    goto :EOF
     
     

    Всего записей: 367 | Зарегистр. 22-12-2005 | Отправлено: 16:56 24-01-2007 | Исправлено: evgeni666, 09:59 25-01-2007
    Elroir



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

    Цитата:
    Также он не зависит от используемого в системе представления даты.

    Зависит, зависит. Попробуй запустить его, когда системная дата выглядит так - Wed 24.01.07. Или когда месяц идет перед числом - 01.24.07 (что в западных странах происходит довольно часто).

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 19:10 24-01-2007
    yurkesha



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

    ----------
    sic transit gloria mundi

    Всего записей: 2710 | Зарегистр. 15-12-2003 | Отправлено: 21:09 24-01-2007 | Исправлено: yurkesha, 21:10 24-01-2007
    Orm

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Легко. Прога создает, как я уже писал, папки с именем DDMMYYYY. Т.е. сегодня это уже 25012007, внутри две папки IN и OUT. В OUT периодически появляется файлы вида 1xxxxxx.01, 1xxxxxx.02, 1xxxxxx.03. Нужно чтобы раз в пять минут сканировала папку соответствующей сегодняшней дате, и из папки OUT копировала файл с последней датой создания. Курил в сторону nnbackup, но пока не еще не раскурил...

    Всего записей: 29 | Зарегистр. 11-09-2003 | Отправлено: 01:24 25-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Orm
    Вот теперь понятно. Еще вопрос - каков формат системной даты, т.е. что выдает команда "echo %date%" ?

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 09:42 25-01-2007
    evgeni666



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Уговорил. Зависит. Поправил текст своего сообщения.
     
    Надо покумекать, как получать дату в таком разе...

    Всего записей: 367 | Зарегистр. 22-12-2005 | Отправлено: 10:01 25-01-2007 | Исправлено: evgeni666, 10:06 25-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    evgeni666
    Я пытаюсь придумать, как бы анализировать системную дату и уже основываясь на этой информации строить код. Способ изменения реестра, который предложил yurkesha, использовать не хочется (да и не всегда есть права на запись в реестр). Идеи?

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 10:08 25-01-2007
    Orm

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    echo %date%
    25.01.2007

    Всего записей: 29 | Зарегистр. 11-09-2003 | Отправлено: 10:18 25-01-2007 | Исправлено: Orm, 11:08 25-01-2007
    IGorAS

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    а можно решить такую задачу:
    пинговать все машины в одной сети, с параметром -т, каждые полчаса записывать показания пингов в лог-файл, не удаляя предыдущие записи.
    Если можно то создавать лог файл отдельно для каждого компа, а имя файла должно соответствовать ip адресу машины.  Я понимаю идея бредовая, но вдруг???

    Всего записей: 2 | Зарегистр. 24-01-2007 | Отправлено: 10:42 25-01-2007
    evgeni666



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Можно получить формат даты, по которому формируется вывод

    Цитата:
     
    for /f "skip=2 tokens=2*" %%i in ('reg QUERY "HKCU\Control Panel\International" /v sDate') do set sdate=%%j  
    for /f "skip=2 tokens=2*" %%i in ('reg QUERY "HKCU\Control Panel\International" /v sShortDate') do set sshortdate=%%j  
    for /f "delims=%sdate% tokens=1,2,3" %%i in ("%sShortDate%") do echo %%i %%j %%k
     

     
    теперь можно формат разбирать.
    но я не могу найти, где хранится, выводить день недели или нет. на компе, который выводит день недели, формат короткой даты такой же, как и на том, который не выводит.
     
    Добавлено:
    IGorAS
    а просто пинговать раз в полчаса не катит?

    Всего записей: 367 | Зарегистр. 22-12-2005 | Отправлено: 11:02 25-01-2007 | Исправлено: evgeni666, 11:04 25-01-2007
    Elroir



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

    Код:
     
    @echo off
    setlocal
     
    :: Path where the date folders are
    set work_in_path=c:\temp\
    :: Path for copy
    set copy_to_path=c:\temp\
     
    :copy
    :: Setting work folder
    set work_folder=%date:.=%
     
    :: Change directory to DATE\out folder. If not exists wait
    pushd %work_in_path%%work_folder%\out 2>nul
    if %errorlevel%==1 goto nofolder
     
    :: Finding the name of the file with last creation date
    for /f "usebackq tokens=1" %%a in (`"dir /a-d /od /tc /b"`) do set fname=%%a
     
    :: Copying the file
    copy /y "%fname%" "%copy_to_path%">nul
    popd
     
    :wait
    ::Waiting 5 minutes
    ping -n 300 -w 1000 127.0.0.1>nul
    goto copy
     
    :nofolder
    echo Working folder is not found. Waiting...  
    goto wait
     

    Выделенные пути заменить на свои.
     
    evgeni666

    Цитата:
    но я не могу найти, где хранится, выводить день недели или нет. на компе, который выводит день недели, формат короткой даты такой же, как и на том, который не выводит.

    Это можно проверить не через реестр, а сразу по выводу %date%:

    Код:
     
    set show_day_of_week=yes
    for /f "tokens=1,2" %%a in ("%date%") do (
    if "%%b"=="" set show_day_of_week=no
    )
    echo Show day of week? %show_day_of_week%
     


    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 11:24 25-01-2007 | Исправлено: Elroir, 11:24 25-01-2007
    igor_andreev

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

    Цитата:
    Я пытаюсь придумать, как бы анализировать системную дату и уже основываясь на этой информации строить код.

    А я же написал такой батник(zip, 1Kb) тут на форуме, ты не видел? Кода многовато, но в большинстве случаев(процентов 98 основных форматов даты) на 2000/XP/2003 выведет правильно день-месяц-год.

    Всего записей: 1668 | Зарегистр. 08-12-2004 | Отправлено: 11:35 25-01-2007
    Elroir



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

    Цитата:
    А я же написал такой батник(zip, 1Kb) тут на форуме, ты не видел?

    Ты знаешь, видел, но забыл.
    Это было в начале первой части топика, а я тогда еще не следил за "развитием событий" . Я потом просматривал сначала, но не разбирал код.
     
    Добавлено:
    Красивый батник!

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 11:49 25-01-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.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru