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

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

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

KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

hErAx

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

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

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

  • Отправлено: 01:53 25-10-2015 | Исправлено: Paromshick, 21:51 18-12-2017
    Pasha_ZZZ



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Deoptimizer
    Не знаю, где это популярно... SED гораздо популярнее, ящитаю

    Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 19:35 29-06-2017
    Deoptimizer

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

    Цитата:
    SED гораздо популярнее

    Это уже стороннее приложение, мне бы хотелось обойтись стандартными средствами Windows.
    Да и на сколько я знаю, оно не умеет работать с ERRORLEVEL и нужно городить сравнение на выходе программы.

    Всего записей: 315 | Зарегистр. 12-06-2015 | Отправлено: 20:04 29-06-2017
    Pasha_ZZZ



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Deoptimizer
    Цитата:
    оно не умеет работать с ERRORLEVEL
    "Оно" и не должно, это потоковый редактор, а не искалка-заменялка. Для поиска и ERRORLEVEL'ов есть GREP.
    И не думаю, что вышеприведенное JScript'ное изобретение лучше GREP/SED

    Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 20:11 29-06-2017
    marinka9



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет!
    Прошу вашей помощи.
    Есть вот такая простая конструкция:
     
    ncftpput.exe ftp://ftp.ru /zapros/ \dir1\*
    ping 127.0.0.1 -n 60 >nul
    ncftpget.exe ftp://ftp.ru \dir2\ /otvet/*
     
    /zapros/ и /otvet/ на удаленном FTP сервере
    /dir1/ и /dir2/ локально
    промежуточная команда ping создает фиксированную паузу в 60 секунд
    на удаленном FTP сервере, после попадания туда файлов в папку /zapros/ происходит некий процесс, после которого там же на удаленном FTP сервере в папке /otvet/ появляются другие фалы. Происходит некий обмен файлами.
    Проблема в том, что обработка файлов от запроса до ответа может занимать время меньшее чем 60 секунд или большее. Хотелось бы заменить фиксированную паузу, на нормальную процедуру, проверяющую появление фалов на удаленном FTP в папке /otvet/ и запуск процедуры скачивания ncftpget.exe. Желательно без привязки к локальному компьютеру, то есть все это работает на флешке и может отрабатывать с разных компов, разных ОС в пределах новых версий Win. Возможно такое реализовать как то не сильно усложняя конструкцию?
    Допускаю необходимость и возможность создания фиксированного контрольного файла на удаленном FTP сервере в папке /otvet/ подтверждающего готовность файлов для скачивания.

    Всего записей: 85 | Зарегистр. 14-11-2006 | Отправлено: 14:12 01-07-2017
    Deoptimizer

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте.
    Существует такая проблема с символом pipe или еще называют vertical bar "|".
     
    Т.к. я использую stdout(выход на экран) а не файл на диске, мне пришлось использовать такой скрипт, где файл(его выход stdout) записывается в переменную content(т.к. так быстрее дальше будет обрабатывать данные):

    Цитата:
     
    @SETLOCAL enableextensions enabledelayedexpansion
    :: CR
    for /f %%I in ('copy /Z "%~dpf0" nul') do set "CR=%%I"
    :: LF
    SET LF=^
     
     
    rem ** The two empty lines are necessary
    SET "content="
    FOR /F "delims=" %%X IN ('читаем stdout, в одной из строк может содержатся знак "|"') DO (
            IF DEFINED content SET "content=!content!!CR!!LF!"
            SET "content=!content!%%X"
            )
    echo !content!
    pause
     

    Проблема в следующем, если в строке содержится знак "|" - оно не добавляет эту строчку в content.
    Знаю есть еще возможность пропуска системного знака в виде "^|" или замены его в переменной "%var:^|=_%" - но как мне это сделать с переменной "%%X" вы цыкле FOR?
    Также вроде есть еще для FOR параметр "skip=" - но как с ним работать...
    Или еще есть какой-то вариант?
    Но отказываться от цикла FOR для заполнения переменной content я не хочу.

    Всего записей: 315 | Зарегистр. 12-06-2015 | Отправлено: 00:14 03-07-2017 | Исправлено: Deoptimizer, 00:53 03-07-2017
    NIKZZZZ



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

    Код:
    @SETLOCAL enableextensions enabledelayedexpansion
    :: CR
    for /f %%I in ('copy /Z "%~dpf0" nul') do set "CR=%%I"
    :: LF
    SET LF=^
     
     
    rem ** The two empty lines are necessary
    SET content=""
    FOR /F "delims=" %%X IN ('читаем stdout, в одной из строк может содержатся знак ") DO (
            IF not !content!=="" SET content=!content:~0,-1!!CR!!LF!"
            SET content=!content:~0,-1!%%X"
            )
     
    echo !content:~1,-1!
     
    pause
     


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 06:36 03-07-2017
    GCRaistlin



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Deoptimizer
    Попробовал ваш код - строка с "|" в content добавляется. stdout получал от type file. А вот если строка содержит "!", то она ожидаемо портится.

    ----------
    Magically yours
    Raistlin

    Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 13:13 03-07-2017
    Deoptimizer

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Спасибо. Но ваш скрипт просто удаляет последний символ в строке.
    Но ладно, проблема оказалась в другом.
    Не символ pipe послужил причиной не записи его в переменную content, а кол-во символов строке.

    Код:
     
    @SETLOCAL enableextensions enabledelayedexpansion
    :: CR
    for /f %%I in ('copy /Z "%~dpf0" nul') do set "CR=%%I"
    :: LF
    SET LF=^
     
     
    rem ** The two empty lines are necessary
    SET "content="
    FOR /F "delims=" %%X IN ('type file.txt') DO (
        IF NOT !content!=="" SET "content=!content!!CR!!LF!"
        SET "content=!content!%%X"
        )
    echo !content!
    pause
     

     
    Вот текстовый файл с тремя строчками для примера file.txt#(чтобы тут не постить огромный файл, я его разместил под знаком # - это значит, что его можно увидеть через опцию "Редактировать" это мое сообщение).
     
     
    Вот в чем проблема, когда мы видим вывод echo переменной content, то она не содержит последнюю строку 321:

    Код:
     
    d:>echo !content!
     
    123
    xxxxx-xxxxx-xxxxx-xxxxx-xxxxx|xxxxx-xxxxx-xxxxx-xxxxx-xxxxx|xxxxx-xxxxx-xxxxx-xx
    ...
    ...
    xxxxx-xxxxx-
     
     
    d:>pause
    Для продолжения нажмите любую клавишу . . .
     

    (не отображает 321)
     
    Если мы еще добавим символ в серединную строку, то будет выход:

    Код:
     
    d:>echo !content!
     
    123
    321
     
    d:>pause
    Для продолжения нажмите любую клавишу . . .
     

    Я посчитал, в самой большой строке 8172 символа(без системного переноса)
    Если будет 8173 символа - тогда эту строку FOR игнорирует.
     
    Также наблюдается глюк со стандартным текстовым редактором!
    При открытии файла file.txt (под #) в обычном notepad - данные отображаются как китайские знаки, а если стереть один символ - то отображается нормально и так через один символ.
     

    Всего записей: 315 | Зарегистр. 12-06-2015 | Отправлено: 13:34 03-07-2017 | Исправлено: Deoptimizer, 13:41 03-07-2017
    GCRaistlin



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Deoptimizer
    https://support.microsoft.com/en-us/help/830473/command-prompt-cmd.-exe-command-line-string-limitation

    ----------
    Magically yours
    Raistlin

    Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 14:33 03-07-2017
    Deoptimizer

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Еще раз здравствуйте.
     
    Не хочет удалять из строки переменной символ(если использовать переменную вместо символа).
    https://ss64.com/nt/syntax-replace.html
     

    Код:
     
    SET mask=BCDFGHJKMNPQRSTVWXY2346789
    CALL SET "char=3"
    SET "mask_without_char=%mask:!char!=%"
    echo !char!
    echo !mask_without_char!
     

    Переменная char у меня в программе меняется.
    Если вместо переменной "!char!" просто указать символ, то оно удаляет его.
     
    Добавлено:
    Решил проблему добавлением еще одного знака "%"

    Код:
     
    ...
    SET "mask_without_char=%%mask:!char!=%%"  
    ...
     

     
    РЕШЕНО!

    Всего записей: 315 | Зарегистр. 12-06-2015 | Отправлено: 21:18 04-07-2017 | Исправлено: Deoptimizer, 21:20 04-07-2017
    clio77



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

    Всего записей: 2441 | Зарегистр. 27-10-2003 | Отправлено: 12:10 11-07-2017 | Исправлено: clio77, 12:29 11-07-2017
    Pasha_ZZZ



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    clio77
    Во-первых, для wget последовательность ключей не важна. А во-вторых, префикс длинных ключей - --

    Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 12:14 11-07-2017
    NvvLazyTiger



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет.
     
    Диспозиция.
    ОС: WinXP+SP3
    Место: Tst0 (тестовый каталог)
    Файл: a%2Fb.abc (тестовый файл)
    Цель: в батнике последовательно передать в п/п имена всех файлов в каталоге.
     
    Очевидный вариант:
    Код:
    for %%a in ( Tst0\*.* ) do call :b1 "%%~nxa"
    goto :eof
    :b1
    echo %1
    работает криво: п/п получает "aFb.abc".
     
    Правильно работающий вариант:
    Код:
    for %%a in ( Tst0\*.* ) do (set jTmp2="%%~nxa"& call :b1 )
    goto :eof
    :b1
    echo %jTmp2%
    п/п получает "a%2Fb.abc".
     
    Вопрос: есть ли общее правильное решение для достижения указанной цели при любых, допустимых в ОС, именах файлов? Желательно, без "костыля" из доп. переменной среды.
     
    ---
    Удачи!
    Влад.

    Всего записей: 257 | Зарегистр. 14-02-2009 | Отправлено: 13:00 12-07-2017
    NvvLazyTiger



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вдогонку.
     
    Похоже, без "костылей" никак...
    Вот что у меня получилось:
    Код:
    set fDir="H:\Tst0\"
    for %%a in ( %fDir:~1,-1%*.* ) do (set fNam="%%~na"&set fExt="%%~xa"&call :aa)
    goto :eof
    :aa
    set fFil="%fDir:~1,-1%%fNam:~1,-1%%fExt:~1,-1%"
    echo fFil=%fFil%
    goto :eof
    п/п получает правильное имя очередного файла...
     
    ... Невзирая на присутствие в именах изысков типа:
    - "%2";
    - "%a";
    - "%%a";
    - прочих (надеюсь).
     
    ---
    Удачи!
    Влад.

    Всего записей: 257 | Зарегистр. 14-02-2009 | Отправлено: 03:05 13-07-2017
    Pasha_ZZZ



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    NvvLazyTiger
    Как-то слишком сложно....
    Цитата:
    set fDir="H:\Tst0\"
    for %%a in (%fDir%*) do echo "%%~fa"

    Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 08:32 13-07-2017
    NvvLazyTiger



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Увы, Pasha_ZZZ, предложенное вами работает, но...
     
    Мне-то нужно иное:
    Цитата:
    Цель: в батнике последовательно передать в п/п имена всех файлов в каталоге.
    В общем случае, не исключено, что могут попадаться и подкаталоги сходного свойства...
     
    ... Вот и пришлось громоздить не совсем очевидную конструкцию самого общего толка:
    Some_pieces_of_real_CMD

    Всего записей: 257 | Зарегистр. 14-02-2009 | Отправлено: 13:58 13-07-2017
    Pasha_ZZZ



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    NvvLazyTiger
    ECHO для наглядности, в вашем случае это set fFil=....

    Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 14:01 13-07-2017
    NvvLazyTiger



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет.
     
    Дано:
    - исходная строка;
    + символ или позиция в строке.
     
    Требуется: разделить исходную строку на 3 подстроки по заданному символу (первое вхождение) или по заданной позиции.
     
    Решение (очевидное):
    Код:
    @echo off
     
    :: --- I исходные данные
    set LineR=abcde
    ::  CharD - символ по которому разрезать
    set CharD=d
    ::  CharP - позиция символа разреза
    set CharP=2
     
    :: --- II процедура "разрезание"
    if NOT defined LineR goto Failed
    if "%CharD%%CharP%" == "" goto Failed
    ::  CharN - позиция проверяемого символа
    set CharN=0
    ::  LineL - левая часть разрезаемой строки
    set LineL=
    :Again цикл шинковки
    set CharS=%LineR:~0,1%
    ::  CharS - проверяемый символ строки
    set LineR=%LineR:~1%
    set LineL=%LineL%%CharS%
    if defined CharP if "%CharN%" == "%CharP%" goto Ok
    if defined CharD if "%CharS%" == "%CharD%" goto Ok
    set /a CharN+=1
    ::  LineR - остаток остался?
    if defined LineR goto Again
     
    :: --- III выдача результатов
    :Failed всё плохо!
    echo ! Failed!
    goto :eof
    :Ok всё получилось:
    set LineL=%LineL:~0,-1%
    :: [позиция] левая_часть+вырезаный_символ+правая_часть
    echo [%CharN%] %LineL%+%CharS%+%LineR%
    goto :eof
    У процедуры 11 команд + метка (в общем случае).
    В частном случае - не меньше 5-и + метка:
    Код:
    set LineL=
    :Again цикл шинковки
    set LineL=%LineL%%LineR:~0,1%
    set LineR=%LineR:~1%
    if "%LineL:~-1,1%" == "%CharD%" goto Ok
    if defined LineR goto Again

    Вопрос: можно ли упростить процедуру "разрезание"?
    (желательно, оставаясь в границах возможностей CMD.exe WinXP)
     
    ---
    Удачи!
    Влад.

    Всего записей: 257 | Зарегистр. 14-02-2009 | Отправлено: 06:53 22-07-2017 | Исправлено: NvvLazyTiger, 07:06 22-07-2017
    Eternal07



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть несколько служб которые в состоянии Disabled. Можно ли в один батник запихать:
    Если службы отключены, перевести в состоянии Auto, запустить, а так же запустить указанную программу;
    Если службы включены, то отключить их и перевести в состояние Disabled?

    Всего записей: 101 | Зарегистр. 21-12-2007 | Отправлено: 14:46 28-07-2017
    metatrop

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Eternal07
    Системная утилита sc.exe
     
    Например, для службы DHCP Client
     
    sc config Dhcp start= auto
    sc config Dhcp start= disabled
    sc query Dhcp   -- надо перехватывать вывод и разбирать текст

    Всего записей: 313 | Зарегистр. 17-09-2010 | Отправлено: 07:02 29-07-2017
       

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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Закладки » Задачи на bat-файлах 12
    KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru