Что нового

[Интеракция] Проблема rus-eng в Telnet-e.

akoulev

Новичок
Сообщения
166
Репутация
2
Дано: есть скрипт, уже почти как пару лет великолепно работающий. По ошибке. :D При его (скрипта) переносе (в скомпилированном виде, разумеется) на др. машину, начались траблы, а именно: при выполнении
Код:
Send("^{c 11}")
, на экране отображается
Код:
ссссссссссс
- 11 раз "цэ". Проблема была сразу же определена: у меня дефолтный язык: eng. - с которым всё прекрасно работает; на машине портации же дефолтный язык - rus. За счёт этого и эффект; полностью , кстати, пропавший, - как только я выставил на машине портации дефолтный язык - eng. И всё было бы хорошо, - да вот, "по ряду причин" (с), там (на машине портации) должен "жить" дефолтный язык - rus.
Визуальное наблюдение отработки скрипта показывает, что комп портации, с упорством, достойным идиота, "переворачивает" раскладку в .rus, даже если её "ручками" устанавливаешь перед запуском скрипта в .eng, и происходит это даже в процессе работы скрипта! Так, я как-то всё же успел переключить с rus на eng - машина честно отработала
Код:
Send("^{c 11}")
, а вот следующую команду она отобразила уже как "учше" - это был "exit". :wacko:
Вопрос: что бы такого волшебного встроить в скрипт, чтоб -"нехай суслик подавится"- принудительно включался eng. назло операционной системе - сколь бы это ни было ей противно?! Хотя бы, перед выполнением каждой команды. Беда в том, что послать команду переключения - некорректно, ибо неизвестно, успело оно перкувыркнуться или нет. А кстати, - как считывать текущую раскладку - если именно это нужно? Но тогда возникает ещё одна, смежная проблема: как узнать, какая комбинация клавиш на данной машине используется для переключения раскладки?

Hint: Видел на форуме что-то про спец. UDF - но, каюсь, так и не понял, как его мощь применить к данному случАю.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Такой вот примерчик.
Нужна библиотека WinAPI.au3 (Автор: Yashied)
Код:
#include <WinAPIEx.au3>
$text1 = "help"
$text2 = "русский"
$text3 = "ping google.com"
Run("cmd.exe")
Sleep(1000)
$handle = WinGetHandle("[Class:ConsoleWindowClass]")
_WinAPI_SetKeyboardLayout($handle, 0x0409)
ControlSend($handle, "", "", $text1)
Sleep(1000)
Send("{ENTER}")
Sleep(1000)
ControlSend($handle, "", "", $text2)
Send("{ENTER}")
Sleep(1000)
ControlSend($handle, "", "", $text3)
Send("{ENTER}")
Exit
 
Автор
A

akoulev

Новичок
Сообщения
166
Репутация
2
madmasles сказал(а):
Посмотрел. 1-й пример помог; 2-й пример помог там, где "сдыхал" 1-й пример. Спасибо огромное!


Добавлено:
Сообщение автоматически объединено:

Yuriy сказал(а):
Такой вот примерчик.
...
Спасибо! Кстати, а у Вас "google.com" (при выполнении примера, без кавычек) тоже выходит на экран как google/com (слеш вместо точки)?


Добавлено:
Сообщение автоматически объединено:

Код:
;Ver.2.02
;Ver.3.00 - .INI
;Ver.3.01 - 3.01_Full_screen
;Ver.3.02 - 3.01_Full_screen - telnet
#include <WinAPIEx.au3>
EnvUpdate ( )
Opt("TrayIconDebug", 1); Отладко-режим - в трее смотрим: в какой сроке "зависло"?
BlockInput(1)
$NamScr="Анализатор_загрузки_потока_E1_и_COT"
;Sleep(20)
$ABC=1
$text1 = "^{c}"
$var = 0
$manager = 0; если мы пришли из MGR => 1; иначе =0
;$user=IniRead ( "C:\Temp\User.ini", "User", $var, "" )
;$Profile=IniRead ( "C:\Temp\User.ini", "Profile", $var, "" )
;$das=IniRead ( "C:\Temp\User.ini", "D&S", $var, "" )
;Run("C:\Distrib\Term\PuTTYPortable\PuTTYPortable.exe"); Было
	;										Run($das & $Profile & "\Мои документы\Distrib\Term\PuTTYPortable\PuTTYPortable.exe"); Стало
	;										WinActivate ("PuTTY Configuration") 
	;										WinWaitActive("PuTTY Configuration")
	;										;WinSetState ("PuTTY Configuration", "", @SW_MAXIMIZE ); "PuTTY Configuration" - во весь экран
	;										;Sleep(20000); Оставлено, как ПАМЯТНИК БДИТЕЛЬНОСТИ. :) И неумению анализировать содержимое экрана.
	;										;WinActivate ("PuTTY Configuration")
	;										;WinWaitActive("PuTTY Configuration")
	;										;Exit
	;										;Send("{TAB}{TAB}{TAB}{TAB}{1}"); - БЫЛО 
	;										;Send("{TAB 4}{1}"); 			  - СТАЛО 
	;										;Send("{TAB 4}{Right}"); 			  - СТАЛО 
	;										Send("{TAB 4}{Down 2}"); 			  - СТАЛО 
	;										ControlClick ("PuTTY Configuration", "Load", "Button11")
	;										WinActivate ("PuTTY Configuration")
	;										WinWaitActive("PuTTY Configuration")
	;										;Send("{TAB}{TAB}{TAB}{TAB}{ENTER}"); - БЫЛО 
	;										Send("{TAB 4}{ENTER}"); - СТАЛО
	Run("telnet 172.16.0.9"); Стало - telnet
	Sleep(1000)
;$handle = WinGetHandle("[Class:ConsoleWindowClass]")
;_WinAPI_SetKeyboardLayout($handle, 0x0409)
;ControlSend($handle, "", "", $text1)
;Sleep(1000)
;Send("{ENTER}")
;Sleep(1000)
	;Sleep(333)
	Send("mtcl")
	Send("{ENTER}")
	Sleep(333)
	Send("super-puper-password")
	Send("{ENTER}")
	;Exit
;WinActivate ("Telnet 172.16.0.9")
;WinWaitActive("Telnet 172.16.0.9")
Sleep(333)
WinSetState ("Telnet 172.16.0.9", "", @SW_MAXIMIZE ); "172.16.0.9 - PuTTY" - во весь экран
;WinActivate ("Telnet 172.16.0.9")
;WinWaitActive("Telnet 172.16.0.9")
;Send("{ENTER}")
;Sleep(1500) 
;А ЗДЕСЬ (ниже) ЗАКРЫТИЕ C:\WINDOWS\system32\cmd.exe;  ConsoleWindowClass
;If $ABC=1 Then
	If WinExists("C:\WINDOWS\system32\cmd.exe") Then
		;MsgBox(0, "", "Window закрываем")
		$handle = WinGetHandle("C:\WINDOWS\system32\cmd.exe", "")
		WinClose($handle)
			Else
;		;НИ</s>ХРЕНА</s>ЧЕГО
	EndIf
$txt="trkstat -r 100"
WinActivate ("Telnet 172.16.0.9")
WinWaitActive("Telnet 172.16.0.9")
do
	If $ABC=1 Then
		Send($txt)
		Send("{ENTER}")
		Else
		;НИ</s>ХРЕНА</s>ЧЕГО
	EndIf
	;Send("{ENTER}")
	BlockInput(0)
	;$answer = MsgBox(3+4096, "Завершение PUTTY", "Завершение работы анализатора." & @LF & @LF & "This script will be terminated.  Terminate?")
	$answer = MsgBox(3+4096, "Завершение работы анализатора", """ДА"" 	   - Выход " & @LF & @LF & """НЕТ"" 	   - Выбор: 'E1' <=> 'CO'" & @LF & @LF & """ОТМЕНА""  - Продолжение работы в MGR")
	BlockInput(1)
	;_WinAPI_SetKeyboardLayout($handle, 0x0409)
	Switch $answer; 1-й Switch <=> Switch № I
		Case 6; YES <=> 1-й Switch <=> Switch № I
		;YES
			WinActivate ("Telnet 172.16.0.9") 
			WinWaitActive("Telnet 172.16.0.9")
												If $manager = 0 Then;
													;Send("{q}")
													$handle = WinGetHandle("[Class:ConsoleWindowClass]")
													_WinAPI_SetKeyboardLayout($handle, 0x0409)
													;_SendEx("{q}")
													_SendExEx("{q}")
													Sleep(300)
													WinActivate ("Telnet 172.16.0.9")
													WinWaitActive("Telnet 172.16.0.9")
														;Sleep(300)
													Send("{ENTER}")
														Sleep(300)	
												Else
													; Них.
												EndIf
			;_SendEx("{q}")
					
			;_SendEx("Текст на русском + On English")
			_SendExEx("^{c 11}")
			;Send("^{c 11}")
			WinActivate ("Telnet 172.16.0.9") 
			Send("exit")
			Send("{ENTER}")
			;MsgBox(4096, "Зав", "Зав", 2)
			BlockInput(0)
			;Exit
			Fini ()
		Case 7; NO <=> 1-й Switch <=> Switch № I
		;NO
			$manager = 0;
			WinActivate ("Telnet 172.16.0.9") 
			WinWaitActive("Telnet 172.16.0.9")
												If $manager = 0 Then;
													;Send("{q}")
													$handle = WinGetHandle("[Class:ConsoleWindowClass]")
													_WinAPI_SetKeyboardLayout($handle, 0x0409)
													;_SendEx("{q}")
													_SendExEx("{q}")
												Else
													; Них.
												EndIf
			;_SendEx("{q}")
			Sleep(300)
			WinActivate ("Telnet 172.16.0.9") 
			Send("{ENTER}")
														Sleep(300)
			;Send("^{c 11}")
			;_SendEx("^{c 11}"); ??????????????????????????????????????????????????????????????????????????
			_SendExEx("^{c 11}")
			WinActivate ("Telnet 172.16.0.9")
			If $ABC=1 Then
				If $txt="trkstat -r 100" Then
					$txt="trkstat -r 0 18"
					Else
					$txt="trkstat -r 100"
				EndIf
			Else
				;НИ</s>ХРЕНА</s>ЧЕГО
				$txt="trkstat -r 100"
			EndIf
			$manager = 0
			$ABC=1
		Case 2; CANCEL <=> 1-й Switch <=> Switch № I
		;CANCEL
			WinActivate ("Telnet 172.16.0.9") 
			WinWaitActive("Telnet 172.16.0.9")
			;Send("{q}")
			;_SendEx("{q}")
			;$handle = WinGetHandle("[Class:ConsoleWindowClass]")
			;_WinAPI_SetKeyboardLayout($handle, 0x0409)
												If $manager = 0 Then;
													;Send("{q}")
													$handle = WinGetHandle("[Class:ConsoleWindowClass]")
													_WinAPI_SetKeyboardLayout($handle, 0x0409)
													;_SendEx("{q}")
													_SendExEx("{q}")
												Else
													; Них.
												EndIf
			Sleep(300)
			WinActivate ("Telnet 172.16.0.9") 
			WinWaitActive("Telnet 172.16.0.9")
			Send("{ENTER}")
														Sleep(300)
			;Send("^{c 11}")
			;_SendEx("^{c 11}")
			_SendExEx("^{c 11}")
			WinActivate ("Telnet 172.16.0.9") 
			WinWaitActive("Telnet 172.16.0.9")
			Send("mgr")
			$manager = 1
			;_SendEx("mgr")
			WinActivate ("Telnet 172.16.0.9") 
			WinWaitActive("Telnet 172.16.0.9")
			Send("{ENTER}")
			Sleep(500)
			BlockInput(0)
				$answer = MsgBox(3+4096, "Завершение работы анализатора", """ДА"" 	   - Выход " & @LF & @LF & """НЕТ"" 	   - Выбор: 'E1' <=> 'CO'" & @LF & @LF & """ОТМЕНА""  - Продолжение работы в MGR")
				;MsgBox(4096, "Test", "This box will time out in 3 seconds", 3) ;Тест дабы понять: и где же это я? В какой ветке?
				BlockInput(1)
				;_WinAPI_SetKeyboardLayout($handle, 0x0409)
				Switch $answer; 2-й Switch <=> Switch № II
					Case 6; YES <=> 2-й Switch <=> Switch № II
					;YES
						WinActivate ("Telnet 172.16.0.9") 
						WinWaitActive("Telnet 172.16.0.9")
						;MsgBox(4096, "Test", "This box will time out in 3 seconds", 1) ;Тест дабы понять: и где же это я? В какой ветке?
						;WinActivate ("Telnet 172.16.0.9") 
						;WinWaitActive("Telnet 172.16.0.9")
						;								Sleep(3300)
						;Send("^{c 11}")
						;_SendEx("^{c 11}")
						;_SendEx("^{c}")
						;Sleep(300)
						;_SendEx("^{c}")
						;$handle = WinGetHandle("[Class:ConsoleWindowClass]")
						;_WinAPI_SetKeyboardLayout($handle, 0x0409)
						;_SendExEx("^c");
						_SendExEx("^{c 11}")
						;													Sleep(3300)
						;ControlSend($handle, "", "", $text1)
						;Send("^{c 11}")
						;ControlSend($handle, "", "", "^{c}")
						;_SendEx("^{c 11}")
						;Exit
						Sleep(300)
						WinActivate ("Telnet 172.16.0.9") 
						WinWaitActive("Telnet 172.16.0.9") 
						Send("{ENTER}")
						;выше 300
						WinActivate ("Telnet 172.16.0.9") 
						WinWaitActive("Telnet 172.16.0.9")
						Send("exit")
						Send("{ENTER}")
						Fini()
						;BlockInput(0)
						;Exit
					Case 7; NO <=> 2-й Switch <=> Switch № II
					;NO
						$ABC=1
						WinActivate ("Telnet 172.16.0.9") 
						WinWaitActive("Telnet 172.16.0.9")
															Sleep(300)
						Send("^{c 11}")
						;_SendEx("^{c 11}")
						Sleep(300)
						WinActivate ("Telnet 172.16.0.9") 
						WinWaitActive("Telnet 172.16.0.9") 
						Send("{ENTER}")
						;выше 300
						WinActivate ("Telnet 172.16.0.9") 
						WinWaitActive("Telnet 172.16.0.9")
						$txt="trkstat -r 100"
						$manager = 0
					Case 2; CANCEL <=> 2-й Switch <=> Switch № II
					;CANCEL
						$ABC=2
						WinActivate ("Telnet 172.16.0.9") 
						WinWaitActive("Telnet 172.16.0.9")
															Sleep(300)
						;Send("^{c 11}")
						;_SendEx("^{c 11}")
						;_SendExEx("^{c 11}")
						_SendExEx("^{c 11}")
						Sleep(300)
						WinActivate ("Telnet 172.16.0.9") 
						WinWaitActive("Telnet 172.16.0.9") 
						;Send("{ENTER}")
						;выше 300
						WinActivate ("Telnet 172.16.0.9") 
						WinWaitActive("Telnet 172.16.0.9")
						Send("mgr")
						;_SendEx("mgr")
						WinActivate ("Telnet 172.16.0.9") 
						WinWaitActive("Telnet 172.16.0.9")
						Send("{ENTER}")
						Sleep(1500)
						BlockInput(0)
						$manager = 1
						;Exit
				EndSwitch
		;Exit
	EndSwitch
Until $answer = 6; Case 6: ;YES
Fini ()

#cs ----------------------------------------------------------------------------

  Список функций:
 
  Fini();	 			Завершение работы.
 
#ce ----------------------------------------------------------------------------

;Func _SendEx($sString) ; _SendEx($sString)
;    Local $sOld_Clip = ClipGet()
;    
;    ClipPut($sString)
;    Sleep(10)
;    Send("+{INSERT}")
;    
;    ClipPut($sOld_Clip)
;EndFunc

Func _SendEx($sString)
    Local $sOld_Clip = ClipGet()
    
    ClipPut($sString)
    Sleep(10)
    Send("+{INSERT}")
    
    ClipPut($sOld_Clip)
EndFunc

Func _SendExEx($sKeys, $iFlag=0)
    If @KBLayout = 0419 Then
        Local $sANSI_Chars = "ёйцукенгшщзхъфывапролджэячсмитьбю.?"
        Local $sASCII_Chars = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./&"
        
        Local $aSplit_Keys = StringSplit($sKeys, "")
        Local $sKey
        $sKeys = ""
        
        For $i = 1 To $aSplit_Keys[0]
            $sKey = StringMid($sANSI_Chars, StringInStr($sASCII_Chars, $aSplit_Keys[$i]), 1)
            
            If $sKey <> "" Then
                $sKeys &= $sKey
            Else
                $sKeys &= $aSplit_Keys[$i]
            EndIf
        Next
    EndIf
    
    Return Send($sKeys, $iFlag)
EndFunc

Func Fini(); завершение работы
	;Send("{ENTER}")
	Sleep(300)
	Send("{ENTER}")
	BlockInput(0)
	MsgBox(0,"Статус:", "Скрипт """ & $NamScr& """ свою работу завершил.", 5)
	;BlockInput(0)
	;AktNMC() - после окончания отладки - ВОССТАНОВИТЬ!
	Opt("TrayIconDebug", 0); Отладко-режим - выключение перед выходом.
	EnvUpdate ( )
	Exit
EndFunc



#cs ----------------------------------------------------------------------------

C:\Temp\User.ini

********************************************************************************

[User]
0=Пользователь
[Profile]
0=Пользователь.cm00222
[D&S]
0=C:\Documents and Settings\
[Dflt]
0=132

	

#ce ----------------------------------------------------------------------------

Всем спасибо; вот ЭТО (на выходе) - работает. При любой комбинации переключения раскладки у пользователя.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Сам для скриптов Telneta использую Secure CRT в нем есть возможность запуска скриптов на perl и VBS очень удобно.
Код:
~~~~.....~~~~
				crt.Screen.WaitForString "sername:"
				crt.Screen.Send adminAcc & chr(13)
				If crt.Screen.WaitForString ("assword:", 15) = True Then
					crt.Screen.Send  adminPass & chr(13)
					If crt.Screen.WaitForString ("#", 15) = True Then
						Set fCom = fso.OpenTextFile(com, ForReading, False)
						crt.Screen.Send "conf t" & chr(13)
						crt.Screen.WaitForString ")#"
							Do While fCom.AtEndOfStream <> True
								str2 = fCom.Readline
								crt.Screen.Send str2 & chr(13)
								crt.Screen.WaitForString ")#"
							Loop
~~~.....~~~
правда он платный :D
 
Верх