Вход | Регистрация
    1  2
1С:Предприятие :: 1С:Предприятие 8 общая

Сменить кодировку ответа команды ping

Сменить кодировку ответа команды ping
Я
   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.
џа®ўґамвґ ё¬п 㧫  ё ї®ўв®аёвґ ї®їлвєг. - даже цифр нет!?
   Сияющий в темноте
 
101 - 18.11.20 - 10:35
если имя компьютера в сети windowd,то вообще локальный кеш имен.
   Mikhail Volkov
 
102 - 18.11.20 - 10:38
(99) Нашел, Спс!
   NorthWind
 
103 - 18.11.20 - 10:44
(100) ему нужно все в куче - по имени компа отрезольвить IP и проверить доступность этого IP.
В принципе, штатный пинг резольвит IP перед проверкой, поэтому такое пожелание ничему не противоречит.
   acht
 
104 - 18.11.20 - 10:55
(103) В общем случае это сильно разные задачи. FQDN и IP связаны как "многие ко многим". И это если еще не лезть в ipv4/ipv6, разные localhostы и отличия wins от dns.

Получит какой-нибудь [2a02:6b8:a::a] и общий сбой сети и прибежит опять вопросы задавать...
   Mikhail Volkov
 
105 - 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м он же сообщает: Проверил, обработка во вложении работает. Почему?
   Mikhail Volkov
 
106 - 18.11.20 - 11:56
+ В УФ (КА2 на 8.3.16.1359) работает, без ошибок! А на обычных формах в 8.3.10.2466 - нет. От платформы зависит?
   Mikhail Volkov
 
107 - 18.11.20 - 12:37
+ Переписал обработку на обычные формы, запускаю на 8.3.16.1359, и та же ошибка: Тип не определен (AddIn.Ping.smiPingNativeExtension)!?
Но вернемся к вопросу (72): Как завернуть код (0) в VBS-скрипт?
   Mikhail Volkov
 
108 - 18.11.20 - 13:36
+ А нет, макеты не перенес, перенес: работает! А как их мне перенести в свою конфигурацию? Ладно, не надо, все равно не буду ее использовать... Сейчас через WMI (29) работает (непонятно как, случись что, поправить не смогу...). Хочется понять: Как завернуть код (0) в VBS-скрипт?
   NorthWind
 
109 - 18.11.20 - 14:30
(104) ну это в общем. В простейшей локалке обычно 1:1. Если ему NSLookup вернет несколько, он один хрен возьмет первый попавшийся.
   Mikhail Volkov
 
110 - 18.11.20 - 14:54
В (74) дали vbs-обертку для произвольного батника. Не понял: куда ее писать, прямо в модули 1С, 1С поймет это? Или vbs-обертку надо писать отдельно, в виде батника? И как ее запускать из 1С?
(95) Допустим не хочу писать батник (не знаю что писать, кроме: "ping.exe -n 1 " + ИмяКомпьютера), и написал прямо в модуле 1С как Запуск "*.vbs" из 7.7... проблема. Как мне запустить эту vbs-обертку в 1С?
   mistеr
 
111 - 18.11.20 - 15:12
(96) "Сырые сокеты", права админа, ну нафиг.
   NorthWind
 
112 - 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"); 
   
   Сообщить (СтрокаДляРазбора);


Толку только от этого чуть. Окно никуда не девается.
   NorthWind
 
113 - 18.11.20 - 15:21
так что все же я бы на вашем месте перестал бы сношать голову, а пользовался бы WMI
   Djelf
 
114 - 18.11.20 - 15:32
(111) А теперь прочти внимательнее что автор ВК написал. Ты же все наоборот прочитал ;)
   mistеr
 
115 - 18.11.20 - 15:53
(114) Ага, прочел внимательно, спасибо.

Автору ВК советую пройти курс "Как ясно выражать свои мысли в письменной форме".
   Mikhail Volkov
 
116 - 18.11.20 - 16:26
(111) У меня не УФ, см. (108).
(112) Черное окно на: СтрокаДляРазбора = Скрипт.Run ("Ping", "srv-02"); А почему: Скрипт = Новый COMОбъект ("MSScriptControl.ScriptControl"); а не WshShell = новый ComОбъект("WScript.Shell"); Тогда наверное можно: WshShell.Run("СтрокаКоманды",0,Истина); без черного окна?
   Mikhail Volkov
 
117 - 18.11.20 - 18:32
(116) Нет, тут (112) WshShell = новый ComОбъект("WScript.Shell"); не работает. Тогда VBS скрипты, написанные в 1С, работают всегда с миганием черного окна?
(39) > Можно убрать, если обернуть в VBS скрипт. То есть схема такая: через WScript.Shell запускаешь VBS скрипт, в нем запускаешь cmd и ставишь признак скрыть окно, в cmd запускаешь chcp + ping.
Только при выполнении батников или cmd можно скрыть мигание черного окна?
   acht
 
118 - 18.11.20 - 18:34
А у меня это окошко синее...
   NorthWind
 
119 - 18.11.20 - 19:03
(116) ну раз можно - так сделайте.
   Mikhail Volkov
 
120 - 18.11.20 - 19:28
(119) Два VBS скрипта?
   NorthWind
 
121 - 18.11.20 - 19:51
(120) Вы так и не поняли ничего... Run можно сделать без черного окна, он это позволяет. Но используя Run, вы не прочитаете вывод команды ping. Если же использовать Exec, то прочитать вывод получится, но не удастся избавиться от консольного окна, во всяком случае относительно естественными способами.
   NorthWind
 
122 - 18.11.20 - 19:54
в примере (112) я загнал все в отдельный скрипт и выполнил его, используя ScriptControl. Это ничего не дало - как только дело дошло до выполнения пинга, все равно появилось окно, которое пропало после завершения программы.
   Mikhail Volkov
 
123 - 18.11.20 - 20:02
(121) Не стоит и пытаться применять VBS скрипты, все равно не избежать мигание черного окна для получения IP-адреса?
   ДедМорроз
 
124 - 18.11.20 - 20:17
Я чего то может не понимаю
Батник в невидимом окне запускать получается,в батник вывод перенаправить в файл тоже получается,тогда зачем вообще огороды с StdOut городить?
   Mikhail Volkov
 
125 - 18.11.20 - 20:21
(124) А как сделать, чтобы его не было?
   NorthWind
 
126 - 18.11.20 - 20:32
(125) перенаправить в файл на диске можно. Потом файл в 1С открыть и прочитать... Если уж заниматься х...ней, то на полную катушку, че.
   Mikhail Volkov
 
127 - 18.11.20 - 20:43
(126) > перенаправить в файл на диске можно. Потом файл в 1С открыть и прочитать...
Только так? Да, не стоит заниматься...
   NorthWind
 
128 - 18.11.20 - 22:12
Как думается, наиболее рациональный вариант для винды все-таки WMI. Скорее всего будет норм жить под все актуальные винды, с платформой 1С x64 проблем тоже быть не должно, нет извращений вроде запуска дополнительных программ, работает быстро, и короткий понятный код. Минус только один - с линухом не совместимо. Будь у меня подобная задача - я бы остановился на нем.
   Mikhail Volkov
 
129 - 19.11.20 - 07:55
(126) Т.е. VBS-скрипт сначала надо записать в файл, и запускать этот файл скрытым? Это для всех VBS-скриптов, или только для получения IP-адреса?
(128) Тогда придется остановиться на варианте через WMI. Хотелось начать разбираться с VBS-скриптов.
   Biker
 
130 - 19.11.20 - 09:41
(28) вот почему не скачать бсп и не выдрать оттуда рабочую функцию?
 
 Рекламное место пустует
   Mikhail Volkov
 
131 - 19.11.20 - 09:59
(130) Там тоже черное окно возникает. И получения IP-адреса есть?
   Mikhail Volkov
 
132 - 19.11.20 - 10:07
(112) Это всегда для написания скриптов так:
   Скрипт = Новый COMОбъект ("MSScriptControl.ScriptControl");
   Скрипт.Language = "vbscript";
   КодНаБейсике =...
   Mikhail Volkov
 
133 - 19.11.20 - 16:24
+ А где посмотреть как правильно скрипты писать? А то в (112): Скрипт.Language = "vbscript"; а в Запуск "*.vbs" из 7.7... проблема: Скрипт.Language = "JScript"; Отчего это зависит?
   ДенисЧ
 
134 - 19.11.20 - 16:28
Скрипт.Language = "vbscript"
Скрипт.Language = "JScript"

Скрипач, ты дальтоник? Красный от зелёного, в смысле басик от жискрипта не отличаешь?
   Mikhail Volkov
 
135 - 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
Кроме того... По твоей ссылке - экзекутор (первого ранга). А это не бейсик и не жискрипт... Это отдельный язык, если мне эклер не изменяет...
   NorthWind
 
138 - 19.11.20 - 16:55
(135) не поверите - в гугле и яндексе. А примера по ссылке на мистовский топик, который тут был, вполне достаточно для того чтобы попробовать сделать что-то самому, первый раз в жизни увидев этот скрипт-контрол.
   Mikhail Volkov
 
139 - 19.11.20 - 17:06
(138) Теорию...
В (112) Скрипт.Run ("Ping", "srv-02"); Ping - название функции, или ответ команды: WshExec.StdOut.ReadAll()?
   ДенисЧ
 
140 - 19.11.20 - 17:13
(139) Функция
   NorthWind
 
141 - 19.11.20 - 18:37
(139) какая именно теория вам нужна - для чего может применяться в 1С? Гуглится за несколько минут, находится, например, тут https://www.script-coding.com/MSScriptControl.html
   Mikhail Volkov
 
142 - 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' - Что ни так?
   NorthWind
 
143 - 19.11.20 - 21:50
(142)
заместо
|set WshShell=WScript.CreateObject(""WScript.Shell"")
надо
|set WshShell=CreateObject(""WScript.Shell"")
   Mikhail Volkov
 
144 - 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" - Правильно? Ошибок нет, но СтрокаДляРазбора пустая?
   Mikhail Volkov
 
145 - 20.11.20 - 08:41
+ Скобки не дает добавить, пишет: (Ошибка компиляции Microsoft VBScript): Недопустимо использование скобок при вызове процедуры Sub. Без них должна что-то вернуть Скрипт.Run("Ping");? Если не ответ Ping, то хотя бы 0 (успех) или 1 (нет доступа). Но хотя бы не мигает черное окно консоли.
   NorthWind
 
146 - 20.11.20 - 08:43
(144) Когда в бейсике делается вызов процедуры (Sub) - скобки не нужны.
True не надо ни на что менять, этот литерал в VBS допустим.
Кавычки ставятся в соответствии с тем, что вы записываете код в строку 1С, внутри которой одинарные кавычки записываются как двойные.
Чтобы у вас Function возвращала значение, перед строкой End Function надо написать строку возврата значения, например |Ping = 1
И тогда будет возвращаться единица.
   Mikhail Volkov
 
147 - 20.11.20 - 09:04
(146) Мне надо, чтобы Function возвращала ответ команды: ping.exe -n 1 ИмяКомпьютера. Как правильно писать?
   NorthWind
 
148 - 20.11.20 - 09:19
(147) Бери мочало, начинай сначала... Чтобы возвращать стандартный вывод команды Ping, вам нужно использовать не Run, а Exec, и далее делать возврат свойства .StdOut
   Mikhail Volkov
 
149 - 20.11.20 - 09:51
(148) И тут начнется мигание черного окна консоли!? Не тот вариант.
Остается только в СтрокаКоманды формировать батник (cmd-файл), а затем скриптом запускать его, и получать его ответ СтрокаДляРазбора. Так?
   NorthWind
 
150 - 20.11.20 - 10:15
(149) а какая разница - батник вы будете запускать или экзешник? Суть-то одна и та же - это консоль, есть консольное окно - считать вывод получается, нет окна - не получается.
   Mikhail Volkov
 
151 - 20.11.20 - 10:37
(150) А как же (39) > Можно убрать, если обернуть в VBS скрипт. То есть схема такая: через WScript.Shell запускаешь VBS скрипт, в нем запускаешь cmd и ставишь признак скрыть окно, в cmd запускаешь chcp + ping.
   Mikhail Volkov
 
152 - 20.11.20 - 10:46
+ Единственное что меня интересует: можно ли сперва сформировать текст cmd, но не писать его на диск. А затем (39)?
   NorthWind
 
153 - 20.11.20 - 10:57
(151) ну если только так еще попробовать... Попробуйте, если есть время и желание.
(152) cmd на диск не писать нельзя. Не запишете на диск - нечего будет и выполнять.
Покомандно содержимое cmd без записи на диск запустить можно, я это сделал в (112). Но такой вариант не дает эффекта, окно все равно появляется.
   NorthWind
 
154 - 20.11.20 - 11:02
   NorthWind
 
155 - 20.11.20 - 11:04
там довольно кривой перевод с английского, но вообще статья дельная
   Mikhail Volkov
 
156 - 20.11.20 - 11:33
(154) Скрыть окно строки при использовании Exec () - это возможно или только предположение? - не мой уровень, не дорос еще...
   NorthWind
 
157 - 20.11.20 - 13:07
весь вопрос в нужности. Для данной конкретной задачи нет смысла этим заниматься, вообще никакого, потому что решение на WMI закрывает все текущие вопросы.
   Mikhail Volkov
 
158 - 20.11.20 - 13:41
(157) Да, сейчас в рабочей базе работает через WMI. VBS-скрипты взялся смотреть лишь для их изучения. Но неудачный пример выбрал с командой Ping. Она всегда будет сопровождаться черным окном консоли, вопреки объяснениям (39).
Что-то УдавВПопугаях сюда не заглядывает, сперва он активно предлагал свой метод (31), но в нем не было получения IP-адреса...
Пока всем откликнувшимся спс. Если когда продолжу, то новую тему открою.
   mistеr
 
159 - 20.11.20 - 14:08
(158) У меня (39) работало на ура без окна. Правда, не из 1С запускалось, а из Планировщика.
Просто нет времени вникать в твой случай, но метод рабочий.
   Mikhail Volkov
 
160 - 20.11.20 - 16:50
(159) Как понял из (150) особенность команды Ping в том, что она ответ дает в окно консоли. Из этой строка выделяем IP-адрес. Поэтому, если нужно выделить IP-адрес, то без окна консоли не обойтись.
 
 Рекламное место пустует
   Сияющий в темноте
 
161 - 22.11.20 - 19:54
показывать и не показывать окно консоли это не тоже самое,что создавать его или нет.
   Mikhail Volkov
 
162 - 23.11.20 - 13:52
(161) Значит возможно? А как? Чего в (142) не хватает, как правильно?
   NorthWind
 
163 - 23.11.20 - 14:08
(162) дык это не на тему сделать, это на тему высказать умную мысль %)
Насчет окна консоли это все понятно, но есть маленькая проблема - это не С/С++, где вы можете рулить всеми нюансами создания процесса.
И даже не WMI, потому что вы не захотите разбираться, как работать с процессами на WMI.
Это стандартные средства VBS.
Там можно только то, что можно. Средства все описаны, в частности, в статье (154).
Я уже говорил - сделать скорее всего можно, но для этого придется встать на ушки. Оно никому не надо, потому что денег за это все равно никто не заплатит, а посидеть придется.
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.