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

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

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

vu1tur (14-11-2006 16:59): http://forum.ru-board.com/topic.cgi?forum=62&topic=9040  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

hacsoft

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задачи на bat-файлах
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки:
· Cmd. Описание от разработчиков
· Набор GNU утилит для win32
· Встроенный справочник по командам: hh ntcmds.chm
· Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· cmdow — изменение параметров и видимости дос-окна
· blat — отправка почты из консоли
 
Готовые решения и частые вопросы:
· Создание листинга директорий на примере создания плейлиста
· Разименовывание переменных
· Переименовывание файлов по дате создания
· Запуск сетевого подключения
· Запуск bat файлов как сервис
· Пример выполнения команд по результату команды ping
· Использование даты на день раньше чем сегодня
 
Невозможности — что нельзя сделать с помощью командных файлов:
· изменть конфигурацию IP на удаленной машине (без помощи rcmd.exe) [добавил ALEF]
 
 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Старая версия первого сообщения

Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 22:58 18-11-2005 | Исправлено: Elroir, 05:50 11-11-2006
mikolamkn

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




:moderator: флуд

Всего записей: 15 | Зарегистр. 28-06-2006 | Отправлено: 16:41 29-06-2006 | Исправлено: mikolamkn, 13:01 30-06-2006
uZver



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Aroun
как я себе это вижу:
- настроить назначенное задание на комп., где будет проходить архивация ( Каждые 5минут/час/день)
- помимо самой архивации в батнике прописать
net use z:  \\{имя компа,куда будут сливатся архивы} {password} /USER:{login}
move *.* z:
net use z: /d

Всего записей: 195 | Зарегистр. 10-10-2003 | Отправлено: 19:24 29-06-2006
mikolamkn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть вот такая запись.
 
@echo off  
cls
 
set /B A=dir /B C:\Quorum\Cl_bank\CRYPT\*.*
echo %A%
 
copy C:\Quorum\Cl_bank\CRYPT\%A%\CFG.CFG не видит путь, точнее он думает что это
 
copy C:\Quorum\Cl_bank\CRYPT\CFG.CFG что делать?

Всего записей: 15 | Зарегистр. 28-06-2006 | Отправлено: 21:39 29-06-2006
cluster

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребят, такая задача. Есть плагин для Миранды IM (MsgExport) - экспортирует историю в *.txt В начале каждого файла - шапка с инфой контакта в формате:

Код:
------------------------------------------------
      History for
User      : 111
Protocol  : ICQ
UIN       : 246281652
FirstName :  
LastName  :  
Age       : 0
Gender    :  
e-mail    :  
Nick      :  
City      :  
State     :  
Phone     :  
Homepage  :  
- About -

В блокноте все двоеточия на одном уровне. Но там не табуляция, а пробелы. После двоеточия - один пробел.
Таких файликов накопилось штук двести.. хочется часть информации (User и UIN) из них вытащить в отдельный *.txt в формате:

Код:
User - UIN
User - UIN
..и т.д

Я примерно представляю, как это осуществить, но не хватает знаний в синтаксисе коммандных файлов. Помогите, плз.

Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 22:52 29-06-2006
Yuk



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cluster
Perl устроит? Вот сваял быстренько из заготовки:

Код:
use strict;
my $dirname = ".";
my @files;
my $file;
my $uid;
my $uin;
 
opendir (DIR, $dirname)
    or die "Can't open directory $dirname: $!";
@files = grep { /\.TXT/i && -f "$dirname/$_" } readdir (DIR);
 
open (OFILE, ">users.lst")
    or die "Cannot create file users.lst - $!\n";
print OFILE "User\tUIN\n";
 
foreach $file (@files) {
    open IFILE, '<', "$dirname/$file"
        or warn ("Can't open $file, $!\n")
        and next;
    print "$file\n";
    while (<IFILE>) {
        chop;
        if (/User      : (\w+)/) {
            $uid=$1;
            next;
        }
        if (/UIN       : (\d+)/) {
            $uin=$1;
            print OFILE "$uid\t$uin\n";
            next;
        }
    } # end of while
    close IFILE;
} # end of foreach
close OFILE;
closedir DIR;
print "Press ENTER key to close the output window ...";
my $pause = <STDIN>;

 
 
