Перейти к содержимому

Фотография

Почему код работает ТАК ?


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#1 Rumata

Rumata

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

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 25 июня 2008 - 05:37

Здравствуйте!

Сейчас делал импорт данных из смд, но столкнулся с проблеммой их вводить :)
так вот данные вводяться прекрасно, пока я незапускаю батник из смд, после данные вводяться как одна строка, но если ввести [Enter], то потом данные опять вводяться в поток нормально, объясните почему такое бывает.

вот процедурина
procedure Main;
   var 
   dir,f : string;
   k : integer;
   p, input, output,cmd;
   begin	
   p := dotNET.System_Diagnostics.Process.zctor();
   p.StartInfo.FileName := 'c:\Windows\System32\cmd.exe';
   p.StartInfo.UseShellExecute := false;
   p.StartInfo.RedirectStandardOutput := True;
   p.StartInfo.RedirectStandardInput := True;
   p.Start;
   f := read_name_install_file;
   k := PosEnd(f);
   dir := copy(f,1,k-1);
   f := copy(f,k+1,length(f)-k);  
   input := p.StandardInput;
   output := p.StandardOutput;
   cmd := Sys.Process('cmd',2).Window('ConsoleWindowClass', '*');
   //cmd.Keys('[Enter]');
   input.WriteLine_11('cd '+dir);
   input.WriteLine_11(f);
   input.WriteLine_11('C:\j2sdk1.4.2_12');
   cmd.Keys('[Enter]'); //без этой строки все команды, начиная с предыдущей, 
		 //объединяються в одну и вводятся как одна
   input.WriteLine_11('C:\Sop\jboss-portal-2.6.1.GA');
   input.WriteLine_11('update');
   input.WriteLine_11('127.0.0.1');
   input.WriteLine_11('quit');
 
   while not p.HasExited do 
	 Delay(1000);
   while not output.EndOfStream do
	 Log.Message(output.ReadLine());
   //dotNET.System_Diagnostics.Process.zctor.
   end;

  • 0

#2 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 25 июня 2008 - 08:04

Здравствуйте.

А можно узнать, что такое 'read_name_install_file' и 'PosEnd'?
  • 0
С уважением,
Дмитрий

#3 Rumata

Rumata

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

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 25 июня 2008 - 09:24

Здравствуйте.

А можно узнать, что такое 'read_name_install_file' и 'PosEnd'?


процедуры

read_name_install_file - возвращает полное имя файла который я запускаю в цмд

PosEnd -
последнее вхождение символа в строку


вот я переделал немного, правда теперь приходиться ентер жать после каждого ввода команды :friends:
procedure Main;
  var 
  dir,f : string;
  k : integer;
  p, input, output,cmd;
  st : boolean;
  s : string;
  ss : widestring;
  begin 
  opred_form_log;
  file_mame_rez_log := 'Install_server_rezult_log.mht';
  ResultDir := 'C:\NAT_EAR_COPY_RESULTS\';
  ArchiveDir := 'C:\artifakts\';   
  p := dotNET.System_Diagnostics.Process.zctor();
  p.StartInfo.FileName := 'c:\Windows\System32\cmd.exe';
  p.StartInfo.UseShellExecute := false;
  p.StartInfo.RedirectStandardOutput := True;
  p.StartInfo.RedirectStandardInput := True;
  p.Start;
  f := read_name_install_file;
  k := PosEnd('\',f);
  dir := copy(f,1,k-1);  // директория запускаемого батника
  f := copy(f,k+1,length(f)-k); // здесь имя батника который запускаю 
  input := p.StandardInput;
  output := p.StandardOutput;
  cmd := Sys.Process('cmd',2).Window('ConsoleWindowClass', '*'); // вторая запущеная цмд
  input.WriteLine_11('cd '+dir); // переход в директорию батника
  input.WriteLine_11(f); // запуск батника
  // теперь идут запросы батника
  input.WriteLine_11('C:\j2sdk1.4.2_12'); // ввод корня  jsd
  cmd.Keys('[Enter]');					  // эмуляция долбанного ентера
  input.WriteLine_11('C:\Sop\jboss-portal-2.6.1.GA');   // ввод корня  jboss-portal-
  cmd.Keys('[Enter]');				// эмуляция долбанного ентера
  input.WriteLine_11('update');	   // выбор сбособа установки
  cmd.Keys('[Enter]');				// эмуляция долбанного ентера
  input.WriteLine_11('127.0.0.1');	// айпи сервера
  cmd.Keys('[Enter]');				// эмуляция долбанного ентера
  input.WriteLine_11('quit');		 //выход
  st := false;
  Log.Message('3');
  while not p.HasExited do // если еще цмд открыто
	Delay(500);
  ss := '';
  Log.Message('4');
  while not output.EndOfStream do
	begin
	if not(st) then
	  if (pos('INFO  [Server] JBoss ',s)<> 0) and (pos('Started in',s)<> 0) then
		st := true;
	s := output.ReadLine();
	ss := ss+#13+s;	
	end;
  Log.Message('Лог запуска сервера', ss, pmNormal, debug_attr );   
  if st then
	Log.Message('Сервер запущен!', '', pmNormal, debug_attr )  
  else
	Log.Message('Сервер не был запущен!', '', pmNormal, error_attr ); 
  ExportResults(ResultDir + file_mame_rez_log);
  add_results_archive(file_mame_rez_log);
  if st then  
	SendEmail(e-mail, e-mail, 'Логи автоинсталлирования сервера', 'На север была успешно произведена установка обновления'+#13+'Логи во вложении', ArchiveName+'.rar')
  else
	SendEmail(e-mail, e-mail, 'Логи автоинсталлирования сервера', 'Установка обновления на север была не удалась'+#13+'Логи во вложении', ArchiveName+'.rar');
  end;

  • 0

#4 Rumata

Rumata

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

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 26 июня 2008 - 11:27

вот весь уже скока мучусь, как то криво получается :(((

может кто знает, извлечь данные из цмд?

причем просто перенаправлять не получиться так как я запускаю батник(а он jar-ник) а потом уже общаюсь с ним.

сей час немного прогу переделал, добавил Delay(1000); после каждого writeline, так команды стали выполняться(интересно с какого?) но в выходной поток не все данные пишутся выводит пары десятков строчек лога и всё :(

в чём причина хз

подскажите пожалуста возможные решения
  • 0

#5 serpent

serpent

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

  • Members
  • Pip
  • 33 сообщений

Отправлено 26 июня 2008 - 17:23

вот весь уже скока мучусь, как то криво получается :(((

может кто знает, извлечь данные из цмд?

причем просто перенаправлять не получиться так как я запускаю батник(а он jar-ник) а потом уже общаюсь с ним.

сей час немного прогу переделал, добавил Delay(1000); после каждого writeline, так команды стали выполняться(интересно с какого?) но в выходной поток не все данные пишутся выводит пары десятков строчек лога и всё :(

в чём причина хз

подскажите пожалуста возможные решения


А если на потоке ввода взвести свойство AutoFlush? Поток наверняка буферизованый и то что вы в него пишете, скорее всего, какое-то время лежит в буфере.
Например:
input.AutoFlush := true;
Или вручную дергать метод Flush, после каждой записи в поток.

Возможно, буфер влияет и на поток вывода. Он переполянется и все. Что если у базового потока увеличить длину.
Вот так:
output.BaseStream.SetLength(100000);

p.s. Сам не пробовал.
  • 0

#6 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 27 июня 2008 - 04:15

Здравствуйте.

Я не совсем понял, а CMD.exe в конце закрывается или нет? Если нет, по попробуйте закрывать его (только корректно) перед попыткой чтения выходного потока.

По поводу необходимости нажатия Enter -- это, наверно, приложение не так отрабатывает нажатия, как CMD. Попробуйте использовать метод Write_10(MyCommand + #13).
  • 0
С уважением,
Дмитрий

#7 Rumata

Rumata

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

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 27 июня 2008 - 04:54

Привет!

А если на потоке ввода взвести свойство AutoFlush? Поток наверняка буферизованый и то что вы в него пишете, скорее всего, какое-то время лежит в буфере.
Например:
Код output.BaseStream.SetLength(100000);

input.AutoFlush := true;

Или вручную дергать метод Flush, после каждой записи в поток.

Возможно, буфер влияет и на поток вывода. Он переполянется и все. Что если у базового потока увеличить длину.
Вот так:
output.BaseStream.SetLength(100000);


не получается

Здравствуйте.

Я не совсем понял, а CMD.exe в конце закрывается или нет? Если нет, по попробуйте закрывать его (только корректно) перед попыткой чтения выходного потока.

По поводу необходимости нажатия Enter -- это, наверно, приложение не так отрабатывает нажатия, как CMD. Попробуйте использовать метод Write_10(MyCommand + #13).


смд закрываеться , там ведь есть команда quid
Write_10(MyCommand + #13) не работает

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

теперь вот пытаюсь стабилизировать всё что делал...
  • 0

#8 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 27 июня 2008 - 09:39

Здравствуйте.

смд закрываеться , там ведь есть команда quid

CMD закрывается по команде Exit. Команду Quit он не знает.

Вывод в файл и последующее чтение файла, имхо, хорошее решение.
  • 0
С уважением,
Дмитрий


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных