Что нового

[Сеть, интернет] Отправить значение переменной из AutoIt-скрипта по Net Send

akoulev

Новичок
Сообщения
169
Репутация
2
Код:
EnvUpdate ( )
Global $title
$title="Парам-пам-пам; парам-пам-пам"
MsgBox(0+48+4096, "$title=", $title, 2)
;Run( "NetSend.bat"); это - работает; отлаживаем далее:
;Run( "NetSend1.bat", $title); это - ПРЕКРАСНО работает; отлаживаем далее:
;Run( "net send CM00220 "" Найдено одно новое соответствие"""); и это - работает; отлаживаем далее:
;Run( "net send CM00220 $title"); а вот это - НЕ работает; отладИТЬ бы!


где CM00220 - сетевое имя компа;
содержимое NetSend.bat:
Код:
net send CM00220 "Test номер 0"

и NetSend1.bat:
Код:
net send CM00220 "%1"
rem NetSend1.bat тары-бары-растабары; - тоже работает

Внимание, вопрос: как бы мне прямо из AutoIt-овского скрипта отправить NetSend-овское сообщение a'la значение переменной (Парам-пам-пам; парам-пам-пам)?

Ай нид хелп, плиз! :smile:
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Re: NetSend

Предупреждение НУ когда же вы поймете что заголовок темы должен быть информативным!!!
 
Автор
A

akoulev

Новичок
Сообщения
169
Репутация
2
Re: NetSend

Medic84 сказал(а):
[warn]... заголовок темы должен быть информативным!!![/warn]
Согласен всецело; мне казалось, что применительно к данной задаче этого достаточно; по большому счёту, кажется так и поныне - но понимаю, что, видимо, я неправ. :smile: Sorry.

По сути:
Код:
Run(@ComSpec & " /c " & 'net send CM00220 "$title"', "", @SW_HIDE);
- ТОЖЕ НЕ ПАШЕТ. При этом, $title может быть как в кавычках, так и без - отправляется сообщение $title (именно - $title, а не Парам-пам-пам; парам-пам-пам)
Ага-ага, а вот это - пашет! :
Код:
Run(@ComSpec & ' /c net send CM00220 ' & $title, '', @SW_HIDE);

Отличие ... очевидно.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: NetSend

akoulev
Все что внутри кавычек отправится "as is". Все переменные со значениями пишутся за кавычками. В твоем случае
Код:
Run(@ComSpec & ' /c net send CM00220 ' & $title, '', @SW_HIDE);


PS: тему переименовал. больше не буду ;) тогда всецело полагайся на милость/гнев админов/модеров :D
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: NetSend

akoulev [?]
Согласен всецело
Тогда следовало бы изменить название ;)

отправляется сообщение $title (именно - $title, а не Парам-пам-пам; парам-пам-пам)
Ну так переменные нужно отделять от строк:

Код:
Run(@ComSpec & ' /c net send CM00220 "' & $title & '"', '', @SW_HIDE)
 
Автор
A

akoulev

Новичок
Сообщения
169
Репутация
2
Re: NetSend

CreatoR сказал(а):
akoulev [?]
Согласен всецело
Тогда следовало бы изменить название ;)
Ох, ёлы-палы; мне в башку почему-то взбрело, что пользователю недоступно изменение имени темы: уже увидел, что неправ. Сорри ещё раз!

И - спасибо!


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

Kaster сказал(а):
PS: тему переименовал. больше не буду ;) тогда всецело полагайся на милость/гнев админов/модеров :D

Дважды спасибо!
 

amel27

Продвинутый
Сообщения
146
Репутация
55
akoulev сказал(а):
как бы мне прямо из AutoIt-овского скрипта отправить NetSend-овское сообщение

Код:
_NetSend("BossComp", "Проверка связи!", "От Васи Пупкина", "Мого начальника")
If @error Then MsgBox(32, "Не понял", "Начальник в отпуске?")

Func _NetSend($sReceiverComputer, $sMessage, $sSender = "", $sReceiverName = "")
   Local $aHandle, $tMessage, $pMessage, $zMessage, $tMailSlot, $pMailSlot
   Local $tOVERLAPPED = DllStructCreate("dword;dword;dword;dword;hwnd")
   Local $pOVERLAPPED = DllStructGetPtr($tOVERLAPPED), $aErr, $aRet

   $tMailSlot = DllStructCreate("char["& StringLen("\\" & $sReceiverComputer & _
               "\MAILSLOT\messngr") + 1 & "]")
   $pMailSlot = DllStructGetPtr($tMailSlot)
   $sMessage = _StringToOEM($sSender) & Chr(0) & _
               _StringToOEM($sReceiverName) & Chr(0) & _
               _StringToOEM($sMessage) & Chr(0)
   $tMessage = DllStructCreate("byte[" & StringLen($sMessage) & "]")
   $pMessage = DllStructGetPtr($tMessage)
   $zMessage = DllStructGetSize($tMessage)

   DllStructSetData($tMailSlot, 1, "\\" & $sReceiverComputer & "\MAILSLOT\messngr")
   DllStructSetData($tMessage, 1, $sMessage)

   $aHandle = DllCall("kernel32.dll", "hwnd", "CreateFile", _
      "ptr",$pMailSlot,"int",0x40000000,"int",1,"ptr",0,"int",0x3,"int",0x80,"int",0)
   If $aHandle[0]=0 Then
      $aErr = DllCall("kernel32.dll", "int", "GetLastError")
      Return SetError(1, $aErr[0], False) ; Ошибка создания файла
   EndIf
   $aRet = DllCall("kernel32.dll", "int", "WriteFile", _
      "hwnd", $aHandle[0], "ptr", $pMessage, "int", 45, "ptr", 0, "ptr", $pOVERLAPPED)
   DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $aHandle[0])
   If $aRet[0]=0 Then Return SetError(2, 0, False) ; Ошибка записи данных

   Return True
EndFunc  ;==> _NetSend (v3.3.0.0)

Func _StringToOEM($sText)
	Local $sOEM = DllStructCreate("char["& StringLen($sText)+1 &"]")
	Local $aRet = DllCall("User32.dll", "int", _
		"CharToOem", "str", $sText, "ptr", DllStructGetPtr($sOEM))
	If Not(IsArray($aRet)) Then Return SetError(1, 0, '') ; ошибка DLL
	If $aRet[0]=0 Then Return SetError(2, $aRet[0], '')   ; ошибка функции
	Return DllStructGetData($sOEM, 1)
EndFunc  ;==> _StringToOEM (v3.3.0.0)
 
Автор
A

akoulev

Новичок
Сообщения
169
Репутация
2
Ух, до чего 'глубокий код' - аж на уровне кернела :shok:! Спасибо огромное - а не поясните ли хоть немного, "чё-как" в этом коде? (пардоньте за наглость :smile: )
Кстати, насколько я вижу, здесь из одной функции (_NetSend) вызывается другая ( _StringToOEM); а в Большой Документации :smile: по AutoIt, вроде как, так делать нельзя (хотя я лично, с замиранием сердца так частенько делаю: "частенько" - в том плане, что нарушать документацию не хотелось бы никогда ;) ). Так можно так делать (из одной функции вызывать другую), или нет?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
akoulev [?]
а в Большой Документации по AutoIt, вроде как, так делать нельзя
что-то я не помню такого ограничения. можно тыкнуть, где так написано, пож-та :smile:
просто это противоречит самому большой достоинству многих языков программирования - рекурсии.
мб путаешь с определением функции внутри другого определения? так делать нельзя. это да.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
akoulev сказал(а):
не поясните ли хоть немного, "чё-как" в этом коде?
ничего особенного - запись файла сообщения на удаленный комп прямо в папку "почтового ящика", только не через FileCopy, а через WinAPI (CreateFile/WriteFile), всё остальное - соблюдение условностей


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


akoulev сказал(а):
Так можно так делать (из одной функции вызывать другую), или нет?
даже нужно :smile:
 
Верх