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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka
    окей , теперь пошло
    а из какого документа это(этот хелп)?

    Всего записей: 4064 | Зарегистр. 22-11-2006 | Отправлено: 04:45 17-05-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    euheny
    Да уже и не помню, в каком-то help-е читал, про удваивание-утраивание символа "^", что бы использовать этот символ, как литеральный. Так же можно поступить и с кавычками...

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Начну с благодарности Вам и не сердитесь я только учусь. Показалось, что я довольно подробно изложил задачу, привел пример файл-списка, указал путь, который мне нужен из данного файл-списка, но... оказалось, что только показалось .
    Вот развернутая постановка задачи.
    На панели ТС выделены файл(ы) и/или папка(и). Пути с именами выделенных объектов передаются в батник с помощью файл-списка.
    Цитата:
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath\  
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\Realtek AC97 Audio Drivers v5.10.00.5970\  
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath 07.05.16 11-35.res  
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\Archive 07.05.15 15-32.7z  
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\0test 07.05.15 13-18.7z  
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\archiVE.7z  
    Файл список в кодировке win1251. Все выделенные объекты могут даходиться только в одной папке (В данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или в корне диска (например, D:\) Записей в файл-списке может быть от 1 до N. Путь к файл-списку передается в батник в переменной ~1.
    Задача:
    1. Переменная soursepart долна содержать имя_и_путь_папки в которой находятся выделенные объекты (в данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или D:\ , если объекты расположены в корне диска D.
    2. Переменная soursename долна содержать:
    а) если в списке одна запись и она является папкой, то имя_этой_папки (в данном примере это InstallPath, если эта запись состоит из D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath\)
    б) если в списке одна запись и она является файлом, то имя_этого_файла без расширения (в данном примере это InstallPath 07.05.16 11-35, если эта запись состоит из D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath 07.05.16 11-35.res)
    в) если в списке больше чем одна запись, то имя_папки уровнем выше (в данном примере это 1_7zSD_test). Если объекты расположены в корне диска, то имя фиксированное - Archive
    3 Переменная allfile долна содержать общее число файлов (только файлов без папок) в файл-списке. Диапазон от 0 до 4, остальные файлы, если их больше, не интересут.
    4 Переменнные var1, var2, var3, var4 долны содержать имя_и_путь_фаила для первых четырех файлов в файл-списке, остальные файлы, если их больше, не интересут.
     
    Сейчас я решаю эту задачу так
    Код:
    @echo off
    setlocal enabledelayedexpansion
    CHCP 1251>nul
    set allfile=0& set flagmany=0& FOR /F "tokens=*" %%i IN (%1) DO (
        set "tempi=%%i" & IF NOT "!tempi:~-1!"=="\" (
            set /a allfile+=1 & set "var!allfile!=%%i" & set "soursename=%%~ni" & set "soursepart=%%~dpi"
        ) ELSE (
            set /a flagmany+=1 & FOR /D %%a IN ("!tempi:~0,-1!.txt") DO (set "soursename=%%~na" & set "soursepart=%%~dpa")
        )
    )
    set /a flagmany+=allfile & IF !flagmany! GTR 1 (
        IF "!soursepart:~-2!"==":\" (set "soursename=Archive") ELSE (FOR /D %%a IN ("!soursepart:~0,-1!.txt") DO (set "soursename=%%~na"))
    )
    CHCP 866>nul
    echo %soursepart%
    echo %soursename%
    IF %allfile% GTR 4 set allfile=4
    call :_normlvars "%var1%" "%var2%" "%var3%" "%var4%"
    EXIT
    Дальнейшая обработка полученных переменных происходит в _normlvars. Все остальные переменные (не перечисленные мной ранее) являются временными.
    Можно ли оптимизировать этот код с целью уменьшения и ускорения работы? Выход по достижению 4 файлов я не сделал - не "дотянул" пока. А здесь есть возможность сократить время работы при большем количестве файлов.
    Заранее спасибо всем откликнувшимся.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 08:48 17-05-2007
    wolf0425



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

    Цитата:
    Задача:
    1. Переменная soursepart долна содержать имя_и_путь_папки в которой находятся выделенные объекты (в данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или D:\ , если объекты расположены в корне диска D.  

    так и непонятно - надо ли для soursepart анализировать весь список, или заведомо достаточно первой строки.  
    в смысле - что делать, если в последующих строках списка отличие более чем в последнем имени - и надо ли это отлавливать.
    ну то есть не могут ли в списке оказаться одновременно строки
     D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath1\  
     D:\DISTRIBUT 1\Winrar\1_7zSD_test\InstallPath2\  

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 10:48 17-05-2007 | Исправлено: wolf0425, 10:50 17-05-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Цитата:
    надо ли для soursepart анализировать весь список..
    ....надо ли это отлавливать.
    Нет и нет
    Цитата:
    Все выделенные объекты могут даходиться только в одной папке (В данном примере это D:\DISTRIBUT 1\7-Zip\1_7zSD_test\) или в корне диска (например, D:\)
    Т.е. папка у всех объектов в списке ОДНА и та же. Но все объекты (как вариант) могут быть расположены и корне диска.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 11:10 17-05-2007 | Исправлено: GORA2, 11:11 17-05-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GORA2 вызывает удивление срока
    FOR /D %%a IN ("!tempi:~0,-1!.txt") DO (
    в данном примере списка jна будет вызвана для  
    tempi=D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath\
    а файл D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath.txt в постановке задачи не фигурирует.
    как и файл D:\DISTRIBUT 1\7-Zip\1_7zSD_test.txt из последнего FOR

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 11:30 17-05-2007 | Исправлено: wolf0425, 11:30 17-05-2007
    GORA2



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

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 11:41 17-05-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GORA2 так кто и что в эти *.txt пишет? и зачем...
    если только для разбора имени на части - то .txt приписывать совершенно незачем, пример был вчера
    for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursename=%%~na"
     
    оптимизировать с целью ускорения - не получится: всё однопроходное и много не наоптимизируешь.
    А покороче можно и сделать, если надо.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 12:30 17-05-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Цитата:
    только для разбора имени на части - то .txt приписывать совершенно незачем, пример был вчера  
    for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursename=%%~na"  
    Недоглядел. Понял, попробую .
    Цитата:
    оптимизировать с целью ускорения - не получится: всё однопроходное и много не наоптимизируешь
    Вам виднее. Я думал можно прекратить весь этот процесс после нахождения первых же четырех файлов в файл-списке т.к. мне более не требуется для обработки в _normlvars, а записей может быть значительно больше. Четырех файлов достаточно и для определения всех моих переменных.
    Цитата:
    А покороче можно и сделать, если надо.
    Я бы не отказался , если Вас это не сильно обременит.
     
     

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 13:35 17-05-2007 | Исправлено: GORA2, 13:36 17-05-2007
    wolf0425



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

    Цитата:
    Я думал можно прекратить весь этот процесс после нахождения первых же четырех файлов в файл-списке

    1. можно, но неужели список настолько длинный, что это на что-то влияет? сколько строк в реальных списках?
    2. подсчет общего количества строк - ты зачем-то ввел. или достаточно знать что их >1 ?
    в принципе можно и отдельно (и быстро) посчитать все или остановить подсчет после четырех var - если в тот момент он уже потерял смысл (строк заведомо больше трех).
    что лучше?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 13:44 17-05-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Цитата:
    но неужели список настолько длинный, что это на что-то влияет? сколько строк в реальных списках?
    А столько, сколько их может быть к какой либо папке у пользователя. Кто ж его знает сколько он имеет там файлов/папок. Может 100, а может несколько тысяч?
    Цитата:
    остановить подсчет после четырех var  
    На этом можно прекратить подсчет, все нужные мне переменные уже определены.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 14:00 17-05-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    GORA2
    Мудрённый у тебя какой-то батник получается, плагин к Total Commander-у пишешь?
    Что вообще ты хочешь делать при помощи этого батника? Может найдётся другое решение?

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka
    Ну плаги не плагин, но делать много чего хочу с помощью этого батника. Другое решение конечно найдется, но я учусь. Дайте насладиться процессом

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 15:58 17-05-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GORA2 наверно так
    Код:
    @echo off
    setlocal enabledelayedexpansion
    CHCP 1251>nul
     
    set allfile=0
    set flagmany=0
    for /f "tokens=*" %%i in (%1) do (
     set /a flagmany+=1 & set "tempi=%%~i" & IF "%%~nxi"=="" (
      for /F "tokens=*" %%a in ("!tempi:~0,-1!") do set "soursename=%%~na" & set "soursepart=%%~dpa"
      ) else (
      set /a allfile+=1 & set "var!allfile!=%%~i" & set "soursename=%%~ni" & set "soursepart=%%~dpi" & if !allfile! equ 4 goto :_check                    
      )
    )
    :_check
    If !Flagmany! Gtr 1 for /F "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursename=%%~na"
    IF "!soursepart:~-2!"==":\" set "soursename=Archive"
     
    CHCP 866>nul
    echo. part=%soursepart%
    echo. name=%soursename%
     
    echo call :_normlvars "%var1%" "%var2%" "%var3%" "%var4%"
    EXIT

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 16:02 17-05-2007 | Исправлено: wolf0425, 16:16 17-05-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Спасибо. Дома посмотрю, будут проблемы - отпишусь.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 16:22 17-05-2007
    0Vovan0



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    мб тупой вопрос , но как батником просто создать пустой файл?
    надумал @ECHO OFF>FILE , но может как-то проще можно?

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



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

    Код:
     
    echo.>file  
     

    на 4 символа короче!!!

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



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

    Цитата:
    echo.>file

    Это не пустой файл, он содержит 2 символа.

    Код:
    break>file

     

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Прав. Но можно поспорить - мой вариант содержит два невидимых символа

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



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

    Цитата:
    мой вариант содержит два невидимых символа

    В текстовом файле это пустая строка, что не всегда хорошо.
    Уж если уж все делать правильно:

    Код:
    Fsutil file createnew file 0



    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 02:51 18-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