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

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



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

    Код:
     
    @Echo Off
    For %%a In (C:\Test\*.*) Do (
    If /I Not "%%~xa"==".DMF" (
     If /I Not "%%~xa"==".DMFr" Move "%%a" D:\MyFolder
     )
    )
     

    Если файлов очень много и батник работает долго, сообщи, придумаем другой вариант.
     
    Добавлено:
    Вот попробуй этот код, работает намного быстрее:

    Код:
     
    @Echo Off
    For /F "Delims=" %%a In (
    'Dir /B C:\Test ^| Findstr /I /V ".dmf\> .dmfr\>"') Do Move "C:\Test\%%a" "D:\MyDir"
     

    Пути (выделены жирным) заменишь на нужные тебе.

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 11:48 18-09-2007
    NIKZZZZ



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

    Цитата:
    И всё-таки, кто-нибудь может объяснить, почему через буфер обмена из окна командной строки русский текст нормально копируется в Блокнот, а то же самое через >file.txt в виде крякозябров? Тут в ANSI или UNICODE, а туда в ASCII? Почему? Мне,   , это очень странно.

    Да ничего странного. При копировании через буфер обмена из окна командной строки это происходит не используя Dos, а стандартными средствами Windows.
    "то же самое через >file.txt" - а в данном случае работает DOS. Причем, если прога работает в обход  DOS (не использует его стандартные прерывания), то никакие chcp 1251 и т.п. не помогут. Наиболее подходящее решение - применить внешний конвертор.
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 16:10 18-09-2007
    dSasha

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Да, я теперь *.txt открываю notepad++, им же конвертирую, но это лишний ручной труд, а "дядя Саша лёгких путей не ищет". А никакой утилитки просто конвертирующей кодировку нет?

    Всего записей: 30 | Зарегистр. 15-06-2007 | Отправлено: 16:43 18-09-2007
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dSasha
     
    На примере systeminfo могу предложить такое решение

    Код:
     
    @echo off
    systeminfo >1.tmp
    for /f "delims=" %%i in ('type 1.tmp') do set "line=%%i" && call:sub
    del 1.tmp
    goto:eof
    :sub
    chcp 1251 >nul
    echo %line% >>1.txt
    chcp 866 >nul
     

     
     
    Добавлено:

    Цитата:
    А никакой утилитки просто конвертирующей кодировку нет?

     
    Их много, рекомендую iconv.exe http://sourceforge.net/project/showfiles.php?group_id=25167

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 17:28 18-09-2007
    Lutvun



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka
    Второй код работает очень хорошо. Это не обезательно, но можна както сделать так, чтоб перемещялись  файлы с подпапок (если они еть) в месте с папками, а всё теже файлы *.DMF и *.DMFr оставались на своём месте.
    П.С. Спасибо огромное - очень помогли.

    Всего записей: 286 | Зарегистр. 22-11-2005 | Отправлено: 17:48 18-09-2007
    king_stiven

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

    Код:
    @echo off
    set out=D:\Test
    set in=E:\MyFolder
    cd /d "%out%"
    for %%a in ("%out%") do set buk=%%~da
    :begin
    set /a sum+=1
    if "%cd%" neq "%buk%\" (
        cd ..
        goto begin
    )
    set /a sum+=1
    setlocal enabledelayedexpansion
    set blok=!sum!
    setlocal DISABLEDELAYEDEXPANSION
    for /f "usebackq tokens=*" %%d in (`dir "%out%\*.*" /b /s /a:-d`) do (
        If /I Not "%%~xd"==".DMF" (
            If /I Not "%%~xd"==".DMFr" (
                for /f "tokens=%blok%* delims=\" %%e in ("%%~dpd") do set "way=%%e\%%f"
                set "way1=%%d"
                call :Moving
            )
        )
    )
    :Moving
    md "%in%\%way%"
    Move "%way1%" "%in%\%way%"

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 22:13 18-09-2007 | Исправлено: king_stiven, 22:20 18-09-2007
    dSasha

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

    Цитата:
    Их много, рекомендую iconv.exe http://sourceforge.net/project/showfiles.php?group_id=25167
    Вот Спасибо! Заработало.
     

    Всего записей: 30 | Зарегистр. 15-06-2007 | Отправлено: 02:56 19-09-2007
    Lutvun



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

    Всего записей: 286 | Зарегистр. 22-11-2005 | Отправлено: 08:21 19-09-2007
    dardreams



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Людииии помогите решить задачку!!!
    простая такая задачка )))
    Пример:
    Есть дата например 23.02.2007
    нужно сделать чтобы батник высчитывал количество лет, месяцев ,дней, часов, минут, секунд (если можно и недель;)) до сегодняшней ...
    Примерно такой ответ должен получиться __

    Код:
     
    x лет xx месяцев ххх дней хххх часов ххххх минут хххххх секунд
     

    Я думаю это не сложно, но сам не могу (((

    Всего записей: 100 | Зарегистр. 29-05-2007 | Отправлено: 10:00 19-09-2007
    KapralBel



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    dardreams
    Это на батнике достаточно сложно, что бы предложить решение на других языках (WSH, PowerShell, C++, Delphi)
     
    Добавлено:
    Надо учесть различие в количестве дней в месяцах, високосный/невисокосный год, о что батник очень обижается на числа 08 и 09 и т.д.

    Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 10:11 19-09-2007
    dardreams



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    KapralBel
    Но ведь это возможно .. неужели никому не интересно ?

    Всего записей: 100 | Зарегистр. 29-05-2007 | Отправлено: 10:58 19-09-2007
    KapralBel



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    dardreams
    Лично я выбираю наиболее удобный инструмент для задачи
    на PowerShell это займет 2-3 строки

    Код:
     
    $dtCurrent = Get-Date
    $dtPrev = $dtCurrent.AddDays(-53)
    $dtPrev = $dtPrev.AddHours(-1)
    "различие между датами: " +($dtCurrent-$dtPrev).Days+" дней и   "+($dtCurrent-$dtPrev).Hours+ часов"
     

     
    А на батнике попробуй вычислить самую простую задачу - предыдущий день, в шапке есть готовое решение  
     
    ЗЫ. Да и времени не будет на такую задачу  
    Делай сам заодно и батнички изучишь, а мы тебе будем по мелочи подсказывать, но не целиком такое писать

    Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 11:19 19-09-2007
    paveltr



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Маленький вопрос. Команда chkdsk c: /f для томов с файловой системой NTFS требует нажатия кнопки Y (подтвердить проверку при следующей загрузке компа). Можно ли как-то автоматом эту Y команде передать?

    Всего записей: 18 | Зарегистр. 01-04-2006 | Отправлено: 11:30 19-09-2007
    vserd

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dardreams
    Можешь воспользоваться моим батником для перевода даты в число (http://forum.ru-board.com/topic.cgi?forum=62&topic=11825&start=0#20), затем вычитаешь, затем нужно будет это число переводить в нужный тебе формат.
    Т.к. это довольно большое время на написание, пиши сам. Спасение утопающего, дело самого утопающего. А тут тебе помогут.
     
     
    Добавлено:
    paveltr
    попробуй так
    chkdsk c: /f <y.txt
    y.txt выглядит так. <Enter> это клавиша
    Y <Enter>

    Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 11:31 19-09-2007
    01MDM



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

    Код:
     
    @ECHO OFF
     
    set /p OLD_DATE="Введите дату в формате dd.mm.YY (01.01.2001): "
     
    :: DATES
    for /f "tokens=1-3 delims=." %%i in ('echo %OLD_DATE%') do (
        set OLD_D=%%i
        set OLD_M=%%j
        set OLD_Y=%%k
        )
     
    if %OLD_D:~0,1% equ 0 (set OLD_D=%OLD_D:~1%)
    if %OLD_M:~0,1% equ 0 (set OLD_M=%OLD_M:~1%)
     
    for /f "tokens=1-3 delims=." %%i in ('echo %DATE%') do (
        set CUR_D=%%i
        set CUR_M=%%j
        set CUR_Y=%%k
        )
     
    if %CUR_D:~0,1% equ 0 (set CUR_D=%CUR_D:~1%)
    if %CUR_M:~0,1% equ 0 (set CUR_M=%CUR_M:~1%)
     
    :: YEAR
    set /a RES_Y=%CUR_Y%-%OLD_Y%
     
    :: MONTH
    set /a RES_M=%CUR_M%-%OLD_M%
    call:CHECK_M
     
    :: DAY
    set /a RES_D=%CUR_D%-%OLD_D%
    if %RES_D% lss 0 (
        if %CUR_M% equ 1  (set /a RES_D+=31)
        if %CUR_M% equ 2  (set /a RES_D+=31)
        if %CUR_M% equ 3  (
            call:LEAP
            set /a RES_D+=%LEAP%)
        if %CUR_M% equ 4  (set /a RES_D+=31)
        if %CUR_M% equ 5  (set /a RES_D+=30)
        if %CUR_M% equ 6  (set /a RES_D+=31)
        if %CUR_M% equ 7  (set /a RES_D+=30)
        if %CUR_M% equ 8  (set /a RES_D+=31)
        if %CUR_M% equ 9  (set /a RES_D+=31)
        if %CUR_M% equ 10 (set /a RES_D+=30)
        if %CUR_M% equ 11 (set /a RES_D+=31)
        if %CUR_M% equ 12 (set /a RES_D+=30)
        set /a RES_M-=1
        call:CHECK_M
        )
     
    :: RESULT
    echo age is:
    echo %RES_Y% лет, %RES_M% мес, %RES_D% дней
    goto:EOF
     
    :LEAP
    set /a LEAP_Y=%CUR_Y/4*4
    if %CUR_Y% equ %LEAP_Y% (
        set LEAP=29
        ) else (
        set LEAP=28
        )
    goto:EOF
     
    :CHECK_M
    if %RES_M% lss 0 (
        set /a RES_M+=12
        set /a RES_Y-=1
        )
     
    ::
    :: EOF
    ::
     

     
     
    Добавлено:
    Когда-то делал для подсчета возраста операционной системы с момента инсталляции, немного изменил для подсчета произвольной даты

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 11:39 19-09-2007
    GORA2



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

    Цитата:
    Есть дата например 23.02.2007  
    нужно сделать чтобы батник высчитывал количество лет, месяцев ,дней, часов, минут, секунд  
    А откуда должны взяться часы, минуты и секунды если есть начальная только дата без времени? И какой у Вас в системе формат даты и времени предполагается?

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 13:45 19-09-2007
    Maza Faka



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

    Цитата:
    Некатит. Просто виснит и всё.

    Попробуй так:

    Код:
     
    @Echo Off
     
    Set InDir=C:\Test
    Set OutDir=D:\MyDir
     
    For /F "Delims=" %%a In (
    'Dir /B %InDir% ^| Findstr /I /V ".dmf\> .dmfr\>"') Do (
    If Exist %InDir%\%%a\nul (
     Xcopy /s /e /i /y "%InDir%\%%a" "%OutDir%\%%a"> nul 2>&1
     rd /s /q "%InDir%\%%a"
     ) Else (
        move "%InDir%\%%a" "%OutDir%"
        )
     )
     

    Пути заменишь на свои.

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 15:18 19-09-2007
    paveltr



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

    Цитата:
    попробуй так  
    chkdsk c: /f <y.txt  
    y.txt выглядит так. <Enter> это клавиша  
    Y <Enter>

    Спасибо, работает!

    Всего записей: 18 | Зарегистр. 01-04-2006 | Отправлено: 16:40 19-09-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    paveltr
    Можно проще, без доп. файлов:

    Код:
     
    Echo Y | Chkdsk c: /f /r
     

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 17:03 19-09-2007
    paveltr



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ещё красивше! Спасибо!!

    Всего записей: 18 | Зарегистр. 01-04-2006 | Отправлено: 17:25 19-09-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