Добавлено:
Сохранить, например, в userexp.pl и запустить в директории с файлами. Естественно, подразумевается, что установлен ActivePerl.

Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 23:19 29-06-2006
VladimirKvach

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

Цитата:
с сетевого подключения \\center\tachki\tachka 1(всего их 20) будет архивироваться вся инфа на локальный комп с определенным ай-пи, причем скрипт должен запускаться НЕ на нем.Причем сетевое подключение может быть не доступно в какой-то момент времени, как сделать чттобы скрипт периодически проверял его на доступность?

 
Для себя вывел следуещее правило: Если надо что-то архивировать/копировать с машины, то и скрипт должен быть на этой машине, если что-то надо делать с данными на флешке, то и скрипт должен находиться на этой флешке, если что-то надо делать с файлами из архива, который надо скачивать, то и скрипт должен находиться в этом архиве. Так надежнее, потому что скрипт запустится только при доступности соответствующей машины/флешки, при небитости скачанного архива.

Всего записей: 23 | Зарегистр. 03-04-2006 | Отправлено: 05:34 30-06-2006
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mikolamkn
Комманда  
set /B A=dir /B C:\Quorum\Cl_bank\CRYPT\*.*  
задаёт переменной "/B A" значение "dir /B C:\Quorum\Cl_bank\CRYPT\*.*" (dir при этом не выполняется).
У меня такое чувство, что ты хотел совсем не этого. Где ты вообще взял эту "/B"?
Совершенно непонятно, что ты хотел получить. Если скопировать один и тот же файл из каждой папки в "C:\Quorum\Cl_bank\CRYPT\", то

Код:
 
pushd C:\Quorum\Cl_bank\CRYPT\
for /D %%i in (*) do copy "%%i\CFG.CFG" <куда надо>
popd
 

 
Любителям копировать что-либо по сети рекомендую почитать описание комманд pushd и popd - иногда бывает проще, чем net use.


----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 08:55 30-06-2006
cluster

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

Цитата:
Perl устроит?

нее, не очень. надо в *.cmd

Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 08:58 30-06-2006
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cluster
Поковырялся немного, получилось следующее:

Код:
 
@echo off
del res
for %%q in (txt*) do (
    for /f "tokens=2 delims=: skip=1" %%i in ('find "User" %%q') do echo User:%%i >> res
    for /f "tokens=2 delims=: skip=1" %%i in ('find "UIN" %%q') do echo UIN:%%i >> res
)
 

Выдаёт нечётных строках юзеров, в чётных - уины. В одну строку с наскока слепить не получилось.
Если кто знает, как вывести строку без перевода строки, скажите.
VladimirKvach

Цитата:
Для себя вывел следуещее правило:

Увы, это правило очень часто нельзя выполнить.

Цитата:
Так надежнее, потому что скрипт запустится только при доступности соответствующей машины/флешки, при небитости скачанного архива.
 

Это легко проверяется в самом батнике.
 
Добавлено:
cluster
Вообще, для обработки текста лучше использовать сторонние программы с поддержкой регексов. В консоли - grep, портированный с NIX, в GUI - PowerGREP (есть в программах).
Разбор текста средствами батника - не очень приятное занятие.

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 09:33 30-06-2006
mikolamkn

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

Цитата:
[/q][q]

 
огромное спасибо evle

Всего записей: 15 | Зарегистр. 28-06-2006 | Отправлено: 09:51 30-06-2006
uZver



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
evle
про pushd: не подскажите авторизацию поддерживает? не нашел

Всего записей: 195 | Зарегистр. 10-10-2003 | Отправлено: 10:32 30-06-2006
mikolamkn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
строка не работае помогите понять почему?  
for /D %%i in (*) do set %i:C:\ЧЧЧЧ\ЧЧЧЧ\crypt\%%i\ььь.тт=A:\ЧЧЧЧ\ЧЧЧЧ\crypt\%%i\ььь.тт%
работает только так
 
set %i:C:\=A:\%

Всего записей: 15 | Зарегистр. 28-06-2006 | Отправлено: 12:50 30-06-2006 | Исправлено: mikolamkn, 12:56 30-06-2006
VladimirKvach

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

