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

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



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

    Цитата:
    Цитата:set /p ff=<file.txt    
    >file.txt echo.%ff~:1,%  
       
    Так не работает - любой текст превращается в "1,".  
     
     
    логично: ~ ставится после : а не перед, видно же по предыдущим, работающим примерам (и по  set /?)

    Увы, но в данном случае перестановка знаков результат не изменяет.

    Всего записей: 503 | Зарегистр. 25-02-2008 | Отправлено: 19:03 15-06-2011
    res2001



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

    Код:
    mode con cols=100 lines=50

     
    Добавлено:
    fire4x
    Ну да ошибся, в прошлом посте, очепятался.
    так попробуй

    Код:
    set /p ff=<file.txt    
    >file.txt echo.%ff:~1%  

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 19:50 15-06-2011
    fire4x



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

    Цитата:
    Добавлено:  
    fire4x  
    Ну да ошибся, в прошлом посте, очепятался.  
    так попробуй  
     
    Код:set /p ff=<file.txt      
    >file.txt echo.%ff:~1%  

     
    Ура! Заработало!
     
     
    Добавлено:

    Цитата:
    Цитата:Цитата:А что, например, двухстрочный и трехстрочный варианты удаления (последнего символа в последней строке) будут сильно отличаться друг от друга?  
     
     
    Можно сделать и универсальный вариант.

    Будьте так добры...

    Всего записей: 503 | Зарегистр. 25-02-2008 | Отправлено: 20:17 15-06-2011
    res2001



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

    Код:
    @echo off
    SetLocal EnableDelayedExpansion
    >nul 2>&1 del /f /q test1.txt
    for /f "tokens=1,* delims=:" %%a in ('findstr /n /r ".*" test.txt') do (
        if defined num >>test1.txt echo.!txt!
        set "num=%%a" & set "txt=%%b"
    )
    >>test1.txt echo.%txt:~1%
     

    Берется файл test.txt и в последней строчке обрезается первый символ (в последней строке скрипта). Обрезание по тому же принципу, что и для файла состоящего из одной строки, весь остальной код копирует содержимое файла во временный файл, оставляя в переменной последнюю строку, для последующего обрезания.
    Итоговый файл test1.txt.
     
    Этому коду присущи все стандартные ограничения, которые есть при обработке текста батниками, т.е. если в файле содержатся спец.символы cmd: ()&<>!^, то скорее всего будет ошибка или не верный результат.
    Для того чтобы этого избежать лучше воспользоваться советом wolf0425 и сделать все с помощью sedа.
     
     

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 20:44 15-06-2011
    ShamanNeo



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

    Цитата:
    если есть пробелы - значит имя обязательно заключать в кавычки.  
     А в комманде start - при этом ещё и обязательно указывать заголовок окна:  
     start ""  "My Software.exe"

     
    Благодарю за помощь...

    Всего записей: 54 | Зарегистр. 04-02-2011 | Отправлено: 21:08 15-06-2011
    fire4x



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

    Цитата:
    @echo off  
    SetLocal EnableDelayedExpansion  
    >nul 2>&1 del /f /q test1.txt  
    for /f "tokens=1,* delims=:" %%a in ('findstr /n /r ".*" test.txt') do (  
        if defined num >>test1.txt echo.!txt!  
        set "num=%%a" & set "txt=%%b"  
    )  
    >>test1.txt echo.%txt:~1%

    Если не трудно, распишите код построчно (какие конструкции за что отвечают).

    Всего записей: 503 | Зарегистр. 25-02-2008 | Отправлено: 22:01 15-06-2011 | Исправлено: fire4x, 22:11 15-06-2011
    ShamanNeo



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пожалуйста еще советом:
    Есть bat файл,который запускает WScript - который в свою очередь выполняет сценарий(поиск в реестре значения расположения приложения(например MyApp.exe) и его запуск).Проблемма вот в чем:
    После запуска WScript и выполнения им задачи(запуск приложения MyApp.exe),окно консоли не закрывается,а ждет завершения работы MyApp.exe
    Как сделать так,чтобы окно консоли закрывалось,не дожидаясь завершения работы MyApp.exe ?
    Вот содержимое bat файла:
    @ECHO OFF
     
    ECHO.
    WScript Setup.vbs //B //Nologo
    ECHO.
    EXIT

    Всего записей: 54 | Зарегистр. 04-02-2011 | Отправлено: 05:11 16-06-2011 | Исправлено: ShamanNeo, 05:11 16-06-2011
    Elroir



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

    Код:
     
    start WScript Setup.vbs //B //Nologo
     


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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 10:21 16-06-2011
    res2001



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

    Цитата:
    Если не трудно, распишите код построчно (какие конструкции за что отвечают).

    Я вроде и так все расписал.
    В последней строке скрипта, собственно, правится последняя строка файла.
    Цикл сделан так что на одном проходе сначала записывается предыдущая строка в файл, потом считывается текущая строка в переменные, таким образом получаем, что по выходе из цикла в переменных остается последняя строка, которая еще не была записана в файл.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 11:05 16-06-2011
    Engraf



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Цитата:
    ...
    :_move  
    set "_path=%~dp1"  
    call set "_path=%%_path:%_src%=%_dest%%%"  
    echo move /y "%~1" "%_path%"  
    exit /b  
    Смысл уловил, спасибо.
    Один вопрос, почему здесь call: call set "_path=%%_path:%_src%=%_dest%%%" ?

    Всего записей: 67 | Зарегистр. 07-08-2007 | Отправлено: 12:55 16-06-2011
    wolf0425



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

    Цитата:
    Один вопрос, почему здесь call:  
    если коротко - потому что я не люблю вписывать в батники команду setlocal enabledelayedexpansion
    с ней было бы просто  
    set "_path=!_path:%_src%=%_dest%!"  
    - т.е. без call, и чуть больше ограничений по допустимым символам в путях, доп команда в начале.
    ещё вопросы?
     
    работает это так:
    при чтении интерпретатором очередной строки батника - все %переменные%  сразу заменяются значениями, %% заменяются на %, в таком виде строка выполняется.
    call вписан именно для того, чтоб задержать замену %_path:* значением - в случае двойных %% она произойдет не при первом чтении строки, а только при следующем прогоне через интерпретатор, при выполнении команды. Но вот значения %_src% и %_dest% - впишутся в строку уеж на первом проходе, и по ним на втором проходе произойдет символьная замена в %_path:*.
    enabledelayedexpansion и переход на !переменные! имеет результатом примерно то же самое.

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425Спасибо за разъяснения, полезная инфа!
     
    Ещё вопрос :
    Можно как-нить изменить глобальную переменную в пределах локальной области (setlocal --- endlocal)? Т.е. вот:
    Код:
    set "param=global"
    setlocal
    set "param=local"
    endlocal
    rem Будет выведено: "global"
    echo/%param%
    Как сделать чтоб вывелось "local"?

    Всего записей: 67 | Зарегистр. 07-08-2007 | Отправлено: 14:13 16-06-2011 | Исправлено: Engraf, 14:14 16-06-2011
    olegpronin



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    помогите, пожалуйста, решить следующую задачу:
    Имеется жесктйи диск с музыкой, шаблон такой:
     
    Artist {Genre 1, Genre 2}\Artist - Album (Year) [FLAC]
     
    Необходимо получить txt файл со списком всех подпапок Artist - Album (Year) [FLAC]
    В принципе, можно, чтобы список был вида  Artist {Genre 1, Genre 2}\Artist - Album (Year) [FLAC]
     
    Спасибо!

    Всего записей: 5365 | Зарегистр. 31-01-2007 | Отправлено: 14:34 16-06-2011
    wolf0425



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

    Цитата:
    Как сделать чтоб вывелось "local"?
    например переназначить переменную после endlocal, но присвоить ей значение локальной

    Код:
    set "param=global"
    setlocal
    set "param=local"
    endlocal & set "param=%param%"
    rem Будет выведено: "local"
    echo/%param%  

     
    Добавлено:
    olegpronin
    Цитата:
    В принципе, можно, чтобы список был вида  Artist {Genre 1, Genre 2}\Artist - Album (Year) [FLAC]  

    dir /b /ad * чем-то не устраивает?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 14:56 16-06-2011 | Исправлено: wolf0425, 14:59 16-06-2011
    fire4x



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

    Цитата:
    Цитата:Если не трудно, распишите код построчно (какие конструкции за что отвечают).  
     
     
    Я вроде и так все расписал.  
    В последней строке скрипта, собственно, правится последняя строка файла.  

    Интересует смысл вот этого:

    Код:
    >nul 2>&1


    Код:
    if defined num >>test1.txt echo.!txt!


    Код:
    echo.%txt:~1% VS echo.%ff:~1%

     

    Всего записей: 503 | Зарегистр. 25-02-2008 | Отправлено: 15:33 16-06-2011
    Engraf



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Все гениальное просто! Еще раз спасибо, скрипт готов

    Всего записей: 67 | Зарегистр. 07-08-2007 | Отправлено: 15:39 16-06-2011 | Исправлено: Engraf, 15:45 16-06-2011
    olegpronin



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

    Цитата:
    dir /b /ad *

     
    дело в том, что таким образом скрипт закидывает в список папки, которые находятся в той же директории.
     
    т.е. в списке получаю
     
    Artist {Genre 1, Genre 2}
     
    А надо получить
    Artist {Genre 1, Genre 2}\Artist - Album (Year) [FLAC] или Artist - Album (Year) [FLAC]

    Всего записей: 5365 | Зарегистр. 31-01-2007 | Отправлено: 15:49 16-06-2011
    Engraf



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    olegpronin
    Мож так?
    Код:
    dir /b /ad *[FLAC]

    Всего записей: 67 | Зарегистр. 07-08-2007 | Отправлено: 16:01 16-06-2011 | Исправлено: Engraf, 16:01 16-06-2011
    olegpronin



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Engraf
    нет.
     
    Вот структура каталогов:
    c:\FLAC\Artist {Genre 1, Genre 2}\Artist - Album (Year) [FLAC]
     
    bat файл кидаю в c:\FLAC
     
    в списке list.txt должны появиться только папки Artist - Album (Year) [FLAC]
     
     
    Добавлено:
    вот так можно dir /b /ad /s *[FLAC]  
    но надо чтобы c:\FLAC\Artist {Genre 1, Genre 2}\Artist - Album (Year) [FLAC]  превратилось в  
    Artist - Album (Year) [FLAC]  

    Всего записей: 5365 | Зарегистр. 31-01-2007 | Отправлено: 16:07 16-06-2011 | Исправлено: olegpronin, 16:11 16-06-2011
    Engraf



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    olegpronin
    А если вот так:
    Код:
    @echo off
    set "_dest=c:\FLAC\"
    dir /B /AD /S *[FLAC] > list1.tmp
    setlocal ENABLEDELAYEDEXPANSION
    for /F "delims=" %%I in (list1.tmp) do (
        set "folder=%%I"
        set "folder=!folder:%_dest%=!"
        echo/!folder! >> list2.tmp
    )
    for /F "delims=\ tokens=2" %%I in (list2.tmp) do (echo/%%I>>list.txt)
    del *.tmp

    Всего записей: 67 | Зарегистр. 07-08-2007 | Отправлено: 17:16 16-06-2011 | Исправлено: Engraf, 17:38 16-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