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

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

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

vu1tur (04-11-2008 23:07): Задачи на bat-файлах 6  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

Nagual



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

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
 
Для перекодирования кирилицы 866<<>>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы

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

  • Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 12:28 19-03-2008 | Исправлено: Nagual, 01:02 24-09-2008
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RMR
    А такие варианты устроят? С временем:

    Код:
     
    @echo off
    pushd Z:\PictureFolder
    set ext=*.cmd *.jpg *.gif *.png *.tiff *.bmp
    for /f "tokens=*" %%i in ('dir /b /s %ext%') do (
        echo %%~ti %%~nxi
    )
    popd
    pause
     

     
    И без времени (только дата):

    Код:
     
    @echo off
    pushd Z:\PictureFolder
    set ext=*.cmd *.jpg *.gif *.png *.tiff *.bmp
    for /f "tokens=*" %%i in ('dir /b /s %ext%') do (
        for /f "tokens=1" %%j in ("%%~ti") do (
            echo %%j %%~nxi
        )
    )
    popd
    pause
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 14:24 01-08-2008
    RMR

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM Спасибо. Не знал про %%~ti. Вот что получилось:

    Код:
    @echo off
    title Copy by Date
    set ext="*.cmd" "*.jpg" "*.gif" "*.png" "*.tiff" "*.bmp"
    for %%i in (%ext%) do (
    for /f "tokens=1 delims= " %%j in ("%%~ti") do (
        echo Копирование файла %%i в \%%j
        echo F | xcopy /y "%%~i" "%%j\%%~nxi" >nul
        if errorlevel 1 call :error "%%i"
        )
    )
    pause
    goto :eof
     
    :error
    echo Ошибка при копировании файла %1
    goto :eof

    Надеюсь нет ошибок.
    Но все-таки интересно почему в первом варианте получался такой результат

    Всего записей: 32 | Зарегистр. 23-11-2006 | Отправлено: 15:00 01-08-2008
    dimchik2002



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день всем!
     
    Проконсультируйте, пожалуйста, по поводу написания батника.
     
    Задача: в директории имеется n файлов. необходимо вычислить последний файл, который был создан в этой директории и скопировать его в другую директорию.
     
    с помощью команды DIR я создал список файлов в файле filelist.txt. Искомый файл на первой строке находится. Применяются атрибуты:
    - обратная сортировка по дате создания файла
    - выводить только файлы.
     
    dir /O:-D /B "путь_к_директории_с_файлами" > filelist.txt
     
    необходимо, что батник вытащил из файла первую строку и запомнил ее в переменной (например %filename%) и далее подставил в путь для копирования.
     
    xcopy "путь_к_директории_с_файлами\%filename%" c:\arhive
     
    Заранее прошу прощения, если повторяю чьи-то вопросы... Просто срочно надо...

    Всего записей: 34 | Зарегистр. 14-11-2005 | Отправлено: 17:53 01-08-2008
    king_stiven

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

    Цитата:
    Задача: в директории имеется n файлов. необходимо вычислить последний файл, который был создан в этой директории и скопировать его в другую директорию.


    Код:
    for /f "tokens=*" %%c in ('DIR "путь_к_директории_с_файлами" /B /T:C /O:-D /A:-D') do (
        xcopy "путь_к_директории_с_файлами\%%c" c:\arhive
        goto :eof
    )

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 18:31 01-08-2008 | Исправлено: king_stiven, 18:34 01-08-2008
    VitRom

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir, спасибо за совет по проблеме с переменными внутри for /f. Такого варианта присвоения я не знал, иногда он оказывается полезен. Хотя в том конкретном случае даже этот способ всё равно не помог и решение оказалось другим (ниже).
     
    Возможно, кому-нибудь ещё пригодится, поэтому вкратце опишу задачу и решение.


    Задача:
     
    Выделить командой for /f часть результата работы команды с аргументами.
    Код:
    FOR /f  "<options>" %%V in ('<program> <argument> <some file>') do <process %%V>

    Аргументы могут быть переменными среды.
    Код:
    FOR /f  "<options>" %%V in ( '<program> <argument> <some variable>' ) do <process %%V>

    Нужно обеспечить работу при запуске батника из любого места, в т.ч. из UNC пути, в т.ч. с пробелами.
     
    Решение:
     
    Полный путь программы задаётся в переменной так:
    Код:
    SET "command=<Program path>"

     
    Весь вызов команды внутри одиночных кавычек "оборачивается" в круглые скобки, записываемые с эскейпами "^" (см. Виндовый хелп по команде echo)

    Код:
    FOR /f  "<options>" %%V in ( ' ^( "%command%" <argument> "%some_file_var%" ^) ' ) do <process %%V>

    Всего записей: 2967 | Зарегистр. 18-06-2006 | Отправлено: 13:05 03-08-2008 | Исправлено: VitRom, 13:11 03-08-2008
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    где-то было давно и не раз, но уже искать нет времени
    у кого под рукой, может выложит
    есть команда и список файлов
    надо взять из списка две строки и привести к виду:
    команда параметр1 параметр2

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 15:28 03-08-2008 | Исправлено: Nagual, 15:29 03-08-2008
    dimchik2002



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
     
    Большое спасибо!
     
    Единственное, что пришлось сменить имя goto :eof на другое, например :_ffiles
    А то в дальнейшем все команды, которые я писал, игнорировались...

    Всего записей: 34 | Зарегистр. 14-11-2005 | Отправлено: 14:08 04-08-2008
    lamener

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

    Код:
     
    @echo off
    cd /d "D:\folder"
    if exist 1.wmv (
    for /f "tokens=2 delims=: " %%a in ('D:\Setups\MediaInfo_0.7.7.4_CLI_Win32\mediainfo 1.wmv ^| find "Width"') do set file_width=%%a
    for /f "tokens=2 delims=: " %%a in ('D:\Setups\MediaInfo_0.7.7.4_CLI_Win32\mediainfo 1.wmv ^| find "Height"') do set file_height=%%a
    echo %file_width%x%file_height%
    )
     

     
    вот так работает  

    Код:
     
    @echo off
    cd /d "D:\folder"
    for /f "tokens=2 delims=: " %%a in ('D:\Setups\MediaInfo_0.7.7.4_CLI_Win32\mediainfo 1.wmv ^| find "Width"') do set file_width=%%a
    for /f "tokens=2 delims=: " %%a in ('D:\Setups\MediaInfo_0.7.7.4_CLI_Win32\mediainfo 1.wmv ^| find "Height"') do set file_height=%%a
    echo razmer %file_width%x%file_height%
     

     
    выдает результат:  
    razmer 640x480

    Всего записей: 25 | Зарегистр. 23-07-2008 | Отправлено: 15:21 04-08-2008 | Исправлено: lamener, 15:24 04-08-2008
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    lamener
    Ты в пределах одного блока кода if () присваиваешь переменным file_* значение, а потом их используешь (echo).
     

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    ...
    ...
    echo !file_width!x!file_height!
    )
     

     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 17:17 04-08-2008
    TLD



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени суток!
    Взялся написать систему резервного копирования баз 1С, все получилось кроме:
    у меня создается папка с тек. датой, в нее сыпятся архивы в формате 7z.001, 002, 003 и.т.д по 4 ГБ, суть в том, что это должно записываться Nero'й, один файл у меня получается записать, а как можно <b>создать цикл</b>, который <b>найдет все файлы</b> (001, 002) и последовательно отдаст их Nero, на запись?
     
    код:

    Код:
     
    @Echo Off
    Set dt=%Date%
    Set dtDay=%dt:~0,2%
    Set dtMonth=%dt:~3,2%
    Set dtYear=%dt:~6,4%
     
    Set dt=%dtDay%_%dtMonth%_%dtYear%
    mkdir H:\%dt%\
    pause
    7z.exe a -t7z H:\%dt%\1C.7z D:\1C\ -mx=7 -4g -ms=on
    rem Nerocmd.exe --write --drivename f --real --speed 4 --iso Filial H:\%dt%\1C.7z.001
     

    Всего записей: 13 | Зарегистр. 28-07-2008 | Отправлено: 17:52 04-08-2008
    01MDM



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

    Цитата:
    создать цикл...
    ...найдет все файлы

     
    Если в папке нет посторонних файлов (только файлы для записи)

    Код:
     
    for %%i in ("H:\%dt%\*") do (
         Nerocmd.exe --write --drivename f --real --speed 4 --iso Filial "H:\%dt%\%%i"  
         echo Change Disk
         pause 1>nul
    )
     
     
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 19:10 04-08-2008
    TLD



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо! Если не затруднит, а где можно почитать подробнее про вот эти переменные %%i и прочие, изучил все материалы из шапки, и часть топиков нигде не встретилось.

    Всего записей: 13 | Зарегистр. 28-07-2008 | Отправлено: 21:15 04-08-2008
    Elroir



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

    Цитата:
    а где можно почитать подробнее про вот эти переменные %%i и прочие, изучил все материалы из шапки, и часть топиков нигде не встретилось

    http://www.intuit.ru/department/os/compromtwin/3/

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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 22:03 04-08-2008
    01MDM



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

    Цитата:
    а где можно почитать подробнее про вот эти переменные %%i

    В справочнике по командам (%windir%\help\ntcmds.chm)
    В интернете можно найти как описание отдельных команд, так и альтернативные справочники
    Ну и `help for` или `for /?` тоже несет некоторую информацию.

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 22:07 04-08-2008
    Rabben

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Напишите мне шаблон такого скрипта:
    1. замена файла
    2. запись данных в реестр
    Зарание спасибо

    Всего записей: 13 | Зарегистр. 08-06-2008 | Отправлено: 04:45 05-08-2008
    merphy69

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    доброго утра, уважаемые!
     
    есть задача, создавать архив, имя которого содержит текущее время, делаю так:
     
    %time:~0,2%_%time:~3,2%
     
    проблема в том что до 10 утра эта строка не отрабатывает, вероятно из за того что час не имеет ведущего нуля (9 вместо 09), в связи с чем прошу помощи.
    пордскажите как подправить скрипт чтоб работал в любое время?

    Всего записей: 16 | Зарегистр. 01-04-2008 | Отправлено: 10:11 05-08-2008
    Svjt



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Сталкивался с таким, правда время не принимало там участия, тебе надо просто задать час как переменную и проверять больше она 10 или нет
     
    У меня вышло примерно так:
     

    Код:
     
    if /I %hour% LSS 10 (set r_time=0%hour%
    ) else (set r_time=%hour%)
     

     
    Где hour - переменная со значением часа
    r_time - твой выход (01, 05 или 15)

    Всего записей: 17 | Зарегистр. 03-03-2008 | Отправлено: 10:28 05-08-2008
    VitRom

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    а ещё лучше вообще всегда ещё при установке (или потом в панели управления) заходить в доп. настройки локали и сразу исправлять этот идиотизм (спасибо Билли за такие умолчания)

    Всего записей: 2967 | Зарегистр. 18-06-2006 | Отправлено: 10:35 05-08-2008
    merphy69

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Svjt, спасибо, но не подходит. дело в том что %time:~0,2% выводит не "9" а " 9", и из за лишнего пробела не получается использовать приведенный вами скрипт, а как убрать этот пробел я ума не приложу... использовать %time:~1,1% нельзя, тк в 10 часов например будет "0" вместо "10"
     
    VitRom, к сожелению изменить настройки локали в данной задаче нельзя((
     

    Всего записей: 16 | Зарегистр. 01-04-2008 | Отправлено: 10:51 05-08-2008
    01MDM



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

    Код:
     
    set t=%time:~0,2%_%time:~3,2%
    set t=%t: =0%
    echo %t%
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 11:07 05-08-2008
       

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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 5
    vu1tur (04-11-2008 23:07): Задачи на bat-файлах 6


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru