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

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

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

vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:54 27-04-2007 | Исправлено: Elroir, 03:59 10-09-2007
    0Vovan0



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Elroir
    Спасибо
     
    еще вопрос
    батник запускается из папки
    c:\f1\f2\name\x.bat
    name неизвестно, как его получить?
     
    и последнее - можно ли где найти полный список модификаторов переменных батников?
    таких как  
    %~d1 замена %1 именем диска  
    %~p1 замена %1 путем  
    в ntcmds.chm не все к сожаленью

    Всего записей: 2370 | Зарегистр. 15-07-2005 | Отправлено: 06:28 01-05-2007
    NIKZZZZ



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

    Цитата:
    батник запускается из папки
    c:\f1\f2\name\x.bat

    Не понял, как его найти?
    Например, так
    dir /s /b c:\f1\f2\x.bat
     

    Цитата:
    найти полный список модификаторов переменных батников?

    for /? или в ее описании.
     
     
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 07:18 01-05-2007
    Maza Faka



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

    Цитата:
    c:\f1\f2\name\x.bat  
    name неизвестно, как его получить?

     
    Ну или так:

    Код:
     
    @Echo off
    For /F "Skip=1 Delims=\ Tokens=4" %%a in ('Dir /b /s C:\f1\f2') do Echo %%a
     

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 07:57 01-05-2007
    Elroir



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

    Цитата:
    c:\f1\f2\name\x.bat  
    name неизвестно, как его получить?

    Что бы получить имя родительской директории, можно воспо;ьзоваться следующим кодом:

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    pushd ..
    call :find_dir "%cd%"
    popd
    echo %parent_dir%
    rem В переменной parent_dir будет нужное значение
    rem Отсюда и до "goto :EOF" остальной код
    rem ...
    rem ...
    goto :EOF
    :find_dir
    set "parent_dir=%~nx1"
    if not defined parent_dir (
    set "parent_dir=%~dp1"
    set "parent_dir=!parent_dir:~0,-1!"
    )
     

    Код не зависит от того, где он запускается.
     
    Maza Faka
    Что делает твой код?

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



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

    Цитата:
    Что делает твой код?

     
    Я ответил так, как понял вопрос...

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 17:30 01-05-2007
    Elroir



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

    Цитата:
    Я ответил так, как понял вопрос

    Это понятно
    Перефразирую вопрос - что он должен был делать?
    (Я не издеваюсь - действительно не понимаю).

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 17:34 01-05-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Elroir
    Вопрос был такой:

    Цитата:
    батник запускается из папки  
    c:\f1\f2\name\x.bat  
    name неизвестно, как его получить?

    Ну я и подумал, что человеку нужно увидеть имя папки
     
     
    Добавлено:
    Elroir

    Цитата:
    Что бы получить имя родительской директории, можно воспо;ьзоваться следующим кодом:

    Одно не понял в твоём коде, для чего эта строка set "parent_dir=%~nx1"
    И зачем такой большой код, если можно воспльзоваться таким:

    Код:
     
    @Echo off
    Pushd ..
    Set CurDir=%CD%
    Popd
    Echo %CurDir%
     
     
     
    P.S.
    А я и не подозревал, что команде "Pushd" в качестве каталога для перехода можно указать ".." Посмотрел в справке, оказывается есть...как-то проглядел

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 17:42 01-05-2007 | Исправлено: Maza Faka, 17:50 01-05-2007
    Elroir



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

    Цитата:
    Одно не понял в твоём коде, для чего эта строка set "parent_dir=%~nx1"  
    И зачем такой большой код, если можно воспльзоваться таким:

    Затем, что вопрос был "как получить name", a не "как получить c:\f1\f2\name".
    Вот я и вытаскиваю из полного пути c:\f1\f2\name последнюю директорию.
    Если ты берешь просто %CD% - получаешь полный путь.
    А код получился большим, потому что проверяется вариант, когда текущая или родительская директория - это корневая директория диска.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 18:05 01-05-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Elroir
    Всё понятно
     
    Добавлено:
    Elroir
    Ещё один вариант

    Код:
     
    @Echo off
    Call :MyDir %CD%
    Goto :EOF
    :MyDir
    Set CurDir=%~nx1
    If not defined CurDir (Echo This is root directory) Else (Echo %CurDir%)
     

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 19:04 01-05-2007 | Исправлено: Maza Faka, 20:05 01-05-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka
    Вариант чего? Проверки на корневую директорию?

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте,
    помогите пожалуйста!
    Нужно выводить имя  самого большого файла для заданного каталогa и каждого из его подкаталогов.
    Почитал здесь и в хелпе. Нашел сортировку файлов по размеру. Хочу родить примерно такую конструкцию (сорри за C-like комментарии):

    Код:
    @echo off
    set filepath=
    FOR /F %%i IN ('dir /s /a /b /o-s %1') DO  
    if filepath<> //здесь путь к файлу(без имени), я так понял, что %~pI, да?
    (
    echo %~nI
    set filepath=  //опять путь к файлу
    )

     
    Не очень эффективно, наверное, но думаю, проверять целиком хард с миллионом каталогов никто не будет.
    Как правильно оформить?
    Спасибо.

    Всего записей: 6 | Зарегистр. 01-05-2007 | Отправлено: 21:04 01-05-2007
    Elroir



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

    Цитата:
    Как правильно оформить?

    Видимо так:

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    if "%1"=="" (set work_dir=%cd%) else (set work_dir=%~1)
    set "largest_size=0"
    for /r "%work_dir%" %%a in (*.*) do (
    if %%~za GTR !largest_size! (
    set "largest_size=%%~za"
    set "largest_file=%%a" ))
    echo %largest_file%
    echo %largest_size%
     

    Если батник запускать без параметров - будет проверяться текущая директория. Если передать как параметр название другой директории - будет проверяться эта директория.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 22:45 01-05-2007 | Исправлено: Elroir, 00:48 02-05-2007
    glebsts

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ой. что-то я в /R и не вчитался толком. Спасибо большое, так оно действительно проще%)) Попробую сейчас еще и на shell-скрипт переписать, ибо на нем тоже надо. Спасибо)
     
     
    УПД:
    Знаете, я может слегка не так выразился, но для каждого подкаталога нужно найти свой наибольший файл. Сижу и думаю,
    for /r "%sel_dir%" %%a in (*.*) do (  
    суть два вложенных цикла, внешний для каталогов, внутренний для файлов в каталоге из внешнего.
    Как "провести границу" между циклами? т.е.  

    Код:
    for каждый каталог do(
    largest_size=0
    for каждый файл do (
    if ..GTR largest_size (...)
    )
    echo largest_size
    )
     

    воть
     
     
     
    UPD2:
    Очень извращенное, но работающее решение (требует параметра):

    Код:
     
    @echo off
    setlocal enabledelayedexpansion  
    if "%1"=="" (
    echo Usage: my.bat existing folder
    exit /b
    )
    if not exist "%1" (
            echo Usage: my.bat existing folder
            exit /b
            )
                
    set sel_dir=%~1  
    set "largest_size=0"  
    set "largest_file="
    set filepath="_&_"
     
    for /r "%sel_dir%" %%a in (*.*) do (
     
    if !filepath!=="_&_" ( set "filepath=%%~pa" )
     
    if !filepath! NEQ %%~pa (
                echo !largest_file! with size !largest_size!
                set "largest_size=0"
                set "filepath=%%~pa"
                set "largest_file="
    )  
    if %%~za GTR !largest_size! (  
    set "largest_size=%%~za"  
    set "largest_file=%%a"  
            )
                
    )
     

    Оперативу кушает только так, будучи запущенной с c:\ . Для просмотра папки cygwin потребовалось около 150Мб памяти. Периодически память освобождается, в районе 250-300Мб.
    Гадость, конечно, но больше ничего не придумалось.. Счас буду на шелл переписывать.

    Всего записей: 6 | Зарегистр. 01-05-2007 | Отправлено: 22:54 01-05-2007 | Исправлено: glebsts, 01:00 02-05-2007
    Elroir



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

    Код:
     
    @echo off
    if "%1"=="" (call :process "%cd%") else (call :process "%~f1")
    goto :EOF
    :process
    pushd %1
    for /f "tokens=*" %%i in ('dir /a-d /b /os 2^>nul') do set "current_largest=%%i"
    if not "%current_largest%"=="File Not Found" echo The largest file in %1 is %current_largest%
    for /f "tokens=* delims=" %%a in ('dir %1 /b /ad') do call :process "%%~fa"
    popd
     

     
    Добавлено:
    Память практически не используется, процессор загружен на 9 процентов (максимум) :-)
    Зато работает в 5 раз медленнее. :-(

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Да, явно шустрее)
    скажите пожалуйста, а 2^ - что такое? в синтаксисе dir такого не нашел.
    Саму идею понял, очень рад) спасибо еще раз)
     
    UPD:
    кстати, там недочет - при попадании в пустой каталог выдается имя наибольшего файла предыдущего каталога)
    добавил set "current_largest=No files" после pushd %1

    Всего записей: 6 | Зарегистр. 01-05-2007 | Отправлено: 01:51 02-05-2007 | Исправлено: glebsts, 02:04 02-05-2007
    NIKZZZZ



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

    Цитата:
    а 2^ - что такое?

    "^>"  заменяет ">" , иначе он будет воспринят как перенаправление.
     
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 02:32 02-05-2007
    Elroir



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

    Цитата:
    а 2^ - что такое? в синтаксисе dir такого не нашел

    Это не относится к dir-у. Это перенаправление  потока ошибок в nul. Должно выглядеть так: any_command 2>nul. ">" спец. симво; перенаправления, чтобы использовать его внутри for-a, надо добавить к нему символ "^", который позволяет for-у воспринимать его правильно. А нужна эта добавка потому, что команда "'dir /a-d /b /os' выдает в поток ошибок "File Not Found", если в проверяемой директории нет ни одного файла. Вот я и скрыл эти надписи.

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



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Всем спасибо, что надо получил но запутали окончательно
     
    Такой вот более вроде простой вопрос, ответ хотелось бы тоже воспринимаемый)
    запустить из батника для каждого файла в папке-подпапках(т.е как с dir /b /s) какую-либо команду, имя каждого файла соотв будет параметром для этой команды.  
     
    В принципе к этому в продолжение - можно ли эту команду выполнять не по порядку листинга файлов, а выбирать случайный файл, н раз?

    Всего записей: 2370 | Зарегистр. 15-07-2005 | Отправлено: 04:47 02-05-2007
    Elroir



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

    Цитата:
    кстати, там недочет - при попадании в пустой каталог выдается имя наибольшего файла предыдущего каталога)

    Действительно - не обратил внимание :-(
    Исправленный код:

    Код:
     
    @echo off
    if "%1"=="" (call :process "%cd%") else (call :process "%~f1")
    goto :EOF
    :process
    pushd %1
    set "current_largest="
    for /f "tokens=*" %%i in ('dir /a-d /b /os 2^>nul') do set "current_largest=%%i"
    if defined current_largest echo The largest file in %1 is %current_largest%
    for /f "tokens=* delims=" %%a in ('dir %1 /b /ad') do call :process "%%~fa"
    popd
     

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



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

    Цитата:
    запустить из батника для каждого файла в папке-подпапках(т.е как с dir /b /s) какую-либо команду, имя каждого файла соотв будет параметром для этой команды.
    можно ли эту команду выполнять не по порядку листинга файлов, а выбирать случайный файл

    Ну вот например так, копируется случайный файл, в зависимости от того какую цифру введёшь

    Код:
     
    @Echo off
    Setlocal enabledelayedexpansion
    Set /p "Select=Введите номер файла, который нужно скопировать "
    Set Var=0
    For /F "Tokens=*" %%a in ('Dir /b /s /a:-d') do (
    Set /a Var+=1
    If "!Var!"=="%Select%" copy "%%a" D:\Test)
     

     
    Добавлено:
    Elroir

    Цитата:
    Вариант чего? Проверки на корневую директорию?

    Ага...

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 08:07 02-05-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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 3
    vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru