Запуск программ или батников.

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
В проекте запускаю программу или батник, с самим запуском проблем нет.
На примере батника:
В батник, для теста прописал команду "ping 8.8.8.8", которая по умолчанию занимает на выполнение 4 секунды, ну тоесть 4 пинг пакета на каждый по секунде. Соответственно, ставим 5 секунд на "Таймаут выполнения". Батник успевает выполняется и проект проходит к следующему заданию.
e4ff30fee60e.jpg
Если на таймаут выполнения поставить 3 секунды, то батник уже не успеет выполниться и проект завершается ошибкой.
0935b36c0d36.jpg

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

Вопрос в том как сделать так, чтобы проект все равно выполнялся дальше, даже если батник или программа не выполнена до конца и продолжает работать по истечению "таймаута выполнения"?
Данный вопрос я конечно решил, запуском одного батника из другого, но может есть более красивое решение в самом зеннопостере?

И еще один вопрос. Возможно как-то закрывать открытое зеннопостером окно батника, если оно выполняется без остановки в случае какого-то события или эти окна так и будут висеть постепенно накапливаясь?
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
Если надо ждать окончания выполнения процесса, то можно паузу побольше поставить, как процесс выполнение перейдет к другому действию.

Если не надо ждать то, можно использовать C# макросы для этого.
Пусть у нас в переменной path лежит путь к bat файлу.

Если нужно просто запустить процесс
JavaScript:
var path = project.Variables["path"].Value;
var process = System.Diagnostics.Process.Start(path);
// возвращаем Id запущенного процесса
return process.Id;
Если нужно запустить процесс в свернутом окне
JavaScript:
var path = project.Variables["path"].Value;
System.Diagnostics.ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo();
p.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
p.FileName = path;
var process = System.Diagnostics.Process.Start(p);
// возвращаем Id запущенного процесса
return process.Id;
Ну и последний пример закрыть процесс, который не завершился.
JavaScript:
// пытаемся закрыть процесс
try
{
	var processId = Convert.ToInt32(project.Variables["processId"].Value);
	var process = System.Diagnostics.Process.GetProcessById(processId);
	process.Kill();
}
catch (Exception exception)
{
	project.SendErrorToLog("не удалось закрыть процесс", exception.Message);
}
Пример проекта приложен
 

Вложения

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Спасибо большое, буду разбираться.
 

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Пробовал через переменную path запустить программу с параметрами разными способами и в ковычеки заключал и без ковычек вставлял значение, ничего не получилось.
Предположим нужно запустить "c:\Windows\System32\ping.exe 127.0.0.1 -t"
Подскажите пожалуйста, может у кого-то получилось?

А так по всем пунктам работает,просто супер. СПАСИБО БОЛЬШОЕ !
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
JavaScript:
var path = project.Variables["path"].Value;
System.Diagnostics.ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo();
p.FileName = path;
p.Arguments = "127.0.0.1 -t";
var process = System.Diagnostics.Process.Start(p);
// возвращаем Id запущенного процесса
return process.Id;
где в переменной path лежит значение c:\Windows\System32\ping.exe
 
  • Спасибо
Реакции: TeslaCo и kodzero

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
JavaScript:
var path = project.Variables["path"].Value;
System.Diagnostics.ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo();
p.FileName = path;
p.Arguments = "127.0.0.1 -t";
var process = System.Diagnostics.Process.Start(p);
// возвращаем Id запущенного процесса
return process.Id;
где в переменной path лежит значение c:\Windows\System32\ping.exe
Вот с таким кодом -

Код:
var path = project.Variables["path"].Value;
System.Diagnostics.ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo();
p.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
p.FileName = path;
p.Arguments = project.Variables["param"].Value;
p.RedirectStandardOutput = true;
p.RedirectStandardInput = true;
p.UseShellExecute = false;
var process = System.Diagnostics.Process.Start(p);
// возвращаем Id запущенного процесса
return process.Id;
Вот этот фрагмент перестает работать
Код:
p.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
А без данных параметров, которые добавил, не послать команды в саму программу через файлик
Код:
p.RedirectStandardOutput = true;
p.RedirectStandardInput = true;
p.UseShellExecute = false;
Предположим переменной param присвоено данное значение - 222.222.222.222 < yes.txt
Можно как-то с верхнем кодом спрятать плодящиеся окна? Или возможно каким-то другим образом наладить общение с программой через консоль, без файлика yes.txt?
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
надо консольной программе передать параметры какие-то или что?
 
  • Спасибо
Реакции: kodzero

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Да консольная программа спрашивает (y/n)?
Мне надо ответить
y


P.S.
Можно еще пойти такой дорогой не минимизировать, а просто спрятать, чтобы инстансы не мешались с терминалами в кучу.
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
Попробуйте
JavaScript:
	p.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
	p.CreateNoWindow = true;
Если не поможет, попробуйте сделать батник и его запускать с параметром p.UseShellExecute = true;
 
  • Спасибо
Реакции: kodzero

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Попробуйте
JavaScript:
	p.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
	p.CreateNoWindow = true;
Если не поможет, попробуйте сделать батник и его запускать с параметром p.UseShellExecute = true;
Да с таким параметром работает.
Код:
p.CreateNoWindow = true;
Спасибо большое.
 

dmtet

Client
Регистрация
06.07.2010
Сообщения
185
Благодарностей
21
Баллы
18
С каким параметром надо запускать батник:

@echo offipconfig
rasdial ИМЯ /DISCONNECT
:connect
ping 127.0.0.1 -n 3 > NUL
rasdial ИМЯ ЛОГИН ПАРОЛЬ
if ERRORLEVEL 400 goto connect
ipconfig
echo
exit
Если не заполняю строку с параметрами - то просто не выполняется батник.

PS: батник реконнектит соединение.
 
  • Спасибо
Реакции: kodzero

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
батники надо через cmd запускать
bat.png
 
  • Спасибо
Реакции: kodzero и dmtet

dmtet

Client
Регистрация
06.07.2010
Сообщения
185
Благодарностей
21
Баллы
18
Не получается. Ошибку выдает при отладке:



 
  • Спасибо
Реакции: kodzero

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
А он у вас точно за 5 секунд отработать успевает?
А /c случайно не набрали в русской раскладке?
Ну и на последок, откройте консоль и в ней напишите, c:\windows\system32\cmd.exe /c c:\вашбат.bat посмотрите что выдаст.
 
  • Спасибо
Реакции: kodzero

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Да странно, у меня некоторые батники предварительно генерируются по ситуации Зено, а потом прям из строки исполняемый файл запускаются, без всяких доп параметров запуска.
Была похожая ситуация, когда не хватало отведенного времени на исполняемый батник.

А вообще, если я конечно правильно понял Вашу конечную цель, то можно обойтись без батника:
netsh interface set interface "Имя Соединения" connect = DISCONNECTED

C:\Users\kodzero>netsh interface set interface
One or more essential parameters not specified
The syntax supplied for this command is not valid. Check help for the correct syntax.

Usage set interface [name = ] IfName
[ [admin = ] ENABLED|DISABLED
[connect = ] CONNECTED|DISCONNECTED
[newname = ] NewName ]

Sets interface parameters.

IfName - the name of the interface
admin - whether the interface should be enabled
connect - whether to connect the interface (non-LAN only).
newname - new name for the interface (LAN only).

Notes:
- At least one option other than the name must be specified.
- If connect = CONNECTED is specified, then the interface
is automatically enabled even if the admin = DISABLED
option is specified.

Examples:

set interface name="Local Area Connection" admin=DISABLED
set interface name="Local Area Connection" newname="Connection 1"
 

ibelieve

Client
Регистрация
24.12.2012
Сообщения
250
Благодарностей
96
Баллы
28
Пожалуйста, подскажите, а как можно закрыть процессы по названию, а не по их PID (id)? Дело в том, что запуская через Zennoposter программу, запускаются ещё 2 процесса. Но когда эта программа закрывается через Zenno, процессы продолжают висеть и постепенно накапливаться. За час получается под сотню процессов с одинаковым названием.
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
убивает все запущенные блокноты, возможно надо будет написать "notepad.exe" вместо "notepad".

JavaScript:
foreach (var process in System.Diagnostics.Process.GetProcessesByName("notepad"))
    process.Kill();
 

ibelieve

Client
Регистрация
24.12.2012
Сообщения
250
Благодарностей
96
Баллы
28
darkdiver, спасибо огромное! Это то, что нужно! :-)
 

Shytov

Client
Регистрация
11.09.2018
Сообщения
175
Благодарностей
39
Баллы
28
Подскажите, а как можно получить информацию по процессу? Работает он или нет? И есть не работает то запустить заново?

UDP: Написал решение, но может есть варианты лучше?
Код:
//переменная с файлом
var path = string.Empty;
if (project.Variables["path"].Value == ""){
    throw new Exception("Директория к файлу запуска пустая!");
    }
else{
    path = project.Variables["path"].Value;
}
// Таблица
var tabl = project.Tables["tabl1"];
int proc_id = int.Parse(tabl.GetCell(0,0));

// Или 
try{
    var process = System.Diagnostics.Process.GetProcessById(proc_id);
    project.SendInfoToLog("Проццес найден: "+proc_id, true);
}
catch{
    //Запускаем файл 
    System.Diagnostics.ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo();
    p.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
    p.FileName = path;
    var process = System.Diagnostics.Process.Start(p);
    //Сейвим ид в таблицу
    string id_str = Convert.ToString(process.Id);
    tabl.SetCell(0,0, id_str);
    project.SendInfoToLog("Ид запущенного процесса: "+process.Id,true);
}

return "Код отработал успешно!";
 
Последнее редактирование:

Shytov

Client
Регистрация
11.09.2018
Сообщения
175
Благодарностей
39
Баллы
28
и можно ли как-то вводить новые параметры при уже запущенном процессе?
на пример из фала?
 

TeslaCo

Client
Регистрация
25.10.2016
Сообщения
62
Благодарностей
2
Баллы
8
Ну и последний пример закрыть процесс, который не завершился.
JavaScript:
// пытаемся закрыть процесс
try
{
var processId = Convert.ToInt32(project.Variables["processId"].Value);
var process = System.Diagnostics.Process.GetProcessById(processId);
process.Kill();
}
catch (Exception exception)
{
project.SendErrorToLog("не удалось закрыть процесс", exception.Message);
}
Подскажите пожалуйста, может ли ID процесса повторится через время?
Т.е. Я запустил, записал ID, дал примерное время для работы, процесс должен сам завершится (так программа устроена, которую я запускаю), но на случай если что то подвиснет или пойдёт не так, процесс нужно насильно завершить, но не будет ли так что текущий процесс завершится (по плану), а тот который не относится к данной задаче запустится с этим же ID, через время, и я убью левую задачу?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)