Что нового

завершение бесконечного запроса командной строки

mef-t

Осваивающий
Сообщения
306
Репутация
30
Добрый день.

Тема вероятно невнятная, но это наилучшее, что смог придумать.

Есть код
Код:
#include <Encoding.au3>

$iHandle = Run("cmd.exe",@ScriptDIr,@SW_HIDE,0x1 + 0x8)
Global $lastErr

$Command = 'ping 127.0.0.1'
StdinWrite($iHandle,$Command & @CRLF)
PrintOutput()

ConsoleWrite(@CRLF)
StdIoClose($iHandle)


Func PrintOutput()
   $nMsg = StdoutRead($iHandle)
   Local $hasBeenRead = False, $Count = 0
   While NOT @error
	  IF $hasBeenRead AND $nMsg == "" Then
		 $Count += 1
		 Sleep(100)
		 If $Count > 1000 Then ExitLoop
	  EndIf
	  ConsoleWrite(_Encoding_866To1251($nMsg))
	  If StringRight ($nMsg, 1) = '>' Then ExitLoop
	  $nMsg = StdoutRead($iHandle)
	  If $nMsg <> "" Then $hasBeenRead = True
	  If @Error Then ExitLoop
   WEnd
EndFunc

Ключевой командой является $Command = 'ping 127.0.0.1 -t'
параметр -t запускает "бесконечный" пинг.
Далее я считываю данные.

Просьба подсказать, как можно остановить данный процесс?
Или же только путем завершения процесса "cmd.exe". (при завершении процесса пинг оборвется?)

Спасибо
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Почему вы не пользуетесь встроенной функцией AutoIt ?
http://autoit-script.ru/autoit3_docs/functions/Ping.htm
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Спасибо.
Мою проблему решает полностью.
Но, для собственного просвещения хотелось бы получить ответ и на озвученный вопрос
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
mef-t [?]
для собственного просвещения хотелось бы получить ответ и на озвученный вопрос
Можно, например, так сделать.
Код:
#include <Encoding.au3>

Global $iPID = Run(@ComSpec & ' /c ' & 'ping 127.0.0.1 -t', '', @SW_HIDE, 0x2)
HotKeySet('{Esc}', '_Exit')
PrintOutput()


Func PrintOutput()
	$nMsg = StdoutRead($iPID)
	Local $hasBeenRead = False, $Count = 0
	While Not @error
		If $hasBeenRead And $nMsg == "" Then
			$Count += 1
			Sleep(100)
			If $Count > 1000 Then ExitLoop
		EndIf
		ConsoleWrite(_Encoding_866To1251($nMsg))
		If StringRight($nMsg, 1) = '>' Then ExitLoop
		$nMsg = StdoutRead($iPID)
		If $nMsg <> "" Then $hasBeenRead = True
		If @error Then ExitLoop
	WEnd
EndFunc   ;==>PrintOutput

Func _Exit()
	If Not ProcessExists($iPID) Then Exit
	Local $a_Win = WinList('[Class:ConsoleWindowClass]')
	For $i = 1 To $a_Win[0][0]
		If WinGetProcess($a_Win[$i][1]) = $iPID Then
			WinClose($a_Win[$i][1])
			Exit Not WinWaitClose($a_Win[$i][1], '', 2)
		EndIf
	Next
	Exit ProcessExists($iPID)
EndFunc   ;==>_Exit
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Т.е. по сути нужно закрыть саму консоль/командную сроку. Верно?
Других способов нет?
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Можно в консоль отправить эмуляцию нажатия кнопки "pause" это приостановит процесс
 
Верх