Цитата:
Цитата:Для себя вывел следуещее правило:  
 
Увы, это правило очень часто нельзя выполнить.  

 
Не конкретное утверждение
 
 
 

Цитата:
Цитата:Так надежнее, потому что скрипт запустится только при доступности соответствующей машины/флешки, при небитости скачанного архива.  
 
 
Это легко проверяется в самом батнике.

 
1) в случае архивирования данных батник должен быть на этой же машине в основном для скорости
2) в случае автообмена данных через флешку батник должен быть на этой же флешке, чтобы его можно было в если понадобится легко исправить получив флешку, без поездки в другой конец города
3) в случае батника в архиве - это просто удобно. Скачал юзер архив с каким либо обновлением, запустил, стартовал батник, все сделал и самоуничтожился. Опять же каждый раз мы можем менять батник как хотим у себя а не в командировке у получателя.

Всего записей: 23 | Зарегистр. 03-04-2006 | Отправлено: 14:16 30-06-2006
cluster

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

Цитата:
Выдаёт нечётных строках юзеров, в чётных - уины. В одну строку с наскока слепить не получилось.

честно говоря, и так сойдёт.. но у меня не получается. если нет файла res, не работает. создаю предварительно res, в результате ничего не обнаруживаю. удаляю строку del res - тоже ничего..

Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 14:17 30-06-2006
mikolamkn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
@echo on  
cls
pushd E:\Cl_bank\CRYPT\  
for /D %%i in (*) do md a:\crypt\%%i
for /D %%i in (*) do copy /Y "E:\Cl_bank\CRYPT\%%i\CFG.CFG"  a:\crypt\%%i\*.*
for /D %%i in (*) do copy /Y "E:\Cl_bank\CRYPT\%%i\secret.key"  a:\crypt\%%i\*.*
 
for /D %%i in (*) do rename  a:\crypt\%%i\cfg.cfg  cfg1.cfg  
for /D %%i in (*) do for /f "tokens=*" %%a in ('more^<a:\crypt\%%i\cfg1.cfg') do call :_replace %%a  
goto eof  
:_replace  
set i=%*  
echo %i %
for /D %%i in (*) do set i=%i:C:\quorum\cl_bank\crypt\%%i\secret.key =A:\quorum\cl_bank\crypt\%%i\secret.key % <- не работает. подскажите как?
for /D %%i in (*) do echo %i%>>a:\crypt\%%i\cfg.cfg
rem for /D %%i in (*) do del a:\crypt\%%i\cfg1.cfg
for /D %%i in (*) do copy  /Y a:\crypt\%%i\cfg.cfg c:\quorum\cl_bank\crypt\%%i\cfg.cfg
goto eof
popd
:eof  

Всего записей: 15 | Зарегистр. 28-06-2006 | Отправлено: 18:04 30-06-2006 | Исправлено: mikolamkn, 18:05 30-06-2006
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
uZver

Цитата:
про pushd: не подскажите авторизацию поддерживает? не нашел

Скорее всего нет.
VladimirKvach
Очень часто компьютер или архив, на (в) котором надо что-то сделать, лицом, пишущим батник, не контролируется. При архивации на флешку иногда неудобно держать батник на флешке, поскольку могут применяться разные флешки. Словом, мысли правильные, но в такой категорической форме ("должен") не всегда работают.
cluster
Если ты не заметил, строчка  

