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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    tommak
    В общем на страх и риск, что будут удалены папки с похожими названиями, Осторожно!

    Код:
     
    @echo off
    for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
        for /f "tokens=*" %%j in ('dir /b /s /a:d %%i:\ 2^>nul ^| findstr "\<%*\>"') do (
            echo "%%j"
                    rem rd /s /q "%%j"
        )
    )
     

    Сначала проверь, и если все нормально удали строку echo "%%j" и удали rem из следующей строки. Задавай одну папку для поиска
     
     
    Добавлено:
    xitsa
    Если в скрытых каталогах только скрытые файлы, то  

    Код:
     
    del /s /q /a:-h Root
     

    Если в скрытых каталогах есть не скрытые файлы, то

    Код:
     
    @echo off
    del /q "Root\*"
    for /f "tokens=*" %%i in ('dir /b /s /a:-hd "Root"') do call:inDelete "%%i"
    goto:eof
    :inDelete
    del /q "%1"
     

    т.е удаляет файлы, кроме тех что в скрытых каталогах  

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



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    01MDM
    Спасибо большое, впервые вижу вызов внутрь самого батника, тем более с параметрами

    Код:
    call:inDelete "%%i"


    Всего записей: 103 | Зарегистр. 25-04-2006 | Отправлено: 14:25 03-12-2007
    Estevan

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

    Цитата:
    Dieselman
     
    Цитата:
    1. На диске A надо скрыть файлы(ATTRIB +h) созданые после определённой даты(например 01.01.2000),дата задаётся с клавиатуры.
     
     
    Другая твоя задача идеально решается при помощи утилиты Forfiles Скачай ее и кинь в папку %windir%\system32
     
    Сам батник прост:
     
    Код:
    @echo off
    set date=%1
    forfiles -pa:\ -s -d+%date% -c"CMD /C attrib +h @FILE"
     
     
    Батник запускается с параметром - датой. Формат даты ddmmyyyy Например 01012000

     
    Ребята появилась нужда в таком же батнике,но нужна реализация без всяких утилит,а стандартными средствами.Буду очень благодарен.

    Всего записей: 4 | Зарегистр. 03-12-2007 | Отправлено: 15:05 03-12-2007
    xitsa



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    01MDM
    Протестировал батник более тщательно, удаляет файлы в нескрытых подкаталогах скрытых каталогов.
    Но благодаря твоей наводке составил такой вариант, каталог указывается параметром:

    Код:
     
    @echo off
    rem %1 Получает на вход имя Root
    :inDelete
    echo Deleting files in %1
    pushd %1
    del /q "*"
    for /f "tokens=*" %%i in ('dir /b /a:-hd "*"') do (
    call:inDelete %%i
    )
    popd
     

    Никогда не думал, что в батнике возможна рекурсия

    Всего записей: 103 | Зарегистр. 25-04-2006 | Отправлено: 15:17 03-12-2007
    SapSat

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

    Цитата:
    Никогда не думал, что в батнике возможна рекурсия  

     
    Да, прикольно...
     
    Теперь давайте факториал на рекурсии реализуем в батнике.
     
    У кого есть идеи?
     
    ?

    Всего записей: 32 | Зарегистр. 27-11-2007 | Отправлено: 16:05 03-12-2007
    Tipulatoid



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

    Цитата:
    Теперь давайте факториал на рекурсии реализуем в батнике.

    Тут и далее по топику вопрос с факториалом разжеван Elroir до костей

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 16:36 03-12-2007 | Исправлено: Tipulatoid, 16:40 03-12-2007
    01MDM



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

    Код:
     
    @echo off
     
    set /p dayAge="Enter Date (01.01.2007): "  
     
    set checkdate=%date%
    call:isDate
    set this=%yd%
     
    for /f "tokens=*" %%i in ('dir /b /s /a-d %1') do (
        set checkdate=%%~ti
        call:isDate
        call:findtoHide "%%~dpnxi"  
    )  
    goto:eof
     
    :isDate
    for /f "tokens=1-3 delims=." %%i in ("%checkdate:~0,10%") do (
        set year=%%k
        set /a lyear=%%k%%4
        set month=%%j
        set day=%%i
    )
     
    if  %lyear% equ 0 (
        echo 01 02 | findstr %month% >nul 2>&1 || set ld=1
    )
     
    if %day:~0,1% equ 0 set day=%day:~-1%
    if %month% equ 12 set /a yd=day+ld+334
    if %month% equ 11 set /a yd=day+ld+304
    if %month% equ 10 set /a yd=day+ld+273
    if %month% equ 09 set /a yd=day+ld+243
    if %month% equ 08 set /a yd=day+ld+212
    if %month% equ 07 set /a yd=day+ld+181
    if %month% equ 06 set /a yd=day+ld+151
    if %month% equ 05 set /a yd=day+ld+120
    if %month% equ 04 set /a yd=day+ld+90
    if %month% equ 03 set /a yd=day+ld+59
    if %month% equ 02 set /a yd=day+31
    if %month% equ 01 set /a yd=day
    goto:eof
     
    :findtoHide
    set /a toHide=this-yd
    if %toHide% leq %dayAge% echo %1
    :: if %toHie% leq %dayAge% attrib +h %1
     


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

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

    Всего записей: 6 | Зарегистр. 03-12-2007 | Отправлено: 19:53 03-12-2007
    king_stiven

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

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 20:26 03-12-2007 | Исправлено: king_stiven, 20:55 03-12-2007
    MegaSin

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени суток.
    Появилась проблема в модификации своего-же скрипта
    кусок кода:

    Код:
    @ECHO OFF&cls
    set mangos=127.0.0.1;3306;user;;mangos
    set realmd=127.0.0.1;3306;user;pass;realmd
    set chars=127.0.0.1;3306;user1;pass;chars
     
    setlocal ENABLEDELAYEDEXPANSION enableextensions
    for %%a in (mangos realmd chars) do (
        set basecfg=!%%a!&set basecfg=!basecfg:;;=;getpass;!&set basecfg=!basecfg:;=/!
        set param=%%a&set param=!param:~0,1!
        for /f "tokens=1-5 delims=/" %%i in ('echo !basecfg!') do (
            if "%%l"=="getpass" (set pass=)else set pass= -p%%l
             set !param!server=xz -h %%i -P%%j -u%%k!pass!
             set !param!scheck=xz -h %%i -P%%j -u%%k!pass!
             set !param!sdump=xz -h %%i -P%%j -u%%k!pass! %%m
        )
    )
    endlocal

    проблема: внутри local всё отлично отображается... а вот после строки endlocal уже не могу получить переменную, созданную внутри этого local
    "set" до строки  endlocal показывает все нужные переменные... а после уже нет
    Прошу подсказать в чем проблема и как её решить
    Заранее спасибо!

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MegaSin
    А если убрать endlocal? Если дальше есть продолжение? Setlocal - endlocal определяют область действия локальных переменных.

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    скрипт 2100 строк.... и где то нужен setlocal, где то нет... дальше этого куска кода строчек 500 наверно. это кусочек функции загрузки конфига
    в мануале написано следующее:

    Цитата:
    Начало локализации изменений среды в пакетном файле. Изменения среды, внесенные после выполнения команды SETLOCAL, являются локальными относительно текущего пакетного файла. Для восстановления их прежних значений необходимо выполнить команду ENDLOCAL.

    не пойму я что то....

    Всего записей: 25 | Зарегистр. 26-11-2006 | Отправлено: 22:02 03-12-2007 | Исправлено: MegaSin, 22:27 03-12-2007
    01MDM



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

    Код:
     
    @echo off
    set a=a
     
    setlocal
    set b=b
     
    echo %a% in
    echo %b% in
     
    call:next
    goto:next
     
    endlocal
     
    :next
    echo %a% in next
    echo %b% in next  
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 22:33 03-12-2007 | Исправлено: 01MDM, 22:38 03-12-2007
    Vladimir312



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

    Цитата:
    Vladimir312  
    Пусть путь E:\Video\ORIGIN\DVDCOM df\VIDEO_TS\  
     
    for /f "tokens=*" %%i in ("E:\Video\ORIGIN\DVDCOM df\VIDEO_TS") do set SHORT=%%~sfi  
    echo %SHORT%  

    Пардон, но ваш вариант выводить короткий путь не хочет
     
    E:\Video\ORIGIN\DVDCOM df\VIDEO_TS
     
    p.s.  
    А задавать полный путь каждый раз "вручную" ... не есть хорошо.
     
    рабочий вариант:

    Код:
    for /d %%i in ("%%~si") do (  
    set SHORT=%%~si  
    )  
    echo %SHORT%  

    работает "автоматом" (определяя каталог запуска),  
    только выводит имя переменной %~si  

    Всего записей: 151 | Зарегистр. 25-10-2006 | Отправлено: 22:42 03-12-2007 | Исправлено: Vladimir312, 17:58 04-12-2007
    king_stiven

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

    Код:
    @echo off
    chcp 1251 > nul
    set /p data=введите год месяц число
    for /f "usebackq tokens=1,2,3*" %%b in (`dir "A:\*.*" /t:c /s /a:-d`) do (
        if %%b%%c==Содержимоепапки set "folder=%%d %%e"
        for /f "tokens=1,2,3 delims=." %%f in ("%%b") do (
            if %%h%%g%%f GEQ %data% (
                set "file=%%e"
                call :end
            )
        )
    )
    goto :eof
    :end
    attrib +h "%folder%\%file%" > nul

     
    вариант2

    Код:
    @echo off
    chcp 1251 > nul
    set /p data=Enter year month number
    for /r A:\ %%a in (.) do (
        for /f "usebackq tokens=1,2,3,5* delims=., " %%c in (`dir "%%a\*.*" /t:c /o:-d /a:-d`) do (
            if %%e%%d%%c GEQ %data% attrib +h "%%a\%%g" > nul
        )
    )

     
    Содержимоепапки это для русской винды, обрати внимание на формат set data=20070101  год месяц число, можно переделать, чтобы вводить число месяц год .В каком формате показывает команда dir дату? Есть ещё вариант, должен работать быстрее, если в каждом каталоге много файлов, а старше определённой даты -мапо.
    Vladimir312
    У меня работает. Попробуй %%~si вместо %%~sfi или приведи полный текст батника.
     

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 22:52 03-12-2007 | Исправлено: king_stiven, 00:45 04-12-2007
    MegaSin

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    уважаемый, вы гений!!!

    Код:
    @ECHO OFF&cls
    set mangos=127.0.0.1;3306;user;;mangos
    set realmd=127.0.0.1;3306;user;pass;realmd
    set chars=127.0.0.1;3306;user1;pass;chars
     
    setlocal ENABLEDELAYEDEXPANSION
    for %%a in (mangos realmd chars) do (
        set basecfg=!%%a!&set basecfg=!basecfg:;;=;getpass;!&set basecfg=!basecfg:;=/!
        set param=%%a&set param=!param:~0,1!
        for /f "tokens=1-5 delims=/" %%i in ('echo !basecfg!') do (
            if "%%l"=="getpass" (set pass=)else set pass= -p%%l
             set !param!server=xz -h %%i -P%%j -u%%k!pass!
             set !param!scheck=xz -h %%i -P%%j -u%%k!pass!
             set !param!sdump=xz -h %%i -P%%j -u%%k!pass! %%m
        )
    )
    goto :next
    endlocal
     
    :next
    echo mserver = %mserver%
    echo rserver = %rserver%
    echo cserver = %cserver%

    всё отлично отображается, причом остались только нужные переменные! большое спасибо!

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



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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Vladimir312
    Чтобы определить каталог запуска батника (плюс вывести его короткий путь), вовсе не надо использовать for.
    Можно так:

    Код:
     
    echo %~dps0
     



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

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

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

    Цитата:
     
    SapSat  

    Цитата:
    Теперь давайте факториал на рекурсии реализуем в батнике.  

     
    Тут и далее по топику вопрос с факториалом разжеван Elroir до костей
     

     
    А теперь - до мозга костей : не смог не изобразить еще один вариант факториала на рекурсии:

    Код:
     
    @echo off  
    set /a f=1
    :Fact  
    set /a i=%1-1
    if %i% GTR 1 call:Fact %i%
    set /a f*=%1
    echo %f%
     

     
    Вызов: factorial.bat n
    где n - число от 1 до 12
     
    .

    Всего записей: 32 | Зарегистр. 27-11-2007 | Отправлено: 09:45 04-12-2007 | Исправлено: SapSat, 12:44 04-12-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Estevan  
    Самый быстрый вариант
     
    @echo off
    chcp 1251 > nul
    set /p data=Enter year month number
    for /r A:\ %%a in (.) do (
        set "d=%%a"
        call :yui
    )
    goto :eof
    :yui
    for /f "skip=5 usebackq tokens=1,2,3,5* delims=., " %%c in (`dir "%d%\*.*" /t:c /o:-d /a:-d`) do (
        if %%e%%d%%c GTR %data% (
            attrib +h "%%a\%%g" > nul
        ) else (
            goto hj
        )
    )
    :hj

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 10:03 04-12-2007 | Исправлено: king_stiven, 10:05 04-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