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

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

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

vu1tur (29-07-2011 12:47): Задачи на bat-файлах 11
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 104 105 106 107 108

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:53 09-01-2011 | Исправлено: mazafakermazafaka, 11:22 04-06-2011
    Lutvun



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Подходит! Спасибо.

    Всего записей: 286 | Зарегистр. 22-11-2005 | Отправлено: 08:57 01-06-2011
    king_stiven

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

    Цитата:
    В папке (например папка WINDOWS) лежит множество папок и файлов с произвольными именами.  
    В одной из тех папкок (например папка system32) - также множество папок и файлов с произвольными именами.  
    И вот эти папки (например подпапки в папке oobe) нужно удалить, но не все - а, например, кроме 2-х, названия которых известны (например папки images и sample).


    Код:
    @echo off
    chcp 1251>nul
    set "f1=system32"
    set "f2=oobe"
    set "f3=images"
    set "f4=sample"
    for /r %%a in (.) do (
        if defined not_first1 (
            if "%%~na"=="%f1%" (
                pushd "%%a"
                if not errorlevel 1 for /r %%b in (.) do (
                    if defined not_first2 (
                        if "%%~nb"=="%f2%" (
                            pushd "%%b"
                            if not errorlevel 1 for /r %%c in (.) do (
                                if defined not_first3 (
                                    if /i "%%~nc" neq "%f3%"  if /i "%%~nc" neq "%f4%" rd /s /q "%%c"
                                ) else (
                                    set not_first3=1
                                )
                            )
                        )
                    ) else (
                        set not_first2=1
                    )
                )
            )
        ) else (
            set not_first1=1
        )
    )

    Батник кидаем в WINDOWS, он там в папках и подпапках ищет первую попавшуюся папку с именем system32, причём это может быть даже папка
    C:\WINDOWS\AppPatch\system32\
    В ней он ищет первую попавшуюся папку с именем oobe
    В ней он удаляет все папки кроме имён images и sample, причём удалит и вот такие папки
    C:\WINDOWS\AppPatch\system32\1\oobe\1\images
    а вот такие оставит
    C:\WINDOWS\AppPatch\system32\1\oobe\images\1
    В батнике реализована защита "от дурака"
    Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
     
    Если в условиях напишешь, что ты ищешь например только в папке WINDOWS папку system32,а не в подпапках, то есть ищешь
    WINDOWS\system32\
    а не
    WINDOWS\1\system32\
    (то же самое и для oobe)
    то задача решается проще:
     
    @echo off
    chcp 1251>nul
    set "f1=system32"
    set "f2=oobe"
    set "f3=images"
    set "f4=sample"
    for /f "delims=" %%c in ('dir "%f1%\%f2%"/a:d /b') do if /i "%%~nc" neq "%f3%" if /i "%%~nc" neq "%f4%" rd /s /q "%f1%\%f2%\%%c"

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 10:31 01-06-2011 | Исправлено: king_stiven, 10:57 01-06-2011
    res2001



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

    Цитата:
    Не хочет запускаться...  

    Можешь запускать, в таком виде он ничего делать не будет, только выведет команды для удаления, проверишь, что все каталоги указаны правильно удалишь во второй строке echo, тогда заработает.
     

    Цитата:
    P.S. Если нужно указать конкретные каталоги первого и второго уровня (которые в примере - system32 и oobe), то вместо чего их подставлять?  

    Изначально про каталоги первого уровня ты ничего не говорил.
    В текущей варианте ищутся только каталоги второго уровня, но если надо не удалять и первого и второго уровня, то переделать достаточно просто.
    Указывай вместо
    #folder1
    #folder2
    количество не ограничено , каждый каталог в отдельной строке, начинай с символа # кавычки в длинных именах не нужны.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 11:01 01-06-2011 | Исправлено: res2001, 11:15 01-06-2011
    GORA2



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

    Цитата:
    У кого есть возможность, потестируйте консольную утилиту для скачивания файлов из интернет по http и ftp ссылкам  

    А есть возможность к ней прикрутить ключи для получения размера и даты запрашиваемого файла?

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 12:52 01-06-2011
    Free_Soft



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

    Цитата:
    А есть возможность к ней прикрутить

    вообще ее автор не я был, а bomzzz. Напишите ему в личку, может, поможет

    ----------
    На вашей перфокартѣ обнаруженъ вирусъ, механизмъ будетъ остановленъ.

    Всего записей: 1536 | Зарегистр. 19-04-2010 | Отправлено: 13:00 01-06-2011 | Исправлено: Free_Soft, 13:01 01-06-2011
    wolf0425



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

    Цитата:
    А есть возможность к ней прикрутить ключи для получения размера и даты запрашиваемого файла?
    а смысл? чем тебя готовый wget  не устраивает?
    разве что время выдает в GMT

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 13:55 01-06-2011 | Исправлено: wolf0425, 13:55 01-06-2011
    GORA2



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

    Цитата:
    чем тебя готовый wget  не устраивает?

    Размером.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 14:20 01-06-2011
    wolf0425



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

    Цитата:
    Размером.
    неужели экзешник в 400к - настолько напрягает размером, что имеет смысл заказывать эрзац?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 15:41 01-06-2011
    GORA2



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

    Цитата:
    неужели экзешник в 400к - настолько напрягает размером, что имеет смысл заказывать эрзац?

    wolf0425, дискуссия у нас какая-то беспредметная, Вы не находите?
    Разница в размерах на два порядка, а насчет эрзаца, Вы это зря. Задачи у всех разные, зачем мне танк для поездки к соседу на соседнюю улицу? Я и на велосипеде не опоздаю...

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 16:05 01-06-2011
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    >> поскольку без кода возврата скрипт завершиться не может
    > если я не укажу код возврата то батник не завершится?
    поскольку без кода возврата скрипт завершиться не может, не указывая его, вы фактически указываете ноль, т.е. «все ОК» — а это очевидная дезинформация


    ----------
    Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:21 01-06-2011
    01MDM



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

    Цитата:
    а это очевидная дезинформация

    Батник завершил работу? Что и требовалось в случае ложного пути. Если кому надо рассматривать коды возврата, допустим для дальнейшего анализа и действий, пусть об этом скажет. Я считаю это не принципиальным. В данном случае достаточно goto:eof. Кроме того я не убрал stderr, если запускать батник из консоли, то ошибка pushd будет видна.  
     
     
    Добавлено:
    wolf0425

    Цитата:
    например исключение не сработает если папка была создана с другим именем и переименована

    Как это?

    Код:
     
     > md "folder 3"
     
     > for %i in ("folder 3") do @echo %~snxi
    FOLDER~1
     
     > rd "folder 3"
     
     > md folder.1.2.3
     
     > for %i in ("folder.1.2.3") do @echo %~snxi
    FOLDER~1.3
     
     > ren folder.1.2.3 "folder 3"
     
     > for %i in ("folder 3") do @echo %~snxi
    FOLDER~1
     
     >
     


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 18:09 01-06-2011 | Исправлено: 01MDM, 18:29 01-06-2011
    fire4x



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven, спасибо. 2-ой вариант - то что доктор прописал...
     
    P.S. Выражаю благодарность всем кто пытался помочь.

    Всего записей: 503 | Зарегистр. 25-02-2008 | Отправлено: 18:33 01-06-2011 | Исправлено: fire4x, 18:34 01-06-2011
    wolf0425



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

    Цитата:
    Как это?  
    ты тот код что я приводил запусти и посмотри - какие каталоги предлагаютсяя к удалению.
    или мне скриншот вывесить?
     
     

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 19:42 01-06-2011
    01MDM



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

    Цитата:
    ты тот код что я приводил запусти и посмотри

    Ты же там сначала пытаешься определить переменные, а только потом создаешь папку. Я сразу написал:

    Цитата:
    Папки в exclude-списке должны существовать

    Т.к. нельзя получить короткое имя из несуществующей папки/файла. Правда можно сразу в переменную добавить уже известные короткие имена:

    Код:
     
    for %%i in ( short~1 short~2 short~3 ) do set "exclude_%%i=1"
     



    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 20:05 01-06-2011
    A1eksandr1



    Модератор
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Добрый вечер. Подскажите:
    Нужно в одном бантике дважды прочитать введённое число в переменную.
     
    Первый раз читаю так:
    set /p ERRORLEVEL=Введите число и нажмите клавишу ENTER:
     
    Второй раз при использовании этой же команды новое число не сохраняется, остаётся старое. Как можно это разрешить?

    Всего записей: 7254 | Зарегистр. 10-12-2007 | Отправлено: 20:46 01-06-2011 | Исправлено: A1eksandr1, 20:47 01-06-2011
    01MDM



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

    Цитата:
    Второй раз при использовании этой же команды новое число не сохраняется, остаётся старое

    Приведи пример.
     


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 21:03 01-06-2011
    A1eksandr1



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

    Код:
     
    set /p ERRORLEVEL=Введите номер операции и нажмите клавишу ENTER:  
    @ECHO Выполняю операцию № %ERRORLEVEL%! Ожидайте...
    @IF "%ERRORLEVEL%"=="1" блаблабла
    @IF "%ERRORLEVEL%"=="2" (
    set /p ERRORLEVEL=Введите требуемое значение и нажмите клавишу ENTER:
    @ECHO Выполняю расчёт со значением %ERRORLEVEL%!
    блаблабла
    )
     

    Во втором месте после ввода значения всё равно остаётся предыдущее

    Всего записей: 7254 | Зарегистр. 10-12-2007 | Отправлено: 21:11 01-06-2011
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    A1eksandr1
     
    %ERRORLEVEL% - системная переменная, ей бесполезно присваивать значения ! Переименуй, например на %_ERRORLEVEL%

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 21:20 01-06-2011
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    A1eksandr1 всё там сохраняется - это ты печатаешь неправильно.
     
    set /p ERRORLEVEL=Введите номер операции и нажмите клавишу ENTER:  
    @ECHO Выполняю операцию № %ERRORLEVEL%! Ожидайте...
    @IF "%ERRORLEVEL%"=="1" блаблабла
    @IF "%ERRORLEVEL%"=="2" (
    set /p ERRORLEVEL=Введите требуемое значение и нажмите клавишу ENTER:
    @ECHO старое значение %ERRORLEVEL%
    блаблабла
    )
    @ECHO новое значение %ERRORLEVEL%
     
    вдумчиво читай хэлп на тему () и %переменных%
     
     
    Добавлено:

    Цитата:
    %ERRORLEVEL% - системная переменная, ей бесполезно присваивать значения
    почему это бесполезно? исправно присваивается ;)
    а что после присваивания значение системной "переменной" недоступно  - так наверно оно юзеру и не нужно.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 21:20 01-06-2011 | Исправлено: wolf0425, 21:24 01-06-2011
    A1eksandr1



    Модератор
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    NIKZZZZ
    wolf0425
    Хм, действительно вроде переназначилась без переименования, сейчас попробую в основной код вставить

    Всего записей: 7254 | Зарегистр. 10-12-2007 | Отправлено: 21:25 01-06-2011
       

    Страницы: 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 104 105 106 107 108

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 10
    vu1tur (29-07-2011 12:47): Задачи на bat-файлах 11


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru