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

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

Ответить
Настройки темы
CMD/BAT - Выполнение одной программы несколько раз и запись результатов в файл

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


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

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


Собственно вот такая проблема возникла. Есть txt файл. На каждой строчке url. Есть программа которая эти url обрабатывать может, но по одному. Нужно автоматизировать процесс и записать в файл все что выведет программа после обработки.
Обработка 1ого урл в этой программе для современных машин дело плевое, поэтому я захотел блекджека и шлюх, то есть обрабатывать несколько урлов одновременно, хотя это и необязательно, но желательно.
Вобщем как я решил делать.
1) спрашиваю у юзера сколько он хочет обрабатывать урлов одновременно (обычно их несколько десятков тысяч, поэтому как ни крути но работу лучше сделать по частям, кроме того канал у людей не резиновый)
2) далее запускаю несколько экземпляров программы с разными урлами а результаты сохраняю в лог.
3) скорость обработки каждого из урлов будет разная поэтому как только освобождается часть свободного места, количество которого указали в пункте 1, нужно запускать новый экземпляр программы с новым урлом. И вот в этом загвоздка. Как определить, что программа закончила работу с 1им урлом и загрузить ее новым?

Отправлено: 08:32, 09-08-2012

 

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


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

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


Так, ну значит программа моя по окончании своей работы (да кстати она консольная если кто не понял) выдает 100% надпись одну. То есть можно следить за логом и с каждым появлением записи об окончании запускать обработку нового урла. Только вот я не знаю как сделать подобное «слежение».

Отправлено: 13:17, 09-08-2012 | #2



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

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


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


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

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


у меня новый вопрос. как запустить программу с параметрами, а результаты сохранить в лог?
то есть например у меня есть программа file.exe и запускать его надо так:
file.exe -url=http://yandex.ru/
так вот как сохранить в лог то, что выведет программа после запуска? я пытался сделать вот так:
(file.exe -url=http://yandex.ru/)>log.txt
и так
file.exe -url=http://yandex.ru/ > log.txt
результат 1 и тот же:
в логе написано EInOutError: I/O error 6 + название программы.

Отправлено: 21:08, 09-08-2012 | #3


Ветеран


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

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


Код: Выделить весь код
file.exe -url=http://yandex.ru/ >log.txt
или:
Код: Выделить весь код
>log.txt file.exe -url=http://yandex.ru/
Цитата Megatron13:
в логе написано EInOutError: I/O error 6 + название программы. »
Вы уверены, что она что-то выводит в stdout?

Отправлено: 06:53, 10-08-2012 | #4


Старожил


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

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


Цитата Megatron13:
Обработка 1ого урл в этой программе для современных машин дело плевое, поэтому я захотел блекджека и шлюх, то есть обрабатывать несколько урлов одновременно, хотя это и необязательно, но желательно. »
Вам нужны два скрипта.
ThreadBalancer.cmd - тут указывается количество параллельно запущенных потоков, входной файл с url делится поровну между ними
Threads - потоки, Data - файл с URL-ками
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion

:: Настройки
Set Data=data.txt
Set Threads=3

:: Подсчет общего числа строк
Set sCount=0&For /F "usebackq" %%A In ("%Data%") Do Set /A sCount+=1

:: Делим данные на части по количеству потоков
Set /A SingleThread=sCount/Threads
:: Удаляем предыдущие временные данные
Del "%Temp%\$thread*.txt" 2>nul
:: Проверяем, есть ли остаток
Set /A AllThreads=SingleThread*Threads
If %AllThreads%==%sCount% (
	rem Без остатка, просто разделяем данные на части по числу потоков
	Set cString=0&Set ThreadNum=1&Set /A Reset=SingleThread+1
	For /F "useback delims=" %%A In ("%Data%") Do (
		Set /A cString+=1
		If !cString!==!Reset! (Set /A ThreadNum+=1&Set cString=1)
		Echo %%A>>"%Temp%\$thread!ThreadNum!.txt"
	)
) Else (
	rem Есть остаток, добавляем излишки к последнему потоку
	Set cString=0&Set ThreadNum=1&Set /A Reset=SingleThread+1
	For /F "useback delims=" %%A In ("%Data%") Do (
		Set /A cString+=1
		If !cString!==!Reset! (
			If Not !ThreadNum! GEQ %Threads% (Set /A ThreadNum+=1)
			Set cString=1
		)
		Echo %%A>>"%Temp%\$thread!ThreadNum!.txt"
	)
)

:: Запускаем потоки, выполняющие последовательно каждый свою часть работы
:: Запуск производится в том же окне, чтобы не спамить окнами при большом
:: количество потоков
For /L %%N In (1,1,%Threads%) Do (
	Start /B Thread.cmd "%Temp%\$thread%%N.txt"
)
Pause>nul
Thread.cmd
А здесь уже собственно, запускается сама программа, которой поочередно скармливаются URL из диапазона, отданного потоку.
Код: Выделить весь код
@Echo Off
:: Последовательное выполнение из выделенной потоку очереди
For /F "usebackq delims=" %%A In ("%~1") Do (
	something.exe %%A
)
Exit
С вызовом программы сами уже определяйтесь, куда что и как перенаправлять.
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:17, 10-08-2012 | #5


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


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

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


так, спасибо за помощь с пунктами 1 и 3.
а со 2ым пунктом я решил поступить вот так:
http://www.cyberforum.ru/win-api/thread626505.html

Отправлено: 21:58, 10-08-2012 | #6


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


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

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


ууупс, похоже, что из-за конструктивных особенностей программы лучше каждый поток запустить в отдельном окне. в конце концов окна эти можно сделать невидимыми!

Отправлено: 22:37, 10-08-2012 | #7



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Результат выполнение комманды в файл fooger Скриптовые языки администрирования Windows 9 05-04-2018 14:09
Выполнение программы в скрытом виде Serg2010 AutoIt 4 09-04-2012 21:40
CMD/BAT - [решено] Нужен батник для сканирования папок и записи результатов в файл Nun-Nun Скриптовые языки администрирования Windows 7 22-09-2010 15:23
.NET - Запись настроек программы в файл txt и чтение этих настроек обратно ProgrammerPC Программирование и базы данных 4 11-12-2009 10:46
В реестре запретить выполнение программы mahno Microsoft Windows 95/98/Me (архив) 5 10-03-2003 19:22




 
Переход