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

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



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

    Цитата:
    for /d %%a in ( C:\Folder\* ) do rd /q /y "%%a\killme"  

     
    то, что нужно . Спасибо
     
    P. S. маленькая поправочка for /d %%a in ( C:\Folder\* ) do rd /q /s "%%a\killme"

    Всего записей: 49 | Зарегистр. 22-10-2008 | Отправлено: 01:25 11-11-2009
    Maximus777

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

    Цитата:
    проверять наличие файла можно так  
    if exist "файл" (

    Файл то через интернет проверяется. Про exist я знаю.
     

    Цитата:
    или используй вариант If not errorlevel 1 (

    Вот это мне подходит в самый раз.
     
    Спасибо всем за ответы.

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 06:33 11-11-2009
    mugil_cephalus

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

    Цитата:
    Цитата:если не ошибаюсь, то скрипт "выдирает" таки пустую строку из source файла  
     
    напечатай что-то после выхода из цикла да посмотри.  
     

     

    Код:
     
    echo on
    for /f "tokens=*" %%i in ('type w:\1.txt') do echo %%i
    date /t
     

     
    листинг:
    F:\Documents and Settings\admin>cd /d w:
     
    W:\>batch.bat
     
    W:\>echo on
     
    W:\>for /F "tokens=*" %i in ('type w:\1.txt') do echo %i
     
    W:\>echo _text_
    _text_
     
    W:\>date /t
    Wed 11/11/2009
     
    W:\>

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Посмотрел все, что было по дате/времени, но решения не придумал.
    Надо удалять каталоги более чем недельной (допустим) давности. Два варианта: либо смотреть по дате создания, либо смотреть по имени вида arc_ddmmyyhhmmss.  
    Что можете подсказать?

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Uruloke
    А в шапке?  
    http://forum.ru-board.com/topic.cgi?forum=62&topic=17154&start=379&limit=1&m=1#1

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

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

    Цитата:
    Народ помогите, данный вопрос уже не раз проскакивал но не где не был дан ответ.
    Сам ток начал изучать батники и скриптовое дело но мозгов пока не хватает для решения данной задачи.
    1. Разработать командный файл, который формировал бы ежемесячный отчет об изменениях в рабочем каталоге (файлы созданные, удаленные). Необходимо хранить список файлов в файле истории.
    2. Выполняющий в зависимости от ключа один из 3-х вариантов работы:
     - с ключом /n дописывает в начало указанных текстовых файлов строку с именем текущего файла;
     -  с ключом /b создает резервные копии указанных файлов;
     -  с ключом /d удаляет указанные файлы после предупреждения.
    Количество обрабатываемых файлов может быть переменным и задаваться в качестве параметров.  

     
    первый вопрос решил вроде, а вот со 2-м   как добавлять параметры к батнику найти не могу
    ВЫРУЧАЙТЕ  

    Всего записей: 3 | Зарегистр. 06-11-2009 | Отправлено: 13:26 11-11-2009
    mugil_cephalus

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

    Цитата:
    От знака перевода строки легко избавляет "set /p"  
     
    Код:  
    0>nul 1>file.txt set /p="Some string here"  

     
    а как это реализовать в батнике?
    я попробовал след. код в консоли:
     
    W:\>0>nul 1>d set /p=<s
     
    файл d - пустой (в файле s - _text_ и пустая строка)
     
    если с клавы вводить, то для 100.000 файлов трудно
     
    Добавлено:
    dvcher
    if "%1" equ "n" чего делать

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mugil_cephalus
    Ты для себя спрашиваешь или кому помогаешь?
    for /f "usebackq tokens=*" %%i in ("str.txt") do 0>nul 1>str.txt set /p="%%i"
    только если в str.txt одна строка плюс перевод строки

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



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

    Цитата:
    а как это реализовать в батнике?  

    Не понял с твоим примером:

    Цитата:
     
    0>nul 1>d set /p=<s  
     

    У меня все получается. Если в файл "d" надо записать "<s" то:

    Код:
     
    @echo off
    0>nul 1>d set /p="<s"
     

    Или так:

    Код:
     
    @echo off
    setlocal
    set "string=<s"
    0>nul 1>d set /p="%string%"  
     

     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 14:20 11-11-2009 | Исправлено: 01MDM, 14:21 11-11-2009
    dvcher

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mugil_cephalus
    if "%1" equ "n" чего делать
     
     
    а можно по подробней чет не выходит  
     
     
    создать командный файл выполняющий в зависимости от ключа один из 3-х вариантов работы:
     - с ключом /n дописывает в начало указанных текстовых файлов строку с именем текущего файла;
     -  с ключом /b создает резервные копии указанных файлов;
     -  с ключом /d удаляет указанные файлы после предупреждения.

    Всего записей: 3 | Зарегистр. 06-11-2009 | Отправлено: 14:54 11-11-2009 | Исправлено: dvcher, 14:56 11-11-2009
    Uruloke

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

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

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    в файл d надо записать содержимое файла s (файл s - строка1:_text_ и строка2:пусто) без пустой строки, то есть файл d должен иметь всего одну строку - с текстом и не иметь пустой
    set /p=<s - наверное синтаксисч неверен, это я подразумевал ввод из файла s
     
    king_stiven
    исходная задача ( http://forum.ru-board.com/topic.cgi?forum=62&topic=17154&start=1360#19 ):

    Цитата:
    Здравствуйте. Помогите пожалуйста сделать такие батники:  
    1) есть 100 текстовых файлов, пронумерованных от 1.txt до 100.txt. В каждом файле 1 слово и пустая строка, так вот как можно удалить эту пустую строку.    
     

     

    Цитата:
    1) файлы в которых надо удалить пустую строку находятся в С:\test  

     
    --------------------------------
    01MDM
    king_stiven
     
    вот так я "выдирал" пустую строку
    Цитата:
     
     
    Код:  
    echo on  
    for /f "tokens=*" %%i in ('type w:\1.txt') do echo %%i  
    date /t  
     
     
     
    листинг:  
    F:\Documents and Settings\admin>cd /d w:  
     
    W:\>batch.bat  
     
    W:\>echo on  
     
    W:\>for /F "tokens=*" %i in ('type w:\1.txt') do echo %i  
     
    W:\>echo _text_  
    _text_  
     
    W:\>date /t  
    Wed 11/11/2009  
     
    W:\>

     
    , но при вставке _text_ в *.txt добавлялась пустая строка
     
    Добавлено:
    king_stiven

    Цитата:
    for /f "usebackq tokens=*" %%i in ("str.txt") do 0>nul 1>str.txt set /p="%%i"

    а так можно, консоль не затребует set без /p, ведь set /p - для ввода с клавы?  
     
    Добавлено:
     
     
     
    01MDM
    king_stiven
     
    вообще для soft111 я составил код, который, как я понимаю, выдирает пустую строку из source-txt , но вставляет ее снова
    echo on
    for %%A in (C:\test\*.txt) do call:_1 %%A
    goto :eof
     
    :_1
    for /f "tokens=*" %%i in ('type %1') do (echo %%i>C:\test\%~n1_.txt && del /q %1 && ren C:\test\%~n1_.txt %~nx1)
    goto :eof
     
    просто с такой экзотикой (для меня) как  удаления CR,LF не сталкивался...
     
    Добавлено:
    dvcher
    Уильям Станек - Командная строка Microsoft Windows ( http://rapidshare.com/files/89629093/Stanek_CLI_MS_Win.rar ) - посм. страницу 50-54 и 63-67 и 181 книги (а не *.pdf-файла)
     
    Добавлено:
    01MDM
    king_stiven
     
    проверил в command-line mode такой код от king_stiven W:\>for /F "tokens=*" %i in ('type 1.txt') do 0>nul 1>str.txt set /p="%i" - работает  
     
    Добавлено:
    soft111
    попробуй (сначала в черновую, шоб не попортить):
     

    Код:
    echo on
    for %%A in (C:\test\*.txt) do call:_1 %%A
    goto :eof
     
    :_1
    for /f "tokens=*" %%i in ('type %1') do 0>nul 1>C:\test\%~n1_.txt set /p="%%i" && del /q %1 && ren C:\test\%~n1_.txt %~nx1
    goto :eof
     

     
    Добавлено:
    bigfoothart

    Цитата:
    Цитата:  
    for /f "tokens=3" %%A in ('"net use \\192.168.0.10\c$ 111 /USER:admin"') do echo _%%A_  
     
     
     
    при успехе пишет " _успешно_ ", при ошибках, не выводит даже __ .  

     странно... ведь  3-ий токен берем:
    Цитата:
    "Системная ошибка 1326.  
     
    Вход в систему не произведен: имя пользователя или пароль не опознаны."  

     
    delims=xxx      - определение набора разделителей для замены заданных
                      по умолчанию пробела и знака табуляции.
     
    должон написать _1326._ (точку потом можно было бы "отрезать")
     
    А это листинг из консоли или из log'a? Во втором случае нужно ...>log 2>&1
     
    Добавлено:
    dvcher

    Цитата:
    создать командный файл выполняющий в зависимости от ключа один из 3-х вариантов работы:  
     - с ключом /n дописывает в начало указанных текстовых файлов строку с именем текущего файла;

    вызов батника делай не как *.exe /key1, а *.bat arg1 - без slash'a

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 15:32 11-11-2009 | Исправлено: mugil_cephalus, 16:03 11-11-2009
    01MDM



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

    Цитата:
    в файл d надо записать содержимое файла s (файл s - строка1:_text_ и строка2:пусто) без пустой строки


    Код:
     
    @echo off
    setlocal
     
    0<c set /p "string="
    0>nul 1>d set /p="%string%"  
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 17:16 11-11-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dvcher
    вот можешь еще посмотреть http://forum.ru-board.com/topic.cgi?forum=5&topic=25393&start=294&limit=1&m=1#1  
     
    Добавлено:
    01MDM

    Цитата:
    Код:  
    @echo off  
    setlocal  
     
    0<c set /p "string="  
    0>nul 1>d set /p="%string%"  
     

    спасибо, у soft111 файлов много (думаю 100.000), думаю использовать такой код
    Цитата:
    Код:echo on  
    for %%A in (C:\test\*.txt) do call:_1 %%A  
    goto :eof  
     
    :_1  
    for /f "tokens=*" %%i in ('type %1') do 0>nul 1>C:\test\%~n1_.txt set /p="%%i" && del /q %1 && ren C:\test\%~n1_.txt %~nx1  
    goto :eof  
     

    у меня, по крайней мере, лексема for /f "tokens=*" %%i in ('type %1') do 0>nul 1>C:\test\%~n1_.txt set /p="%%i" работает (в плане использования set /p), то есть из source-txt в destination-txt попадает только строка с текстом - без пустой строки
     
    Добавлено:
    01MDM
    кстати, хотел спросить, что означает поток № 0 ? впервые столкнулся. всегда видел в скриптах потоки №№ 1 и 2. предполагаю, что это сдвиг: 0 - standardOutput, 1 - errorsOutput

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 17:18 11-11-2009
    01MDM



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

    Цитата:
    кстати, хотел спросить, что означает поток № 0 ?

     
    0 - STDIN (ввод)
    1 - STDOUT (вывод)
    2 - STDERR (ошибки)
    3-9 - Предопределяемые
     
    Потоки можно перенаправлять и создавать новый поток на выходе из штатного:

    Код:
     
    @echo off
    echo qwerty 3>1.TXT 1>&3
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 17:58 11-11-2009 | Исправлено: 01MDM, 18:01 11-11-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    спасибо
     
    STD - standard...

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Uruloke
    Скопируй из ссылкы. что я тебе давал пример. вставь сюда. разберём под каталоги.
    mugil_cephalus
    Ну на этот вопрос я ответил, правда только для одного файла, для множества по моему ты сам сможешь сделать, а вообще то автор молчит, ему это уже не надо, или он воспользовался командой ech

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

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

    Цитата:
    или он воспользовался командой ech

    сомневаюсь:
    Цитата:
    Мне нужно, чтобы эти действия отрабатывались быстро и без моего участия, есть одна прога на примете, но у нее уходит время на обработку (100 файлов около 15 сек), через батник думаю намного быстрее бы получилось

    хотя кто знает... думаю он уже долго капает этот вопрос и файлов у него >1.000.000
    p.s.
    хотя battch медленно отрабатывают - ему на wsh бы

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mugil_cephalus
    ну то есть замечательно видим что никакого лишнего прохода для пустой строки цикл не дает.  
    молодец, возьми с полки пирожок
     

    Цитата:
    в файл d надо записать содержимое файла s (файл s - строка1:_text_ и строка2:пусто) без пустой строки  
    т.е. надо понимать что файл s из двух строк, в сумме  _text_CRLFCRLF
     
    вывод всех непустых строк файла s в файл, построчно:
    for /f "delims=" %%a in ('type s') do 1>>file.txt echo.%%a
    Вывод всех непустых строк файла в одну незавершенную строку файла
    for /f "delims=" %%a in ('type s') do 0<nul 1>>file2.txt set /p=%%a
     
     
    Добавлено:
    как сделать удаление строк из файла, начиная со строки содержащей подстроку string1 и заканчивая (включительно) первой после string1 строкой содержащей string2 ?
    наличие в строках символов <>  - гарантировано

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 23:02 11-11-2009 | Исправлено: wolf0425, 03:01 12-11-2009
    BVV63



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Снова подниму вопрос по получению даты в нужном формате.
    В шапке есть ссылка на совет igor_andreev:
    http://forum.ru-board.com/topic.cgi?forum=5&topic=25393&start=347&limit=1
    но мне кажется, что данный способ хоть и весьма остроумен и изобретателен, но всё ж уж больно неизящен. Больше понравился метод, предложенный Maqentaer на 67-й странице этой темы, с использованием wmic:
    for /f "skip=1" %%i in ('wmic os get LocalDateTime') do set datetime=%%i
    и т. д., но у меня на Win 2W3 он отказался работать. Я стал выяснять, запустил из консоли (предварительно убрав один знак процента перед переменной), увидел сделующий ответ системы:
    set datetime=20091112092002.412000+300
    set datetime=
    Т. е. переменной присваивается нужное значение, но откуда-то берётся вторая строка, которая уничтожает переменную. Кстати, проверил в Win 7, там конструкция вообще отказалась наотрез работать.
    Попытался решить своим методом (кстати, может кому пригодится):
     
    :Сохранить текущий формат даты
    for /f "skip=1 tokens=3" %%A in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set CurrentDateFormat=%%A
    :Установить свой формат даты
    reg add "HKCU\Control Panel\International" /f /v sShortDate /t REG_SZ /d "свой формат"
    ...
    :Получить дату в нужном формате
    DATE /T > (или >>)...
    :или
    for /f %%A in ('DATE /T') do set LocalDate=%%A
    ...
    :Восстановить преждний формат даты
    reg add "HKCU\Control Panel\International" /f /v sShortDate /t REG_SZ /d "%CurrentDateFormat%"
     
    Когда используется в контексте пользователя, то всё OK, никаких проблем. Но мне нужно в запланированном задании, которое исполняется (по ряду причин) в контексте локальной системы. И под системой механизм не работает. Я в виде эксперимента запустил под системой (посредством AT) консоль и выяснил, что производимые изменения в реестре на запущенную копию консоли не влияют (именно, когда работа идёт под локальной системой), вот если из неё запустить вторую копию, то там эти изменения проявятся. Но заморачиваться с запуском второго пакетника, передачей туда-обратно параметров через файлы уж очень не хочется (не изящно ).
    Подскажите, почему у меня не работает метод Maqentaer получения даты посредством wmic? Или может кто ещё какой способ предложит?

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 08:05 12-11-2009 | Исправлено: BVV63, 08:10 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