Код:
 
 for %%q in (txt*) do (  
 

Перебирает файлы по маске (у меня файлы лежали в той же папке, что и батник и их надо было как-то отличать). Поменяй на свою.
mikolamkn
Я пока не очень понял, что должно происходить во второй половине батника, но в порядке телепатии: прочитай справку по команде set в части про позднее связывание. Возможно, что нужно использовать "!" вместо "%".

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 18:33 30-06-2006
kirillmkn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
<- не работает. подскажите как?  
for /D %%i in (*) do echo %i%>>a:\crypt\%%i\cfg.cfg  
rem for /D %%i in (*) do del a:\crypt\%%i\cfg1.cfg  
for /D %%i in (*) do copy  /Y a:\crypt\%%i\cfg.cfg c:\quorum\cl_bank\crypt\%%i\cfg.cfg  
goto eof  
popd  
:eof    
 
 
в этой строке происходит замена пути( строки) в файле, а точнее буквы с c:\ На a:\
 
for /D %%i in (*) do set i=%i:C:\quorum\cl_bank\crypt\%%i\secret.key =A:\quorum\cl_bank\crypt\%%i\secret.key %
 
 
 
файл cfg.cfg
 
                     c:\
secret.key   = c:\quorum\cl_bank\crypt\1111\secret.key
                     
                     c:\
 
 
_________________
 
                     c:\
secret.key   = A:\quorum\cl_bank\crypt\1111\secret.key
                     
                     c:\
 

Всего записей: 1 | Зарегистр. 01-02-2006 | Отправлено: 22:40 30-06-2006 | Исправлено: kirillmkn, 22:46 30-06-2006
cluster

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

Цитата:
у меня файлы лежали в той же папке, что и батник и их надо было как-то отличать). Поменяй на свою

я как бы в каталог с *.txt и кидал этот батник. Немного поправил:

Код:
@echo off
if EXIST +results.log del +results.log
for %%q in (*.txt) do (
    for /f "tokens=2 delims=: skip=1" %%i in ('find "User" %%q') do echo User:%%i >> +results.log
    for /f "tokens=2 delims=: skip=1" %%i in ('find "UIN" %%q') do echo UIN:%%i >> +results.log
    for /f "tokens=2 delims=: skip=1" %%i in ('find "Protocol" %%q') do echo --- >> +results.log
)

Осталось пара вопросов:
1. батник не понимает файлы с более чем одним словом в имени файла. Пробовал в скрипте
Код:
for %%q in ("*.txt") do (
Не помогло.
 
2. Бывают оч большие файлы истории, а батник ищет (например слово UIN) по всему файлу - оч-оч долго. И если встречает в истории слово UIN, то и его записывает в +results.log. Как ограничить скрипт скажем пока он не найдёт слово Age? Типа:
Код:
-for -/f -"tokens=2 -delims=: -skip=1" -%%i -in -('find -"Age" -%%q') -do идём к следующему файлу


Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 23:28 30-06-2006
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cluster

Цитата:
я как бы в каталог с *.txt и кидал этот батник.

У меня маска стояла не "*.txt", а "txt*"

Цитата:
батник не понимает файлы с более чем одним словом в имени файла

Кавычки надо было вставлять не в маску, она и так прекрасно работает, а вот команде find они нужны:

Код:
 
for /f "tokens=2 delims=: skip=1" %%i in ('find "User" "%%q"') do echo User:%%i >> +results.log  
 

Далее по аналогии

Цитата:
Бывают оч большие файлы истории, а батник ищет (например слово UIN) по всему файлу - оч-оч долго.

Я предполагал подобный вопрос, но не думал, что подобную конструкцию понадобится запускать более одного-двух раз, а при одноразовом применении оптимизировать код обычно ни к чему.
Можно попробовать конструкцию:

Код:
 
for ... do command1 & goto label1
:label1
for ... do command2 & goto label2
:label2
 

Не проверял, но может сработать. Если будет работать также медленно, значит find выдаёт все результаты сразу. Чем заменить - не знаю.
Однако, повторю, это не очень удачное применение инструментов. c grep получилось бы проще и быстрее.
 


----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 06:35 01-07-2006
cluster

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

Цитата:
У меня маска стояла не "*.txt", а "txt*"  

я знаю! пробовал твой скрипт в оригинале - не получилось. твоя маска работает только в кавычках..

Цитата:
Кавычки надо было вставлять не в маску, она и так прекрасно работает, а вот команде find они нужны:

а вот это не помогает! он спотыкается на имени файла, а не на имени в icq (USER)

Цитата:
Можно попробовать конструкцию:

я это понимаю, но вот не знаю, как дать команду, чтоб скрипт переходил на след. файл.
Работать же не будет, если:

Код:
:label1
for %%q in (*.txt) do (  
....
    for /f "tokens=2 delims=: skip=1" %%i in ('find "Age" %%q') do goto label1


Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 11:37 01-07-2006
   

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

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах
vu1tur (14-11-2006 16:59): http://forum.ru-board.com/topic.cgi?forum=62&topic=9040


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru