|
Сменить кодировку ответа команды ping | ☑ | ||
---|---|---|---|---|
0
Mikhail Volkov
14.11.20
✎
15:14
|
Есть у меня такаю функция:
// Возвращает Истина, если пингуется IP-адрес // v8: Как средствами 1C проверить ping (Ping monitor)? Функция PingIP_Адреса(IP_Адрес = "", ТекстСообщения = "") Экспорт Если ПустаяСтрока(IP_Адрес) Тогда Возврат Ложь; ИначеЕсли IP_Адрес = НРег(СокрЛП(ИмяКомпьютера())) Тогда Возврат Истина; КонецЕсли; objShell = Новый COMОбъект("WScript.Shell"); objScriptExec = objShell.Exec("ping.exe -n 1 " + IP_Адрес); strPingResults = НРег(objScriptExec.StdOut.ReadAll()); Результат = Найти(strPingResults, "ttl=") > 0; ТекстСообщения = ?(Результат, ТекстСообщения, ?(СтрЧислоВхождений(IP_Адрес, ".") >= 3, "IP-адрес", "Компьютер") + ": '" + ВРег(IP_Адрес) + "' - недоступен!"); IP_Адрес = ?(СтрЧислоВхождений(IP_Адрес, ".") >= 3, IP_Адрес, ?(Найти(strPingResults, "[") = 0, "", Сред(strPingResults, Найти(strPingResults, "[") + 1, Найти(strPingResults, "]") - Найти(strPingResults, "[") - 1))); Возврат Результат; КонецФункции // PingIP_Адреса() На входе ИмяКомпьютера, если компьютер доступен в сети (подключился не удаленно), возвращает Истина, преобразует ИмяКомпьютера в его IP_Адрес. Много лет работала, а сегодня strPingResults выдает: џаё їа®ўґаєґ бўп§ё ґ г¤ «®бм ®ў аг¦ёвм 㧴« mv-win10. џа®ўґамвґ ё¬п 㧫 ё ї®ўв®аёвґ ї®їлвєг. - даже цифр нет!? |
|||
1
МихаилМ
14.11.20
✎
15:29
|
||||
2
Mikhail Volkov
14.11.20
✎
15:37
|
(1) Куда вставить это: chcp 1251? Нашел тему v8: как сменить кодировку записи ping`а в лог-файл ?, но не понял куда он вставил: objScriptExec = objShell.Exec("C:\WINDOWS\system32\chcp.com 1251");
|
|||
3
ДенисЧ
14.11.20
✎
15:45
|
(2) батник из двух строк сделай, его и запускай
|
|||
4
shuhard
14.11.20
✎
16:01
|
(3) +100500
|
|||
5
Mikhail Volkov
14.11.20
✎
16:07
|
(3) Зачем мне чтоб батник работал, 1С нужно.
|
|||
6
Aleksey
14.11.20
✎
16:14
|
(5) Ну так напиши на 1С код который создать бантик его запустит и удалит за собой
|
|||
7
acht
14.11.20
✎
16:43
|
(0) џаё їа®ўґаєґ бўп§ё ґ г¤ «®бм ®ў аг¦ёвм 㧴« mv-win10. џа®ўґамвґ ё¬п 㧫 ё ї®ўв®аёвґ ї®їлвєг
Русским языком же написано - "При проверке связи не удалось обнаружить узел mv-win10. Проверьте имя узла и повторите попытку" А функция твоя убогая как раз и поломалась на недоступности. Какой у недоступного компьютера (по результатам проверки вхождения фрагмента "ttl=") адрес ip может быть? |
|||
8
Djelf
14.11.20
✎
16:56
|
(2) Как куда? Туда и вставь: "chcp 1251 & ping 127.0.0.1"
|
|||
9
Mikhail Volkov
14.11.20
✎
17:22
|
(7) >Русским языком же написано - "При проверке связи не удалось обнаружить узел mv-win10. Проверьте имя узла и повторите попытку"
Как ты это прочитал!? Компьютер mv-win10 действительно удаленный, а вот для внутреннего perseus (в сети) strPingResults пишет: ћў¬ґ ї єґв ¬ё б perseus.corp.akit [10.0.13.129] б 32 ў ©в ¬ё ¤ ле: ћвўґв ®в 10.0.13.129: зёб«® ў ©в=32 ўаґ¬п<1¬б ttl=128 ‘в вёбвёє ping ¤«п 10.0.13.129: џ єґв®ў: ®вїа ў«ґ® = 1, ї®«гзґ® = 1, ї®вґап® = 0 (0% ї®вґам) џаёў«ё§ёвґ«м®ґ ўаґ¬п їаёґ¬ -їґаґ¤ зё ў ¬б: њёё¬ «м®ґ = 0¬бґє, њ єбё¬ «м®ґ = 0 ¬бґє, ‘തґґ = 0 ¬бґє IP-адрес его определил по квадратным скобочкам. Чем заменить "ttl=" в данном случае? |
|||
10
acht
14.11.20
✎
17:37
|
(9)
Обмен пакетами с perseus.corp.akit [10.0.13.129] с 32 байтами данных: Ответ от 10.0.13.129: число байт=32 время<1мс ttl=128 Статистика Ping для 10.0.13.129: Пакетов: отправлено = 1, получено = 1, потеряно = 0 (0% потерь) Приблизительное время приема-передачи в мс: Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек Как распарсить текст, сам разбирайся |
|||
11
acht
14.11.20
✎
17:39
|
А потом на какой-нибудь машине ты еще и настроенный IPv6 обнаружишь =)
|
|||
12
Mikhail Volkov
14.11.20
✎
17:49
|
(10) Фрагмент "ttl=" остался нетронутым...
(11) Как переписать мою функция? А то тему v8: Как средствами 1C проверить ping (Ping monitor)? не могу открыть. |
|||
13
CepeLLlka
14.11.20
✎
18:53
|
Вот недавно делал.. работает на win7, на win10 не пробовал..
&НаКлиенте Процедура ПроверитьСвязьДоСервера(КолВоПакетов = 1) Пинг("192.168.1.100", КолВоПакетов); КонецПроцедуры &НаКлиенте Процедура Пинг(IPАдрес, КолВоПакетов = 1) ИмяВремФайла = ПолучитьИмяВременногоФайла("txt"); objShell = Новый COMОбъект("WScript.Shell"); objShell.Run("cmd /c ping.exe -n "+ КолВоПакетов + " " + IPАдрес + " >"+ИмяВремФайла, 0,Истина); ТекстДок = Новый ТекстовыйДокумент; ДопПараметры = Новый Структура; ДопПараметры.Вставить("ТекстДок", ТекстДок); ТекстДок.НачатьЧтение(Новый ОписаниеОповещения("ЧтениеВремФайлаПингЗавершение", ЭтотОбъект, ДопПараметры),ИмяВремФайла,КодировкаТекста.OEM); КонецПроцедуры &НаКлиенте Процедура ЧтениеВремФайлаПингЗавершение(ДополнительныеПараметры) Экспорт ПингРезультат = ДополнительныеПараметры.ТекстДок.ПолучитьТекст(); Если Найти(ВРег(ПингРезультат), "TTL=") > 0 Тогда ЕстьСвязьДоСервера = Истина; Сообщить("Связь успешно установлена"); Иначе ЕстьСвязьДоСервера = Ложь; КонецЕсли; ПослеИзмененияСостоянияVPN(); КонецПроцедуры |
|||
14
mistеr
14.11.20
✎
19:24
|
(0) Пинг еще много разных ошибок может выдавать. Если уж парсить вывод, то на английском. Для этого нужно сделать chcp 65001.
|
|||
15
Mikhail Volkov
14.11.20
✎
20:11
|
(8) В строчку: objScriptExec = objShell.Exec("ping.exe -n 1 " + IP_Адрес);? В итоге будет: objScriptExec = objShell.Exec("chcp 1251 & ping.exe -n 1 " + IP_Адрес);?
|
|||
16
Mikhail Volkov
15.11.20
✎
07:03
|
(13) Через временный файл... , тоже по анализу наличия фрагмента "ttl=". У меня в момент ее выполнения на мгновение выскакивает черное окно, нежелательно. А в твоем варианте выскакивает?
(14) > Для этого нужно сделать chcp 65001. Как сделать, покажи куда конкретно вставить chcp 65001? |
|||
17
Mikhail Volkov
15.11.20
✎
07:28
|
(14) Так (15): Ошибка при вызове метода контекста (Exec)
objScriptExec = objShell.Exec("chcp 65001 & ping.exe -n 1 " + IP_Адрес); по причине: Произошла исключительная ситуация (WshShell.Exec): Не удается найти указанный файл. |
|||
18
trdm
15.11.20
✎
08:49
|
(17) Exec - процесс запускает. По коммандной строке. Просто файл запуска процесса не может найти.
|
|||
19
spectre1978
15.11.20
✎
08:50
|
Пинг вроде как через wmi можно еще делать, без использования команд ОС.
|
|||
20
Mikhail Volkov
15.11.20
✎
09:01
|
(18) Пробовал варианты (закомментированы):
objShell = Новый COMОбъект("WScript.Shell"); // objScriptExec = objShell.Exec("C:\WINDOWS\system32\chcp.com 65001"); // objScriptExec = objShell.Exec("ping.exe -n 1 " + IP_Адрес + " C:\WINDOWS\system32\chcp.com 1251"); objScriptExec = objShell.Exec("ping.exe -n 1 " + IP_Адрес); strPingResults = НРег(objScriptExec.StdOut.ReadAll()); Ошибок вроде нет, но абракадабра осталась... |
|||
21
spectre1978
15.11.20
✎
09:08
|
Еще раз говорю - через wmi сделайте. v8: Как средствами 1C проверить ping (Ping monitor)?
|
|||
22
Mikhail Volkov
15.11.20
✎
10:13
|
(21) Функцию оттуда и взял, еще дописал преобразование имени компьютера в его IP_Адрес. Она рабочая, просто абракадабру хочется убрать.
|
|||
23
Biker
15.11.20
✎
10:29
|
(22) Посмотри в БСП ПроверитьДоступностьСервера(АдресСервера)
|
|||
24
Mikhail Volkov
15.11.20
✎
10:56
|
(23) Мне не только Доступность компьютера нужна, еще преобразование имени компьютера в его IP_Адрес. Функция рабочая, просто абракадабру хочется убрать.
|
|||
25
Djelf
15.11.20
✎
11:06
|
(17) Вот так попробуй
|
|||
26
Mikhail Volkov
15.11.20
✎
12:35
|
(25) Спс! Для доступного компьютера (в сети) пишет:
pinging perseus.corp.akit [10.0.13.129] with 32 bytes of data: reply from 10.0.13.129: bytes=32 time<1ms ttl=128 ping statistics for 10.0.13.129: packets: sent = 1, received = 1, lost = 0 (0% loss), approximate round trip times in milli-seconds: minimum = 0ms, maximum = 0ms, average = 0ms ("ttl=" - есть, кв. скобки тоже) Для недоступного: Ping request could not find host MV-WIN10. Please check the name and try again. |
|||
27
Mikhail Volkov
15.11.20
✎
14:06
|
В момент ее выполнения на мгновение выскакивает черное окно, нежелательно. Есть возможность убрать?
|
|||
28
Mikhail Volkov
16.11.20
✎
07:59
|
(23) ПроверитьДоступностьСервера(АдресСервера) - нет в Авто-Альфа, а в УПП/КА1 тоже черное окно возникает. Мне еще нужно преобразование имени компьютера в его IP_Адрес. Есть в БСП?
|
|||
29
NorthWind
16.11.20
✎
08:30
|
(28) никак вы не хотите услышать. Ладно, держите
wmi=ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"); Успех=Ложь; oColPings=wmi.ExecQuery("Select * From Win32_PingStatus where Address = 'srv-02' and ResolveAddressNames = True"); Адрес = ""; ПингУспешен = Ложь; Для Каждого objStatus Из oColPings Цикл Если objStatus.StatusCode = 0 Тогда Адрес = objStatus.ProtocolAddressResolved; ПингУспешен = Истина; Прервать; КонецЕсли; КонецЦикла; Если ПингУспешен Тогда Сообщить (Адрес); Иначе Сообщить ("Машина недоступна"); КонецЕсли; |
|||
30
trdm
16.11.20
✎
09:01
|
(24) лучшее враг хорошего. Забей. Определись, если абракадабра, то облом.
|
|||
31
УдавВПопугаях
16.11.20
✎
09:02
|
так делал
Shell = Новый ComОбъект("WScript.Shell"); Shell.Run(СтрокаПинга + СтрокаПодсети + "." + Н, 0, Истина) <> 0 |
|||
32
УдавВПопугаях
16.11.20
✎
09:02
|
Сообщить("Адрес " + СтрокаПодсети + "." + Н + " недоступен");
|
|||
33
УдавВПопугаях
16.11.20
✎
09:02
|
СтрокаПинга = "ping -n 1 -w 400 "
|
|||
34
УдавВПопугаях
16.11.20
✎
09:05
|
кусками получилось
СтрокаПодсети = СтрЗаменить(Подсеть, " ", ""); СтрокаПинга = "ping -n 1 -w 400 "; Shell = Новый ComОбъект("WScript.Shell"); Для Н = От По До Цикл Если Shell.Run(СтрокаПинга + СтрокаПодсети + "." + Н, 0, Истина) <> 0 Тогда Сообщить("Адрес " + СтрокаПодсети + "." + Н + " недоступен"); Продолжить; КонецЕсли; |
|||
35
acht
16.11.20
✎
09:35
|
(28) > Мне еще нужно
Запускай nslookup и разбирай ответ |
|||
36
Mikhail Volkov
16.11.20
✎
09:37
|
(29) Так черное окно возникает?
|
|||
37
УдавВПопугаях
16.11.20
✎
09:40
|
(34) так не возникает
|
|||
38
NorthWind
16.11.20
✎
10:27
|
(36) С окном проблемы возникают, когда вы пытаетесь стартовать порожденные процессы, которые могут открывать консольное окно.
WMI не требует запускать никаких дополнительных процессов в принципе, поэтому и не надо думать как спрятать окно. И разбирать вывод не надо, также как и не надо заморачиваться, что делать, если в какой-то винде он будет отформатирован по-другому. |
|||
39
mistеr
16.11.20
✎
11:52
|
(27) Можно убрать, если обернуть в VBS скрипт. То есть схема такая: через WScript.Shell запускаешь VBS скрипт, в нем запускаешь cmd и ставишь признак скрыть окно, в cmd запускаешь chcp + ping.
Вот так вот в винде все хитро устроено. Либо пинговать через WMI (29). |
|||
40
Mikhail Volkov
16.11.20
✎
12:24
|
(39) > Либо пинговать через WMI (29).
Не понял, а где в (29) Имя компьютера (или его IP-адрес) указан? |
|||
41
acht
16.11.20
✎
12:34
|
(40) > Не понял, а где
В условии where wmi запроса. |
|||
42
Mikhail Volkov
16.11.20
✎
12:42
|
(41) Вместо srv-02? Писать: oColPings=wmi.ExecQuery("Select * From Win32_PingStatus where Address = '" + ИмяКомпьютера + "' and ResolveAddressNames = True");
|
|||
43
Mikhail Volkov
16.11.20
✎
13:09
|
+ Да, так. Но Адрес не IP-адрес, а ИмяКомпьютера.Домен;!?
|
|||
44
spiller26
16.11.20
✎
13:25
|
Почему вы через COM действуете? Есть же КомандаСистемы()
Сообщить(КомандаСистемы("%CMD% /q /c ping http://www.yandex.ru")); |
|||
45
Mikhail Volkov
16.11.20
✎
13:40
|
(44) Взял с v8: Как средствами 1C проверить ping (Ping monitor)?. А КомандаСистемы("%CMD% /q /c ping http://www.yandex.ru";) дает черное окно? Через WMI черное окно не возникает, но IP-адреса не дает (не знаю как?).
|
|||
46
spectre1978
16.11.20
✎
13:49
|
(44) затем, что пользоваться средствами ОС для этого все же разумнее, чем запускать отдельную программу. По крайней мере под виндой.
|
|||
47
spectre1978
16.11.20
✎
13:56
|
И не надо мудохаться с разбором вывода программы, с тем, что там, в этом выводе, чего-то может поменяться, и с черными консольными окнами, которые любят всплывать при запуске процессов.
|
|||
48
Mikhail Volkov
16.11.20
✎
14:10
|
(44) КомандаСистемы только запускает, ни чего не возвращает!?
|
|||
49
acht
16.11.20
✎
14:41
|
(48) А ты точно Михаил Волков, а не Андрей Широносов?
|
|||
50
Mikhail Volkov
16.11.20
✎
15:26
|
Куда делся NorthWind? Как из Адрес = objStatus.ProtocolAddressResolved; (29) получить IP-адрес?
|
|||
51
УдавВПопугаях
16.11.20
✎
15:41
|
чем (34) не устраивает? три строки кода
|
|||
52
acht
16.11.20
✎
15:52
|
(50) > Куда делся
Оборзели вы, батенька. |
|||
53
УдавВПопугаях
16.11.20
✎
15:54
|
ну есть у него немного, мало чего сам хочет делать, в основном спрашивает, при этом еще ковыряется в вариантах
|
|||
54
Mikhail Volkov
16.11.20
✎
16:43
|
(51) Что такое СтрокаПодсети = СтрЗаменить(Подсеть, " ", ""); Подсеть - Имя компьютера?
Для Н = От По До Цикл - От и До что такое? |
|||
55
acht
16.11.20
✎
16:53
|
||||
56
УдавВПопугаях
16.11.20
✎
17:16
|
(54) ну хз, ты программист или кто
какая разница что там, основное это СОМ и вызов его функции, сначала я и написал это "основное", потом добавил, потом даже все сразу выложил. ты же знаешь как выглядит пинг в смд, так же он и тут должен выглядеть, смысл не в ИП и подсети, а вызове shell.run( , , ). Один параметр это показывать страшное черное окно или нет, а другой - по-моему останавливаться по ошибке (это не точно) или нет. Shell = Новый ComОбъект("WScript.Shell"); Если Shell.Run("192.168.0.1", 0, Истина) <> 0 Тогда что тут сложного, тем более тоже самое написано в этой ветке в последнем посте вариант 2, причем мне интересно - почему люди всегда выбирают самый зае*истый вариант, а не самый короткий, прозрачный и простой v8: Как средствами 1C проверить ping (Ping monitor)? |
|||
57
УдавВПопугаях
16.11.20
✎
17:19
|
-n 1 -w 400
количество пингов и кажется время ожидания отклика как бы проверить то - ничего не стоит, правда? вставил в обработку и нажал кнопку, посмотрел что получилось, поменял значение параметра, опять попробовал |
|||
58
УдавВПопугаях
16.11.20
✎
17:42
|
нет, второй параметр это ожидание конца выполнения
http://scriptcoding.ru/2013/06/25/wscript-shell-run/ |
|||
59
УдавВПопугаях
16.11.20
✎
17:43
|
вернее третий параметр, речь о двух последних, с первым все и так ясно
|
|||
60
NorthWind
16.11.20
✎
18:23
|
(50) Включите уже мозг. Вам все разжевали и в рот положили
Процедура КнопкаВыполнитьНажатие(Кнопка) wmi=ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"); Успех=Ложь; oColPings=wmi.ExecQuery("Select * From Win32_PingStatus where Address = 'google.com' and ResolveAddressNames = True"); Адрес = ""; ПингУспешен = Ложь; Для Каждого objStatus Из oColPings Цикл Если objStatus.StatusCode = 0 Тогда Адрес = objStatus.ProtocolAddressResolved; ПингУспешен = Истина; Прервать; КонецЕсли; КонецЦикла; Если ПингУспешен Тогда Сообщить (Адрес); Иначе Сообщить ("Машина недоступна"); КонецЕсли; КонецПроцедуры Результат работы процедуры 173.194.73.101 |
|||
61
Mikhail Volkov
16.11.20
✎
18:29
|
(60) Адрес не IP-адрес, а ИмяКомпьютера.Домен;!?
|
|||
62
NorthWind
16.11.20
✎
18:37
|
(61)
> where Address = 'google.com' Здесь вместо google.com указываете perseus.corp.akit или что там у вас было. Запускаете на выполнение - получаете IP-адрес, при условии что машина доступна. |
|||
63
Mikhail Volkov
16.11.20
✎
19:13
|
(62) вместо google.com указываю perseus, получаю Адрес: perseus.corp.akit, а не 10.0.13.129!?
|
|||
64
NorthWind
16.11.20
✎
19:26
|
(63) Попробуйте
> Адрес = objStatus.ProtocolAddress; вместо > Адрес = objStatus.ProtocolAddressResolved; |
|||
65
Mikhail Volkov
16.11.20
✎
19:37
|
(64) Получилось, спс!
|
|||
66
Mikhail Volkov
17.11.20
✎
07:03
|
С WMI сталкиваюсь впервые, случись что, поправить не смогу...
(56) В твоем варианте: Shell.Run("ping -n 1 -w 400 " + ИмяКомпьютера, 0, Истина), если компьютер доступен, результат 0. Возможно получить его IP-адрес без мигания черного окна? |
|||
67
NorthWind
17.11.20
✎
09:03
|
Вариант, как избежать консольного окна, вам дали еще в (39). Но как бы очевидно, что делать это вы не будете.
То есть вы и с запуском процесса не особо хотите разбираться. Ну и какая разница, в чем вы не разбираетесь? :))) |
|||
68
Mikhail Volkov
17.11.20
✎
09:14
|
(67) Пытаюсь разобраться, возможно ли получить IP-адрес? В постах (56) не нашел ответа.
|
|||
69
NorthWind
17.11.20
✎
09:23
|
(68) Если через вызов программы - тогда только разбирая вывод пинга.
что довольно муторно и чревато ошибками, если вывод по какой-то причине поменяется - в этом случае разборщик может ошибиться. Я бы не стал этого делать. |
|||
70
Mikhail Volkov
17.11.20
✎
09:41
|
(69) > Если через вызов программы - тогда только разбирая вывод пинга.
В (0) уже сделано: Сред(strPingResults, Найти(strPingResults, "[") + 1, Найти(strPingResults, "]") - Найти(strPingResults, "[") - 1)), только как strPingResults получить? В (0) получаю objScriptExec.StdOut.ReadAll(). |
|||
71
NorthWind
17.11.20
✎
09:50
|
(70) Shell.Run, насколько я знаю, не позволяет перенаправлять стандартный ввод-вывод, соответственно, с его помощью вывод программы вы не заберете для парсинга.
Для этого годится только Shell.Exec. Соответственно, выходит что нужно делать вариант (25), но, чтобы избежать вывода консольного окна, придется завернуть все это в VBS-скрипт по совету из (39). |
|||
72
Mikhail Volkov
17.11.20
✎
10:18
|
(71) Как завернуть все это (25) в VBS-скрипт?
|
|||
73
NorthWind
17.11.20
✎
10:56
|
(72) Через MSScriptControl.ScriptControl, например, можно попробовать. Но с этим будут проблемы на 64-битной 1С.
Можно скрипт сохранить как временный файл и натравить на него wscript.exe, правда, я не исключаю что тут опять вылезет окно, и кроме того, непонятно как отдать результат. В общем, хрен его знает. Я точно не буду заниматься подобными извращениями, потому что есть рабочий вариант (60), простой и понятный. |
|||
74
mistеr
17.11.20
✎
12:28
|
(72) Вот vbs обертка для произвольного батника
Dim shell,command ScriptDir = WScript.ScriptFullName ScriptDir = Left(ScriptDir, Len(ScriptDir) - Len(WScript.ScriptName)) command = "cmd.exe /c " & ScriptDir & "ping_test.cmd" Set shell = CreateObject("WScript.Shell") shell.Run command,0 "ping_test.cmd" заменить на имя вашего батника, лежащего рядом с оберткой. |
|||
75
Mikhail Volkov
17.11.20
✎
13:21
|
(74) Куда писать эту vbs-обертку, 1С поймет это? Батник отдельным файлом должен лежать? Какой он должен быть, чтобы формировал ответ на команду: "ping.exe -n 1 " + ИмяКомпьютера, что-то типа (9) или (10)?
|
|||
76
lEvGl
гуру
17.11.20
✎
13:23
|
Микхаил...
|
|||
77
mistеr
17.11.20
✎
13:58
|
(75) Если хочешь парсить вывод, то да батник отдельным файлом, в нем две строки, chcp и ping.
|
|||
78
mistеr
17.11.20
✎
13:59
|
А вообще, если посмотреть шире, на удаленном хосте какой сервис интересует? Если HTTP, то по HTTP и пингуй. В 1С все есть, не надо возиться с батниками.
|
|||
79
Mikhail Volkov
17.11.20
✎
14:03
|
(51) > чем (34) не устраивает? три строки кода
Да, и черное окно не мелькает, но только определяет доступность компьютера. А IP-адрес - нет. Думал не сложно добавить, а оказалось... |
|||
80
Mikhail Volkov
17.11.20
✎
14:14
|
(78) В Альфа-Авто 4.1 вроде нет HTTP сервиса. Функцию PingIP_Адреса() писал с появлением онлайн-кассы общей в использовании. Потом ее использовал еще где-то.
|
|||
81
mistеr
17.11.20
✎
14:22
|
(80) Ты не понял наверное. Я спрашиваю, ты сейчас конкретный хост с какой целью мониторить хочешь? Чтобы потом использовать какой-то сервис на этом хосте. Какой?
|
|||
82
Mikhail Volkov
17.11.20
✎
14:37
|
(81) Ничего не хочу мониторить. В последний раз смотрел ее отладчиком при подключении удаленного пользователя, увидел абракадабру, засомневался...
|
|||
83
mistеr
17.11.20
✎
14:41
|
(82) А, понятно. Может быть она и "много лет" неправильно работала...
|
|||
84
lEvGl
гуру
17.11.20
✎
14:43
|
доменную авторизацию он мониторит и попутно видимо еще какая история с входом в домен и доступностью машин, может имена компов и их адреса в актуальном состоянии поддерживать хочет, в целом админская хрень какая то
|
|||
85
Mikhail Volkov
17.11.20
✎
14:55
|
(84) У удаленных пользователей бывают проблемы с онлайн-кассой, поэтому в ЖР пишется как он зашел, с какого компьютера. К функции (0) не было нареканий, кроме мелькания черного окна.
|
|||
86
lEvGl
гуру
17.11.20
✎
14:57
|
+ (85) кроме мелькания черного окна и албанского языка
|
|||
87
Mikhail Volkov
17.11.20
✎
15:16
|
(86) Абракадабра не мешает, фрагмент "ttl=" не искажается, просто засомневался при отладке.
|
|||
88
Mikhail Volkov
17.11.20
✎
18:12
|
В теме v8: Ошибка выполнения команды WshShell.Run приводится такой фрагмент:
WshShell = новый ComОбъект("WScript.Shell"); RetCode = WshShell.Run("команда",0,Истина).StdOut; Сообщить(RetCode); У меня ошибку дает: Значение не является значением объектного типа (StdOut)? |
|||
89
NorthWind
17.11.20
✎
18:34
|
(88) Нет там .StdOut. Не путайте с Exec. См. (71), я там об этом писал уже.
|
|||
90
Mikhail Volkov
17.11.20
✎
18:51
|
(89) Да, видимо там ошибочно так написано.
|
|||
91
Mikhail Volkov
18.11.20
✎
08:02
|
> Скрипты лучше выполнять непосредственно движком, без всяких файлов. (Запуск "*.vbs" из 7.7... проблема)
Еще бы таких примеров, чтобы понять как пишутся VBS-скрипты без bat-файлов... |
|||
92
NorthWind
18.11.20
✎
08:59
|
(91) лучше-то лучше. Но нужно иметь в виду, что эта штука (ScriptControl) есть только x32.
Соответственно, если планируется переходить или использовать x64 клиентов или выполнять на сервере, то могут быть траблы. |
|||
93
NorthWind
18.11.20
✎
09:01
|
вообще, конечно, раздуть такую хрень на сто постов из-за того чтобы комп попинать/адрес отрезольвить - это только 1Сники могут :) Там где нормальные программисты бы все давно сделали встроенными библиотеками, тут на полном серьезе двое суток обсуждается как ping.exe запустить :))))
|
|||
94
Mikhail Volkov
18.11.20
✎
09:15
|
(92) Альфа-Авто x64 (не УФ), но клиентская часть 32-разрядная, иначе торговое оборудование не работает.
(93) VBS-скриптами и bat-файлами почти не пользуюсь, не разбираюсь... время есть, пытаюсь разобраться. |
|||
95
NorthWind
18.11.20
✎
09:23
|
(94) ну если на 32-битность плевать, то можно попытаться сделать как написано в 6-м посте по ссылке в (91).
|
|||
96
Djelf
18.11.20
✎
09:31
|
(93) Так сделали уже http://catalog.mista.ru/public/975147/
|
|||
97
NorthWind
18.11.20
✎
09:41
|
(96) кстати, (0) это тоже могло бы быть интересно, тем более что компоненту отдают бесплатно.
|
|||
98
Mikhail Volkov
18.11.20
✎
10:28
|
(97) Посмотреть бы ее, не скачивается...? А у тебя скачивается? Если Да, то перешли мне на [email protected]
|
|||
99
Djelf
18.11.20
✎
10:32
|
(98) В 3м сообщении ссылка на обработку, вк`шки внутри.
|
|||
100
Сияющий в темноте
18.11.20
✎
10:34
|
Имя компьютера в адрес это же DNS или WINS
причем тут пинг? nslookup может быть? |
|||
101
Сияющий в темноте
18.11.20
✎
10:35
|
если имя компьютера в сети windowd,то вообще локальный кеш имен.
|
|||
102
Mikhail Volkov
18.11.20
✎
10:38
|
(99) Нашел, Спс!
|
|||
103
NorthWind
18.11.20
✎
10:44
|
(100) ему нужно все в куче - по имени компа отрезольвить IP и проверить доступность этого IP.
В принципе, штатный пинг резольвит IP перед проверкой, поэтому такое пожелание ничему не противоречит. |
|||
104
acht
18.11.20
✎
10:55
|
(103) В общем случае это сильно разные задачи. FQDN и IP связаны как "многие ко многим". И это если еще не лезть в ipv4/ipv6, разные localhostы и отличия wins от dns.
Получит какой-нибудь [2a02:6b8:a::a] и общий сбой сети и прибежит опять вопросы задавать... |
|||
105
Mikhail Volkov
18.11.20
✎
11:26
|
(96) Вставил в свою функцию:
//Ping -- произвольное имя, под которым мы хотим видеть компоненту в 1С подключено = ПодключитьВнешнююКомпоненту("ВнешняяОбработка.ТестКомпоненты.Макет.Компонента32", "Ping", ТипВнешнейКомпоненты.Native); //пытаемся подключить 32бита Если Не подключено Тогда подключено = ПодключитьВнешнююКомпоненту("ВнешняяОбработка.ТестКомпоненты.Макет.Компонента", "Ping", ТипВнешнейКомпоненты.Native); КонецЕсли; темпл = Новый("AddIn.Ping.smiPingNativeExtension"); темпл.Address = IP_Адрес; темпл.PingCount = 5; темпл.Пинг(); Если Не темпл.ЕстьОшибка Тогда IP_Адрес = темпл.Адрес; Возврат Истина; КонецЕсли; ТекстСообщения = ?(СтрЧислоВхождений(IP_Адрес, ".") >= 3, "IP-адрес", "Компьютер") + ": '" + ВРег(IP_Адрес) + "' - недоступен!"; Возврат Ложь; Получил ошибку: Тип не определен (AddIn.Ping.smiPingNativeExtension) темпл = Новый("AddIn.Ping.smiPingNativeExtension"); Как в 1м сообщении ссылки на обработку, вк`шки внутри. А в 4м он же сообщает: Проверил, обработка во вложении работает. Почему? |
|||
106
Mikhail Volkov
18.11.20
✎
11:56
|
+ В УФ (КА2 на 8.3.16.1359) работает, без ошибок! А на обычных формах в 8.3.10.2466 - нет. От платформы зависит?
|
|||
107
Mikhail Volkov
18.11.20
✎
12:37
|
+ Переписал обработку на обычные формы, запускаю на 8.3.16.1359, и та же ошибка: Тип не определен (AddIn.Ping.smiPingNativeExtension)!?
Но вернемся к вопросу (72): Как завернуть код (0) в VBS-скрипт? |
|||
108
Mikhail Volkov
18.11.20
✎
13:36
|
+ А нет, макеты не перенес, перенес: работает! А как их мне перенести в свою конфигурацию? Ладно, не надо, все равно не буду ее использовать... Сейчас через WMI (29) работает (непонятно как, случись что, поправить не смогу...). Хочется понять: Как завернуть код (0) в VBS-скрипт?
|
|||
109
NorthWind
18.11.20
✎
14:30
|
(104) ну это в общем. В простейшей локалке обычно 1:1. Если ему NSLookup вернет несколько, он один хрен возьмет первый попавшийся.
|
|||
110
Mikhail Volkov
18.11.20
✎
14:54
|
В (74) дали vbs-обертку для произвольного батника. Не понял: куда ее писать, прямо в модули 1С, 1С поймет это? Или vbs-обертку надо писать отдельно, в виде батника? И как ее запускать из 1С?
(95) Допустим не хочу писать батник (не знаю что писать, кроме: "ping.exe -n 1 " + ИмяКомпьютера), и написал прямо в модуле 1С как Запуск "*.vbs" из 7.7... проблема. Как мне запустить эту vbs-обертку в 1С? |
|||
111
mistеr
18.11.20
✎
15:12
|
(96) "Сырые сокеты", права админа, ну нафиг.
|
|||
112
NorthWind
18.11.20
✎
15:20
|
(110)
Скрипт = Новый COMОбъект ("MSScriptControl.ScriptControl"); Скрипт.Language = "vbscript"; КодНаБейсике = "Function Ping (Name) | Set Cmd = CreateObject(""WScript.Shell"") | Set WshExec = Cmd.Exec (""cmd.exe /q /k echo off"") | WshExec.StdIn.WriteLine ""chcp 1252>nul"" | WshExec.StdIn.WriteLine ""ping -n 1 "" & Name & "" "" | WshExec.StdIn.WriteLine ""exit"" | Ping = WshExec.StdOut.ReadAll() |End Function"; Скрипт.AddCode(КодНаБейсике); СтрокаДляРазбора = Скрипт.Run ("Ping", "srv-02"); Сообщить (СтрокаДляРазбора); Толку только от этого чуть. Окно никуда не девается. |
|||
113
NorthWind
18.11.20
✎
15:21
|
так что все же я бы на вашем месте перестал бы сношать голову, а пользовался бы WMI
|
|||
114
Djelf
18.11.20
✎
15:32
|
(111) А теперь прочти внимательнее что автор ВК написал. Ты же все наоборот прочитал ;)
|
|||
115
mistеr
18.11.20
✎
15:53
|
(114) Ага, прочел внимательно, спасибо.
Автору ВК советую пройти курс "Как ясно выражать свои мысли в письменной форме". |
|||
116
Mikhail Volkov
18.11.20
✎
16:26
|
(111) У меня не УФ, см. (108).
(112) Черное окно на: СтрокаДляРазбора = Скрипт.Run ("Ping", "srv-02"); А почему: Скрипт = Новый COMОбъект ("MSScriptControl.ScriptControl"); а не WshShell = новый ComОбъект("WScript.Shell"); Тогда наверное можно: WshShell.Run("СтрокаКоманды",0,Истина); без черного окна? |
|||
117
Mikhail Volkov
18.11.20
✎
18:32
|
(116) Нет, тут (112) WshShell = новый ComОбъект("WScript.Shell"); не работает. Тогда VBS скрипты, написанные в 1С, работают всегда с миганием черного окна?
(39) > Можно убрать, если обернуть в VBS скрипт. То есть схема такая: через WScript.Shell запускаешь VBS скрипт, в нем запускаешь cmd и ставишь признак скрыть окно, в cmd запускаешь chcp + ping. Только при выполнении батников или cmd можно скрыть мигание черного окна? |
|||
118
acht
18.11.20
✎
18:34
|
А у меня это окошко синее...
|
|||
119
NorthWind
18.11.20
✎
19:03
|
(116) ну раз можно - так сделайте.
|
|||
120
Mikhail Volkov
18.11.20
✎
19:28
|
(119) Два VBS скрипта?
|
|||
121
NorthWind
18.11.20
✎
19:51
|
(120) Вы так и не поняли ничего... Run можно сделать без черного окна, он это позволяет. Но используя Run, вы не прочитаете вывод команды ping. Если же использовать Exec, то прочитать вывод получится, но не удастся избавиться от консольного окна, во всяком случае относительно естественными способами.
|
|||
122
NorthWind
18.11.20
✎
19:54
|
в примере (112) я загнал все в отдельный скрипт и выполнил его, используя ScriptControl. Это ничего не дало - как только дело дошло до выполнения пинга, все равно появилось окно, которое пропало после завершения программы.
|
|||
123
Mikhail Volkov
18.11.20
✎
20:02
|
(121) Не стоит и пытаться применять VBS скрипты, все равно не избежать мигание черного окна для получения IP-адреса?
|
|||
124
ДедМорроз
18.11.20
✎
20:17
|
Я чего то может не понимаю
Батник в невидимом окне запускать получается,в батник вывод перенаправить в файл тоже получается,тогда зачем вообще огороды с StdOut городить? |
|||
125
Mikhail Volkov
18.11.20
✎
20:21
|
(124) А как сделать, чтобы его не было?
|
|||
126
NorthWind
18.11.20
✎
20:32
|
(125) перенаправить в файл на диске можно. Потом файл в 1С открыть и прочитать... Если уж заниматься х...ней, то на полную катушку, че.
|
|||
127
Mikhail Volkov
18.11.20
✎
20:43
|
(126) > перенаправить в файл на диске можно. Потом файл в 1С открыть и прочитать...
Только так? Да, не стоит заниматься... |
|||
128
NorthWind
18.11.20
✎
22:12
|
Как думается, наиболее рациональный вариант для винды все-таки WMI. Скорее всего будет норм жить под все актуальные винды, с платформой 1С x64 проблем тоже быть не должно, нет извращений вроде запуска дополнительных программ, работает быстро, и короткий понятный код. Минус только один - с линухом не совместимо. Будь у меня подобная задача - я бы остановился на нем.
|
|||
129
Mikhail Volkov
19.11.20
✎
07:55
|
(126) Т.е. VBS-скрипт сначала надо записать в файл, и запускать этот файл скрытым? Это для всех VBS-скриптов, или только для получения IP-адреса?
(128) Тогда придется остановиться на варианте через WMI. Хотелось начать разбираться с VBS-скриптов. |
|||
130
Biker
19.11.20
✎
09:41
|
(28) вот почему не скачать бсп и не выдрать оттуда рабочую функцию?
|
|||
131
Mikhail Volkov
19.11.20
✎
09:59
|
(130) Там тоже черное окно возникает. И получения IP-адреса есть?
|
|||
132
Mikhail Volkov
19.11.20
✎
10:07
|
(112) Это всегда для написания скриптов так:
Скрипт = Новый COMОбъект ("MSScriptControl.ScriptControl"); Скрипт.Language = "vbscript"; КодНаБейсике =... |
|||
133
Mikhail Volkov
19.11.20
✎
16:24
|
+ А где посмотреть как правильно скрипты писать? А то в (112): Скрипт.Language = "vbscript"; а в Запуск "*.vbs" из 7.7... проблема: Скрипт.Language = "JScript"; Отчего это зависит?
|
|||
134
ДенисЧ
19.11.20
✎
16:28
|
Скрипт.Language = "vbscript"
Скрипт.Language = "JScript" Скрипач, ты дальтоник? Красный от зелёного, в смысле басик от жискрипта не отличаешь? |
|||
135
Mikhail Volkov
19.11.20
✎
16:48
|
(134) Понятно. Все же, где почитать? Чтобы не задавать подобных вопросов. На ИТС https://its.1c.ru/db/execdoc#content:10064:hdoc не нашел ничего толкового...
|
|||
136
ДенисЧ
19.11.20
✎
16:52
|
(135) Почитать что? Чем бейсик отличается от жискрипта? О_о
|
|||
137
ДенисЧ
19.11.20
✎
16:53
|
Кроме того... По твоей ссылке - экзекутор (первого ранга). А это не бейсик и не жискрипт... Это отдельный язык, если мне эклер не изменяет...
|
|||
138
NorthWind
19.11.20
✎
16:55
|
(135) не поверите - в гугле и яндексе. А примера по ссылке на мистовский топик, который тут был, вполне достаточно для того чтобы попробовать сделать что-то самому, первый раз в жизни увидев этот скрипт-контрол.
|
|||
139
Mikhail Volkov
19.11.20
✎
17:06
|
(138) Теорию...
В (112) Скрипт.Run ("Ping", "srv-02"); Ping - название функции, или ответ команды: WshExec.StdOut.ReadAll()? |
|||
140
ДенисЧ
19.11.20
✎
17:13
|
(139) Функция
|
|||
141
NorthWind
19.11.20
✎
18:37
|
(139) какая именно теория вам нужна - для чего может применяться в 1С? Гуглится за несколько минут, находится, например, тут https://www.script-coding.com/MSScriptControl.html
|
|||
142
Mikhail Volkov
19.11.20
✎
19:34
|
Переписал скрипт по примеру Как запустить скрипт VBS из 1с
СтрокаКоманды = "ping.exe -n 1 " + IP_Адрес; Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl"); Скрипт.Language = "VBscript"; ТекстСкрипта = " |Function Ping() |set WshShell=WScript.CreateObject(""WScript.Shell"") |WshShell.Run """ + СтрокаКоманды + """, 0, true |End Function"; Скрипт.AddCode(ТекстСкрипта); СтрокаДляРазбора = Скрипт.Run("Ping"); Пишет: Ошибка выполнения Microsoft VBScript: Требуется объект: 'WScript' - Что ни так? |
|||
143
NorthWind
19.11.20
✎
21:50
|
(142)
заместо |set WshShell=WScript.CreateObject(""WScript.Shell"") надо |set WshShell=CreateObject(""WScript.Shell"") |
|||
144
Mikhail Volkov
20.11.20
✎
00:01
|
(143) Спс, а в следующей строке: |WshShell.Run """ + СтрокаКоманды + """, 0, true - скобки нужны? Поскольку кавычек ставить? true заменить на 1? Сейчас ТекстСкрипта (см. отладчиком): "
Function Ping() set WshShell=WScript.CreateObject("WScript.Shell") WshShell.Run "ping.exe -n 1 PERSEUS", 0, true End Function" - Правильно? Ошибок нет, но СтрокаДляРазбора пустая? |
|||
145
Mikhail Volkov
20.11.20
✎
08:41
|
+ Скобки не дает добавить, пишет: (Ошибка компиляции Microsoft VBScript): Недопустимо использование скобок при вызове процедуры Sub. Без них должна что-то вернуть Скрипт.Run("Ping");? Если не ответ Ping, то хотя бы 0 (успех) или 1 (нет доступа). Но хотя бы не мигает черное окно консоли.
|
|||
146
NorthWind
20.11.20
✎
08:43
|
(144) Когда в бейсике делается вызов процедуры (Sub) - скобки не нужны.
True не надо ни на что менять, этот литерал в VBS допустим. Кавычки ставятся в соответствии с тем, что вы записываете код в строку 1С, внутри которой одинарные кавычки записываются как двойные. Чтобы у вас Function возвращала значение, перед строкой End Function надо написать строку возврата значения, например |Ping = 1 И тогда будет возвращаться единица. |
|||
147
Mikhail Volkov
20.11.20
✎
09:04
|
(146) Мне надо, чтобы Function возвращала ответ команды: ping.exe -n 1 ИмяКомпьютера. Как правильно писать?
|
|||
148
NorthWind
20.11.20
✎
09:19
|
(147) Бери мочало, начинай сначала... Чтобы возвращать стандартный вывод команды Ping, вам нужно использовать не Run, а Exec, и далее делать возврат свойства .StdOut
|
|||
149
Mikhail Volkov
20.11.20
✎
09:51
|
(148) И тут начнется мигание черного окна консоли!? Не тот вариант.
Остается только в СтрокаКоманды формировать батник (cmd-файл), а затем скриптом запускать его, и получать его ответ СтрокаДляРазбора. Так? |
|||
150
NorthWind
20.11.20
✎
10:15
|
(149) а какая разница - батник вы будете запускать или экзешник? Суть-то одна и та же - это консоль, есть консольное окно - считать вывод получается, нет окна - не получается.
|
|||
151
Mikhail Volkov
20.11.20
✎
10:37
|
(150) А как же (39) > Можно убрать, если обернуть в VBS скрипт. То есть схема такая: через WScript.Shell запускаешь VBS скрипт, в нем запускаешь cmd и ставишь признак скрыть окно, в cmd запускаешь chcp + ping.
|
|||
152
Mikhail Volkov
20.11.20
✎
10:46
|
+ Единственное что меня интересует: можно ли сперва сформировать текст cmd, но не писать его на диск. А затем (39)?
|
|||
153
NorthWind
20.11.20
✎
10:57
|
(151) ну если только так еще попробовать... Попробуйте, если есть время и желание.
(152) cmd на диск не писать нельзя. Не запишете на диск - нечего будет и выполнять. Покомандно содержимое cmd без записи на диск запустить можно, я это сделал в (112). Но такой вариант не дает эффекта, окно все равно появляется. |
|||
154
NorthWind
20.11.20
✎
11:02
|
||||
155
NorthWind
20.11.20
✎
11:04
|
там довольно кривой перевод с английского, но вообще статья дельная
|
|||
156
Mikhail Volkov
20.11.20
✎
11:33
|
(154) Скрыть окно строки при использовании Exec () - это возможно или только предположение? - не мой уровень, не дорос еще...
|
|||
157
NorthWind
20.11.20
✎
13:07
|
весь вопрос в нужности. Для данной конкретной задачи нет смысла этим заниматься, вообще никакого, потому что решение на WMI закрывает все текущие вопросы.
|
|||
158
Mikhail Volkov
20.11.20
✎
13:41
|
(157) Да, сейчас в рабочей базе работает через WMI. VBS-скрипты взялся смотреть лишь для их изучения. Но неудачный пример выбрал с командой Ping. Она всегда будет сопровождаться черным окном консоли, вопреки объяснениям (39).
Что-то УдавВПопугаях сюда не заглядывает, сперва он активно предлагал свой метод (31), но в нем не было получения IP-адреса... Пока всем откликнувшимся спс. Если когда продолжу, то новую тему открою. |
|||
159
mistеr
20.11.20
✎
14:08
|
(158) У меня (39) работало на ура без окна. Правда, не из 1С запускалось, а из Планировщика.
Просто нет времени вникать в твой случай, но метод рабочий. |
|||
160
Mikhail Volkov
20.11.20
✎
16:50
|
(159) Как понял из (150) особенность команды Ping в том, что она ответ дает в окно консоли. Из этой строка выделяем IP-адрес. Поэтому, если нужно выделить IP-адрес, то без окна консоли не обойтись.
|
|||
161
Сияющий в темноте
22.11.20
✎
19:54
|
показывать и не показывать окно консоли это не тоже самое,что создавать его или нет.
|
|||
162
Mikhail Volkov
23.11.20
✎
13:52
|
(161) Значит возможно? А как? Чего в (142) не хватает, как правильно?
|
|||
163
NorthWind
23.11.20
✎
14:08
|
(162) дык это не на тему сделать, это на тему высказать умную мысль %)
Насчет окна консоли это все понятно, но есть маленькая проблема - это не С/С++, где вы можете рулить всеми нюансами создания процесса. И даже не WMI, потому что вы не захотите разбираться, как работать с процессами на WMI. Это стандартные средства VBS. Там можно только то, что можно. Средства все описаны, в частности, в статье (154). Я уже говорил - сделать скорее всего можно, но для этого придется встать на ушки. Оно никому не надо, потому что денег за это все равно никто не заплатит, а посидеть придется. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |