Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Формирование списка.

Ответить
Настройки темы
CMD/BAT - [решено] Формирование списка.

Новый участник


Сообщения: 23
Благодарности: 2

Профиль | Отправить PM | Цитировать


Добрые сутки.

Есть текстовый файл, экспортированный секьюрити лог, в нём события, даты, учётные записи за два месяца. Задача получить новый список с перечнем учётных записей, существующих в родительском списке, без дублирования.
o:\sec.txt - исходный файл
o:\fin.txt - созданный ручками пустой файл для конечного списка.

Незатейливо пишу в командлайне:
Код: Выделить весь код
For /F "tokens=8" %a in (o:\sec.txt) do For /F "skip=2 tokens=1" %k in ('find "%a" o:\fin.txt') do IF NOT "%a" == "%k" echo %a >> o:\fin.txt
tokens=8 так как это подстрока с учётной записью в исходном списке. Казалось бы, куда проще - взять имя, провести поиск в конечном файле, отбросить лишний вывод, если совпадение есть - ничего не записывать, иначе записать имя учетной записи в конечныйфайл. Однако - не работает. Обидно. По ощущениям - если переменная %k не определена - то IF не работает вообще никак и никогда. DEFINED тоже прикрутить не вышло. Помогите, люди добрые.
Вот кусочек приближенного sec.txt для ясности:
Success Audit 10.04.2009 12:20:26 Security Logon/Logoff 540 pupkin
Success Audit 10.04.2009 12:20:26 Security Logon/Logoff 576 popkin
Success Audit 10.04.2009 12:19:01 Security Logon/Logoff 538 ivanov
Success Audit 10.04.2009 12:19:01 Security Logon/Logoff 538 petrov
Success Audit 10.04.2009 12:19:01 Security Logon/Logoff 538 sidorov
Success Audit 10.04.2009 12:19:01 Security Logon/Logoff 538 ivanov
Success Audit 10.04.2009 12:18:41 Security Logon/Logoff 576 popkin
Success Audit 10.04.2009 12:18:41 Security Logon/Logoff 528 ivanov
Success Audit 10.04.2009 12:18:41 Security Logon/Logoff 552 popkin
Success Audit 10.04.2009 12:18:40 Security Logon/Logoff 538 pupkin

Отправлено: 15:07, 10-04-2009

 

Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


Цитата somes:
По ощущениям - если переменная %k не определена - то IF не работает вообще никак и никогда »
Попробуйте делать сравнение так:
Код: Выделить весь код
... IF NOT "#%a" == "#%k" ...

Отправлено: 15:23, 10-04-2009 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 23
Благодарности: 2

Профиль | Отправить PM | Цитировать


до IF дело не доходит, дело во втором For. Если нет совпадений - ничего не проверяется, так как не выполняется условие второго цикла. А я хочу этот момент обойти, но не знаю - как. Чувствую - что через %errorlevel% вместо второго цикла. А вот с подробностями - запара, так как изменения %errorlevel% в конструкции вида
Код: Выделить весь код
For /F "tokens=8" %a in (o:\sec.txt) do (find "%a" o:\fin.txt & if "%errorlevel%" == "1" echo %a >> o:\fin.txt)
запаздывает на одну интерацию цикла, что лишает его использование смысла...

Последний раз редактировалось somes, 10-04-2009 в 15:44.


Отправлено: 15:32, 10-04-2009 | #3



Moderator


Сообщения: 53175
Благодарности: 15430

Профиль | Отправить PM | Цитировать


somes, можно так:
Код: Выделить весь код
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

If Exist o:\fin.txt Del /F /Q o:\fin.txt
For /F "Tokens=7* Delims= " %%a In (o:\sec.txt) Do (
  FindStr /L /I /X /C:"%%b" o:\fin.txt 2>nul >nul
  If "!ErrorLevel!" Neq "0" Echo %%b>>o:\fin.txt
)
P. S. Вместо Find лучше использовать FindStr с соответствующими опциями (чтобы строка искалась целиком).
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:24, 10-04-2009 | #4


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата somes:
DEFINED тоже прикрутить не вышло »
в этом смысле что ли?
Код: Выделить весь код
For /F "Tokens=8 Delims= " %a In (o:\sec.txt) Do If Not DEFINED $%a Set $%a=X&(@Echo %a>>o:\fin.txt)
P.S. не понятен один момент - AFAIK лог экспортируется с TAB-разделителями, т.е. "Success Audit" это вроде одно поле и позиция тогда должна быть 7-я, а у вас пробелы (кстати, табуляторы сохраняются только в тегах CODE)... но это так, отступление - исходим из того, что дано
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:58, 11-04-2009 | #5



Moderator


Сообщения: 53175
Благодарности: 15430

Профиль | Отправить PM | Цитировать


amel27, да, это гораздо быстрее, чем Find/FindStr.

Отправлено: 10:43, 11-04-2009 | #6


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Petya V4sechkin, удивительно, что IF DEFINED работает с переменными периода выполнения

Отправлено: 14:46, 11-04-2009 | #7


Новый участник


Сообщения: 23
Благодарности: 2

Профиль | Отправить PM | Цитировать


Большое спасибо, уважаемые, тему можно закрывать.

Отправлено: 10:21, 13-04-2009 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Формирование списка.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Debian/Ubuntu - sarg+squid формирование статистики в автоматическом режиме Anatoliy2004 Общий по Linux 17 21-09-2009 13:11
Прочие БД - Страница доступа Access 2003. Как создать кнопку на формирование запроса? tarasov.evgeny Программирование и базы данных 5 05-02-2009 01:55
[решено] Формирование списка программ в системном трее koles Microsoft Windows 2000/XP 1 02-12-2006 22:47
[решено] Переполнение списка программ umnik Хочу все знать 6 01-12-2004 09:49
Формирование матрицы Sergey Po Программирование и базы данных 3 28-04-2004 04:47




 
Переход