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

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

Модерирует : gyra, Maz

Widok (10-03-2009 12:39): Лимит страниц. Продолжаем здесь.  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

Widok



Moderator-Следопыт
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Командная строка, батники\сценарии (bat, cmd)
(часть 1)
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Microsoft Windows » Задачи на bat-файлах 5
 
Полезные ссылки:
· Cmd. Описание от разработчиков
· Урок bat-аники (для начинающих)
· Курс лекций для начинающих. Полезно и просто описано
· Набор GNU утилит для win32
· Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· cmdow — изменение параметров и видимости дос-окна
· blat — отправка почты из консоли
· Справка по командам в виде Html
· Команды RunDll32
· Quick Batch File Compiler - Позволяет превратить ваш батник в независимое приложение
· Пример - получение и обработка списка пользователей
· Уильям Станек - Командная строка Microsoft Windows (вплоть до w2k3)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек)
 
Старая версия первого сообщения

Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 12:08 19-11-2007 | Исправлено: Dmitriy05, 22:49 13-04-2008
LeshiyAlex

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

Цитата:
Приведи пример этого файла
 

Первый Подробнее...
одного варианта наверное мало, чтоб понять, приведу ещё один:
Второй Подробнее...

Всего записей: 7 | Зарегистр. 30-06-2006 | Отправлено: 20:59 15-04-2008 | Исправлено: LeshiyAlex, 22:26 15-04-2008
zurk798

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ПОМОГОТЕ, ПОЖАЛУЙСТА. Подскажите программу для составления гербов. СРОЧНО НУЖНО.

Всего записей: 9 | Зарегистр. 15-04-2008 | Отправлено: 21:05 15-04-2008
Elroir



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

Цитата:
Нужно получить список строк с самыми свежими файлами ([имя файла] )  
Прикидваю что нужно for-ом бежать по обоим файлам, но вот пока только не знаю как сравнивать дату время....

И никто не знает.  
Я, конечно, утрирую, но сравнивать в командной строке (читай в батниках) дату и время очень сложно.
 
Добавлено:
LeshiyAlex
Можно ли предположить, что после списка файлов и строчек с пробелами, всегда идет строка "и.о. Директора РЦИ                    X.X. Фио дира"? (На самом деле, меня интересует, можно ли взять слово "Директор", как признак окончания блока с файлами)

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

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 21:32 15-04-2008
LeshiyAlex

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

Цитата:
Можно ли предположить, что после списка файлов и строчек с пробелами, всегда идет строка "и.о. Директора РЦИ                    X.X. Фио дира"? (На самом деле, меня интересует, можно ли взять слово "Директор", как признак окончания блока с файлами)
 

да так и есть, пишется либо и.о. Директора, либо просто Директор

Всего записей: 7 | Зарегистр. 30-06-2006 | Отправлено: 22:27 15-04-2008
Nicka_Grey

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Elroir
ну ок
а какие возможные варианты?
И проще написать свою тулзень?

Всего записей: 1282 | Зарегистр. 04-01-2003 | Отправлено: 23:35 15-04-2008
01MDM



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

Цитата:
 
[имя файла] [время] [дата]
 

Это все как есть? В квадратных скобках?

Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 00:11 16-04-2008
Nicka_Grey

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
01MDM
не
полностью такое
test.xml 17:17:26 11/03/2008  
test.xml 14:22:56 11/03/2008  
или
test2.xml 21:03:30 12/03/2008  
test2.xml 14:22:56 13/03/2008  

Всего записей: 1282 | Зарегистр. 04-01-2003 | Отправлено: 00:34 16-04-2008
01MDM



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Nicka_Grey
 
Так будет сложнее, если в именах файлов есть пробелы.

Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 00:39 16-04-2008
Nicka_Grey

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
01MDM
Пока вроде файлов пробелами в имени нет
Но при надобности могу сделать разделитель между 3-мя этими значениями и другой

Всего записей: 1282 | Зарегистр. 04-01-2003 | Отправлено: 01:11 16-04-2008
Elroir



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

Код:
 
...
::Твой код для нахождения файла.  
::После него в переменной F_F должно быть название файла
...
chcp 1251>nul
copy /y KOMBANK.TXT KOMBANK.BAK >nul 2>&1  
del /q KOMBANK.TXT 2>nul
for /f "tokens=1 delims=[] " %%b in ('type "%F_F%" ^| find /n "KOMBANK:"') do call :get_files "%F_F%" "%%b"  
goto :EOF
:get_files
for /f "usebackq skip=%~2 tokens=1,2*" %%c in (%1) do (
(echo %%c %%d | find "Директор">nul) && goto :EOF
if /i "%%c"=="Файл" (if not "%%d"=="" echo %%d>>KOMBANK.TXT) else (echo %%c>>KOMBANK.TXT)
)
 


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

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 03:21 16-04-2008
01MDM



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Nicka_Grey
 
Если правильно понял: надо сравнить два списка и выбрать из них более свежие файлы с одинаковыми названиями

Код:
 
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-3" %%i in (1.txt) do (
    
    set name1=%%i
    call:prep %%j %%k
    set time1=!time:~-6,6!
    set date1=!date!
 
    for /f "tokens=1-3" %%i in (2.txt) do (
        
        set name2=%%i
        call:prep %%j %%k
        set time2=!time:~-6,6!
        set date2=!date!
         
        if !name2!==!name1! (
            
            set name-!date1!!time1!-1=!name1!-1.txt
            set name-!date2!!time2!-2=!name2!-2.txt
            
            for /f "tokens=2 delims==" %%i in ('set name ^| sort /r') do (
                set res=%%i
            )
            echo !res!
        )
          set name-!date1!!time1!-1=
          set name-!date2!!time2!-2=
    )
       set name1=
    set name2=
)
goto:eof
 
:prep
for /f "tokens=1-3 delims=:" %%i in ("%1") do set time=0%%i%%j%%k
for /f "tokens=1-3 delims=/" %%i in ("%2") do set date=%%k%%j%%i
 
 

PS. Без пробелов и служебных символов.

Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 03:26 16-04-2008 | Исправлено: 01MDM, 03:29 16-04-2008
Elroir



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

Цитата:
ну ок  
а какие возможные варианты?  
И проще написать свою тулзень?

Первая мысь, которая мне пришла в голову - это, именно, написать утилитку на каком-либо из языков программирования высокого уровня. В них есть готовые библиотеки для работы с датой и временем, и в том числе, для сравнения.
 
P.S. Судя по всему - 01MDM решил это сделать в батнике. "Безумству храбрых поем мы песни"
 
01MDM
Красивое решение! Про sort я и забыл...

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

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 03:32 16-04-2008 | Исправлено: Elroir, 03:48 16-04-2008
LeshiyAlex

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

Цитата:
LeshiyAlex
Тогда так:  

в результате выполнения в файле KOMBANK.TXT собрались первые слова.

Цитата:
Файл
Директор
Исп.
Тел.

Всего записей: 7 | Зарегистр. 30-06-2006 | Отправлено: 07:05 16-04-2008
Elroir



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LeshiyAlex
Не сработало сравнение со словами на русском языке (Файл, Директор).
У меня оба тестовых файла были обработаны правильно.
Попробуй убрать из кода строчку "chcp 1251>nul ".


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

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 07:21 16-04-2008
LeshiyAlex

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Elroir
Точно дело было в кодировке, а можно расшифровать, что где делает в этой процедуре?

Цитата:
:get_files
for /f "usebackq skip=%~2 tokens=1,2*" %%c in (%1) do (
(echo %%c %%d | find "Директор">nul) && goto :EOF
if /i "%%c"=="Файл" (if not "%%d"=="" echo %%d>>KOMBANK.TXT) else (echo %%c>>KOMBANK.TXT)
)

особенно интересует - skip=%~2 ?
Добавлено:
А вот ещё такой вариант файла Подробнее...
как сделать чтоб и он тоже обрабатывался, если попадает со всеми.
если как сейчас то в KOMBANK.TXT попадает слово "архивный"
 
Добавлено:
и ещё одна проблема всплыла, когда фалов несколько перечислено, то указывается слово "Файлы", оно соответственно не сравниваясь залетает в KOMBANK.TXT
Вот пример файла Подробнее...

Всего записей: 7 | Зарегистр. 30-06-2006 | Отправлено: 07:48 16-04-2008 | Исправлено: LeshiyAlex, 10:02 16-04-2008
Nicka_Grey

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
01MDM
Спасибо
мыслю понял приблизительно
Хотя вот это
Цитата:
for /f "tokens=2 delims==" %%i in ('set name ^| sort /r')  

как то не до конца...

Всего записей: 1282 | Зарегистр. 04-01-2003 | Отправлено: 14:12 16-04-2008
01MDM



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

Цитата:
как то не до конца...

 
Сначала создается псевдомассив из переменных:
 

Код:
 
set name-!date1!!time1!-1=!name1!-1.txt
set name-!date2!!time2!-2=!name2!-2.txt  
 

 
А потом его вывод сортируется.
 
Попробуй выполнить set p - будут выведены все переменные начинающиеся на "p",
а здесь выводятся переменные начинающиеся на "name"

Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 14:28 16-04-2008
Nicka_Grey

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
01MDM
Теперь все прояснилось
Большое спасибо за помощь!

Всего записей: 1282 | Зарегистр. 04-01-2003 | Отправлено: 14:42 16-04-2008
Elroir



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

Цитата:
особенно интересует - skip=%~2 ?

В строчке:
for /f "tokens=1 delims=[] " %%b in ('type "%F_F%" ^| find /n "KOMBANK:"') do call :get_files "%F_F%" "%%b"
я нахожу номер строки, содержащей слово "KOMBANK" и передаю этот номер в блок обработки файла (второй аргумент командной строки в виртуальном батнике get_files). Директива skip=n, используется чтобы пропустить первые н строк разбираемого файла.
Соответственно, skip=%~2 - пропускает именно то кол-во строк, которое надо.
 
Вот обновленный код:

Код:
 
:get_files
for /f "usebackq skip=%~2 tokens=1,2,3" %%c in (%1) do (
echo c=%%c * d=%%d * e=%%e
(echo %%c %%d | find "Директор">nul) && goto :EOF
if /i "%%c"=="Файл" (echo %%d>>KOMBANK.TXT) else (
if /i "%%c"=="Файлы" (echo %%d>>KOMBANK.TXT) else (
if /i "%%c"=="архивный" (echo %%e>>KOMBANK.TXT) else (
if /i "%%c"=="архивные" (echo %%e>>KOMBANK.TXT) else (
echo %%c>>KOMBANK.TXT
))))
)
 


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

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 02:25 17-04-2008
LeshiyAlex

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Elroir
 
Огромное спасибо, всё прекрасно работает!!!
 
а можно ещё маленький вопросик, как сделать быструю проверку тот или не тот файл, т.е. есть ли упоминание KOMBANK в файле или нет?
в например таком формате  

Цитата:
ЕСЛИ есть строка KOMBANK то делай ВСЮ ПРОЦЕДУРУ, а ЕСЛИ НЕТ то удали файл

Всего записей: 7 | Зарегистр. 30-06-2006 | Отправлено: 12:50 17-04-2008
   

Страницы: 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 » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd) 2
Widok (10-03-2009 12:39): Лимит страниц. Продолжаем здесь.


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru