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

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

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

vu1tur (25-01-2010 12:41): лимит страниц, продолжение: http://forum.ru-board.com/topic.cgi?forum=62&topic=19668  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 109 110 111 112 113 114 115 116 117

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:37 26-05-2009 | Исправлено: TechnicsKuzya, 13:53 27-12-2009
    Uruloke

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    timediff.vbs:

    Код:
    WScript.Quit (DateDiff("d", CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments.Item(0)).DateCreated, Now))

     
    timediff.bat:

    Код:
    @echo off  
    for %%a in (*.*) do (  
        set "fgh=%%a"  
        call :compare_crdate  
    )  
    goto :eof  
    :compare_crdate  
    cscript timediff.vbs "%fgh%"  
    if %errorlevel% gtr 14 echo "%fgh%" created more than 14 days ago

    Всего записей: 9 | Зарегистр. 28-01-2006 | Отправлено: 09:03 12-11-2009
    mugil_cephalus

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

    Цитата:
    вывод всех непустых строк файла s в файл, построчно:  
    for /f "delims=" %%a in ('type s') do 1>>file.txt echo.%%a

     
    этот код добавляет пустую строку на этапе echo - можешь сам проверить
     
    я это уже проверял:
    Цитата:
    я попробовал 2 способа:  
    D:\>(echo hi)>1  
     
    D:\>1>x echo hi  
     
    в обоих случаях в каждом файле добавляется лишняя пустая строка

     
      - между прочем, это твои рекомендации с 68-ой страницы
    Цитата:
    19w85
    Цитата:Есть вопрос, почему не происходит вывода в файл:  
     
    потому что пробел с цифрой перед >> трактуется как номер потока  
    есть два способа обхода, на выбор:  
     
    set "x=5"  
    (echo %x%)>>zz.txt  
    1>>xx.txt echo %x%  
     
    в отличие от варианта Elroir они делают что ожидаешь и при set "x=Section 1"

     
    а echoDot - это 3-ий вариант (от Elroir)
     
    Добавлено:
    BVV63

    Цитата:
    Больше понравился метод, предложенный Maqentaer на 67-й странице этой темы, с использованием wmic:  

    мне метода Maqentaer тоже понравилась

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 09:09 12-11-2009 | Исправлено: mugil_cephalus, 09:10 12-11-2009
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Uruloke
    Не пашет? Попробуй в timediff.vbs: заменить GetFile на GetFolder
    и ни в коем случае не называй батники именами команд!

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 09:35 12-11-2009 | Исправлено: king_stiven, 09:40 12-11-2009
    denisbobrov3

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день. Возникла проблема. Требуется подсчитать количество строк в файле. Сделал так:
    SET /A N=0
    FOR /F %%i IN (%1) DO SET /A N=N+1
     
    Проблема в том, что не считает пустые строки.

    Всего записей: 7 | Зарегистр. 12-11-2009 | Отправлено: 09:46 12-11-2009
    BVV63



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

    Цитата:
    мне метода Maqentaer тоже понравилась

    Угу, только он у меня не работает. Проблему я решил, но менее красиво, нежели этим методом. Выяснил, что прога now.exe из пакета "Windows Resource Kits" Win2K3 дату и время тоже всегда одним форматом выдаёт. Воспользовался ею, единственно, там месяц не в числовом виде передаётся, а тремя первыми буквами. Пришлось дополнительно установить 12 проверок.

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 10:07 12-11-2009
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    denisbobrov3
    sed -n "$=" 1.txt
    утилита sed в шапке

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 10:11 12-11-2009
    mugil_cephalus

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

    Цитата:
    Проблема в том, что не считает пустые строки.


    Цитата:
    F:\Documents and Settings\admin>for /?  
    Выполнение указанной команды для каждого файла набора.  
     
    .............................  
        Набор содержит имена одного или нескольких файлов, которые по очереди  
        открываются, читаются и обрабатываются. Обработка состоит в чтении  
        файла, разбивки его на отдельные строки текста и выделения из каждой  
        строки заданного числа подстрок (в том числе нуля). Затем найденная  
        подстрока используется в качестве значения переменной при выполнении  
        основного тела цикла. По умолчанию ключ /F выделяет из каждой строки файла  
        первое слово, очищенное от окружающих его пробелов. Пустые строки  
        в файле пропускаются.
    Необязательный параметры "ключи" служит для  
        переопределения заданных по умолчанию правил обработки строк. Ключи  
        представляют собой заключенную в кавычки строку, содержащую указанные  
        параметры. Ключевые слова:  
     
     .........................................  

     
    for'om не посчитаешь
     
    посмотри может fc сможет посчитать

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 10:17 12-11-2009 | Исправлено: mugil_cephalus, 10:19 12-11-2009
    denisbobrov3

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    В том то идело, что нельзя использовать сторонние утилиты...

    Всего записей: 7 | Зарегистр. 12-11-2009 | Отправлено: 10:22 12-11-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    denisbobrov3
    fc /N     -    Вывод номеров строк при сравнении текстовых файлов ASCII.

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 10:26 12-11-2009
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    denisbobrov3
    FIND /V /C "" 1.txt

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 10:28 12-11-2009
    mugil_cephalus

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

    Цитата:
    но у меня на Win 2W3 он отказался работать. Я стал выяснять, запустил из консоли (предварительно убрав один знак процента перед переменной), увидел сделующий ответ системы:  
    set datetime=20091112092002.412000+300  
    set datetime=  
    Т. е. переменной присваивается нужное значение, но откуда-то берётся вторая строка, которая уничтожает переменную. Кстати, проверил в Win 7, там конструкция вообще отказалась наотрез работать.


    Цитата:
    Когда используется в контексте пользователя, то всё OK, никаких проблем. Но мне нужно в запланированном задании, которое исполняется (по ряду причин) в контексте локальной системы. И под системой механизм не работает. Я в виде эксперимента запустил под системой (посредством AT) консоль и выяснил, что производимые изменения в реестре на запущенную копию консоли не влияют (именно, когда работа идёт под локальной системой), вот если из неё запустить вторую копию, то там эти изменения проявятся. Но заморачиваться с запуском второго пакетника, передачей туда-обратно параметров через файлы уж очень не хочется (не изящно  ).  
    Подскажите, почему у меня не работает метод Maqentaer получения даты посредством wmic? Или может кто ещё какой способ предложит?

     
    у тебя где-то ошибка, но проверить не могу - у меня win 5.1
    попробуй вместо at - schtasks - она гибче
    set datetime=20091112092002.412000+300  
    set datetime=  - это output, - попробуй for'om вырезать только 1-ую строку и использовать ее
     
    Добавлено:
    denisbobrov3
    да еще вариант king_stiven с FIND  
    еще можно findstr

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 10:31 12-11-2009
    denisbobrov3

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

    Цитата:
    FIND /V /C "" 1.txt

    Как то можно присвоить значение данного выражения переменной?

    Всего записей: 7 | Зарегистр. 12-11-2009 | Отправлено: 10:36 12-11-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    denisbobrov3
    set "var=FIND ^/V ^/C "" 1.txt"
     
    или set "var=FIND /V /C "" 1.txt" - у меня и так, без escape-символов, работает

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 10:38 12-11-2009 | Исправлено: mugil_cephalus, 10:45 12-11-2009
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    denisbobrov3
    Если последняя строка не пустая, то так можно:

    Код:

    for /f "tokens=1 delims=:" %%a in ('findstr /n "." test.txt') do set /a "linecount=%%a"

    Или из find /n /v "" test.txt вытащить, delims другой...
    О, страницу не обновил, тут уже ответили.

    Всего записей: 1704 | Зарегистр. 08-12-2004 | Отправлено: 10:40 12-11-2009 | Исправлено: igor_andreev, 10:42 12-11-2009
    denisbobrov3

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

    Цитата:
    или set "var=FIND /V /C "" 1.txt" - у меня и так, без escape-символов, работает

     у меня в результате  переменной var просто присваивается значение FIND /V /C "" 1.txt
    В смысле, не результат выражения FIND /V /C "" 1.txt, а именно набор символов "FIND /V /C "" 1.txt"

    Всего записей: 7 | Зарегистр. 12-11-2009 | Отправлено: 10:55 12-11-2009 | Исправлено: denisbobrov3, 10:56 12-11-2009
    mugil_cephalus

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

    Цитата:
    у меня в результате  переменной var просто присваивается значение FIND /V /C "" 1.txt  
    В смысле, не результат выражения FIND /V /C "" 1.txt, а именно набор символов "FIND /V /C "" 1.txt"

    for /f %%i in ('find /v /c "" 1.txt') do set "var=%%i"

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 11:03 12-11-2009
    BVV63



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

    Цитата:
    set datetime=  - это output, - попробуй for'om вырезать только 1-ую строку и использовать ее

    А как? У меня, честно говоря, очень мало опыта общения с конструкцией for... in... do... Я знаю, что можно пропустить строки сверху, используя skip. Но как отделаться от строк снизу?

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 11:08 12-11-2009
    mugil_cephalus

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

    Цитата:
    А как? У меня, честно говоря, очень мало опыта общения с конструкцией for... in... do... Я знаю, что можно пропустить строки сверху, используя skip. Но как отделаться от строк снизу?

     
    есть совет от Maqentaer

    Цитата:
    Цитата:И еще вопрос можно ли из вывода убить все строки кроме первой ?  
     
    можно примерно так.  
     
    Код:for .... do do call :_1 %%A &goto ext  
    :ext  
     

     
    http://forum.ru-board.com/topic.cgi?forum=62&topic=17154&start=1380#18
    но я не пробовал (у него кажется опечатка - двойной do)
    а вообще все зависит от конкретного output'a
    можно output if'om проверить: for in output do if
     
    for /f %%A in (output) do call :_1 %%A  
    goto :eof  
     
    :_1  
    if "%1" equ  
    if "%1" equ  
    goto :eof
     
    --------------------
    set datetime=20091112092002.412000+300  
    set datetime=  -  в такой конструкции с tokens=2 delims== получишь 20091112092002.412000+300
     
     p.s.
    повторюсь, все зависит от - смотря чего и откуда доставать

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 11:19 12-11-2009 | Исправлено: mugil_cephalus, 11:32 12-11-2009
    Maqentaer



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    да, опечатка.
    как посоветовал igor_andreev можно сделать так:

    Код:
    set "datetime="  
    for /f "skip=1" %%i in ('wmic os get LocalDateTime') do if not defined datetime set "datetime=%%i"

    или допустим так:

    Код:
    for /f "skip=1" %%i in ('wmic os get LocalDateTime') do set "datetime=%%i"&goto tdend
    :tdend

    или даже так:

    Код:
    for /f %%i in ('wmic os get LocalDateTime^|find "."') do set "datetime=%%i"

     
    просто мне не удалось протестировать на разных ОС, и у меня в WinXP SP2 Eng нету третьей пустой строки

    Всего записей: 71 | Зарегистр. 18-05-2008 | Отправлено: 11:34 12-11-2009 | Исправлено: Maqentaer, 11:38 12-11-2009
    denisbobrov3

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем спасибо, воспользовался конструкцией
    for /f "tokens=1 delims=:" %%a in ('findstr /n "." test.txt') do set /a "linecount=%%a"

    Всего записей: 7 | Зарегистр. 12-11-2009 | Отправлено: 11:35 12-11-2009
       

    Страницы: 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 109 110 111 112 113 114 115 116 117

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 7
    vu1tur (25-01-2010 12:41): лимит страниц, продолжение: http://forum.ru-board.com/topic.cgi?forum=62&topic=19668


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru