Страницы: 1 2 След.
RSS
Возврат результата работы WshShell.Run
 
Друзья, добрый день.
Сложный вопрос, гугл и поиск не помогли. В рамках VBA через WshShell.Run запускаю стороннее приложение которое выполняет некую функцию, результатом работы является получение id файла в другой системе, можно ли как то вернуть результат работы обратно в excel?

Спасибо
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
Доброе время суток
Цитата
phelex написал:
гугл и поиск не помогли
Странно Объект WScript.Shell метод Exec - запуск приложения - с пол пника находится.
 
Цитата
Андрей VG написал:
с пол пника находится.
так Google был через RUN запущен, вот результат и не вернул  :D
https://www.script-coding.com/WSH/WshShell.html#3.5.
По вопросам из тем форума, личку не читаю.
 
БМВ, просто запросы некорректно формулировал "как вернуть результат вызова" и т.п.
Ваше сообщение увидел после того как написал сообщение выше, возможно вы сможете помочь в решении?

Андрей VG, могу вас попросить помочь разобраться?

Во вложении пример запуска через CMD, он возвращает цифры (ID файла после загрузки)..
С вашей помощью нашел пример считывания результата из CMD (https://www.script-coding.com/WSH/WshShell.html#4.2.4.)
Код
Set WshShell = CreateObject("WScript.Shell")Set WshExec = WshShell.Exec("nslookup")
Set InStream = WshExec.StdIn
InStream.WriteLine "help"
InStream.WriteLine "exit"
Set OutStream = WshExec.StdOut
Strr = vbNullString
While Not OutStream.AtEndOfStream
    Strr = Strr & Trim(OutStream.ReadLine()) & vbCrLf
Wend
MsgBox Strr
Т.е. Help считывает, если же я меняю nslookup на cmd, то считывания не происходит.
По хорошему нужно даже не через CMD а сразу запустить исполнительный файл с параметрами из Excel и считать результат.

Что я делаю не так?

Заранее спасибо.
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
Непонятно что не получается но

Код
Set WshExec = CreateObject("WScript.Shell").Exec(" .....\....\bitrix.exe -id ........ .... .... .... ")
Set OutStream = WshExec.StdOut
Strr = vbNullString
While Not OutStream.AtEndOfStream
    Strr = Strr & Trim(OutStream.ReadLine()) & vbCrLf
Wend
MsgBox Strr
Изменено: БМВ - 04.04.2021 18:14:54
По вопросам из тем форума, личку не читаю.
 
БМВ, ну вот возвращает пустоту.

Программа срабатывает результат корректный, но вот строчку не отлавливает.
Может пойти другим путем:
1) Создать CMD
2) Вписать команду запуска
3) Получить ответ в переменную
4) Закрыть CMD

Но что то у меня не получается даже CMD открыть и вписать команду, возможно опытные смогут сделать?
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
напримеr NSLOOKUP help возвращает в StdErr, но nslookup 127.0.0.1 скорее всего выведет в StdOut, что там битриx творит - ХЗ.
По вопросам из тем форума, личку не читаю.
 
Цитата
phelex написал:
ну вот возвращает пустоту.
А вы дождались завершения выполнения nslookup? Что ж так не внимательно читаете документацию? Между запуском и завершением выполнения есть определённое время. Exec асинхронная операция и сразу после запуска может быть и не имеет смысла ловить - что там в выводе, он пуст, например, из-за того что идёт банальная инициализация. Например, если 7Zip.exe для объёма файлов в 16 мегабайт запустить как у вас, то выходной поток содержит только  1,414063, а вот если дождаться, то
Скрытый текст
Изменено: Андрей VG - 04.04.2021 19:38:47
 
БМВ, как указано выше он отправляет файл на сервер и возвращает в виде результата ID файла на сервере.
Т.е. если запустить это через CMD то вернет строчку из 6 цифр. Т.е. разницы с тем же -ping или другой команды получается строка.

Андрей VG, по факту nslookup был только как пример, при этом вы совершенно правы, необходимо дождаться ответа от сервера, а не сразу считывать результат.
При этом файл срабатывает и сразу закрывается. Если я верно понимаю Статус = 0 когда приложение уже отработало и закрылось.

Думаю все же решать нужно через создание CMD, далее проверку количества строк (если появилось на 1 строку больше (т.е. пришел ответ) , дальше считываем ответ и закрываем CMD, при этом как указал выше не получается просто открыть CMD и вписать команду.
Верно я понимаю что открыть CMD через строчку
Код
Set WshShell = CreateObject("WScript.Shell").Exec("cmd")
Но так он закрывает окно сразу поэтому ничего не считывает.
Почему так?
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
Цитата
phelex написал:
он отправляет файл на сервер и возвращает в виде результата
я не про это, а поо то в какой поток вернет данные.

Можно подождать, а можно дождаться
Код
While WshExec.Status = 0
Wend
Изменено: БМВ - 04.04.2021 20:21:04
По вопросам из тем форума, личку не читаю.
 
Цитата
phelex написал:
.Exec("cmd")
А зачем запускать просто cmd.exe? Вы не стесняйтесь описывать полярок рассуждений. Будьте аналитиком, а не шаманом :)
 
Андрей VG, стараюсь.
Пока я вижу проблему в том, что программа срабатывает и сразу закрывается, т.е. она не сохраняет лог результата, соответственно брать его уже негде.
Поэтому рассуждаю так, если открыть cmd и в нем выполнить программу без закрытия cmd то с него можно считать лог (результат) после чего закрыть cmd.
Ну или открыть CMD сразу с параметрами запуска в нем приложения, считать, а потом закрыть.
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
Может быть, проще поступить?
Код
' Запуск внешних программ в синхронном режиме
Function RunPgm(ByVal pgm)
    Dim wshShell
    Set wshShell = CreateObject("WScript.Shell")
    RunPgm = wshShell.Run("%comspec% /c " & pgm, 0, True)
    Set wshShell = Nothing
End Function
Изменено: sokol92 - 04.04.2021 21:13:35
Владимир
 
Цитата
phelex написал:
она не сохраняет лог результата,
программа ничего не хранит, она вывела и закрылась, а вот поймал кто этот вывод и сохранил ли - это вопрос.

Без конкретного примера программы с конретными действиями можно долго годать. Ну если совсем тяжко будет, то запустите через RUN, но добавьте перенаправление StdOut в файл через >. И из него результат, но это на крайний.

Цитата
sokol92 написал:
wshShell.Run("%comspec% /c " & pgm, 0, True)
Владимир, приветвую. А результат то выполнения откуда брать. Нее,  с этого начали и к нему напрямую возвращаться не стоит.
По вопросам из тем форума, личку не читаю.
 
Добрый вечер, Владимир.
Вы, как человек связанный с разнопрофильными заказчиками, можете пояснить, исходя из каких соображений ТС не хочет подставить в предложенный для демонстрации код вызов своей программы?
Код
Public Sub TestShellExec()
    Dim pShell As Object, pExec As Object, pOut As Object
    Dim t As Single, sOutLines As String
    Set pShell = CreateObject("WScript.Shell")
    Set pExec = pShell.Exec(" .....\....\bitrix.exe -id ........ .... .... .... ")
    t = Timer
    Do While pExec.Status = 0
        DoEvents
    Loop
    Debug.Print Timer - t
    Set pOut = pExec.StdOut
    Do Until pOut.AtEndOfStream
        sOutLines = sOutLines & Trim$(pOut.ReadLine) & vbLf
    Loop
    Debug.Print sOutLines
End Sub
Собственно, чтобы проверить гипотезы. Что выводится в Immediate после запуска? Если не выводится вообще ничего (чего не может быть Debug.Print Timer - t должна хотя бы 0 вывести :) ), то может программа всё ещё выполняется  - висит в первом цикле Do?
 
Андрей VG, таймер выводит, дальше в дебаге пустая новая строка + добавил в код debug.print ("конец") чтобы точно понимать что отработало. Чуть позже приложу программу с временным доступом.

Цитата
БМВ написал:
добавьте перенаправление StdOut в файл через >.
Можете на примере подсказать как это сделать?  
Изменено: phelex - 05.04.2021 05:42:22
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
Друзья, делюсь подробностями:
- Файл программы (Пароль 123): https://drive.google.com/file/d/1uMS-A6fJ-mPioubO8IvzCHYTLw_d-cye/view?usp=sharing (более 3 Мб поэтому ссылкой). Возможно кому пригодиться этот костыль кто работает на Битрикс, потом отдельно опишу как с ним работать.
- Использование через CMD:
Код
C:\Users\user\Desktop\NewTest\bitrix.exe -id 820 -profile mxwio7k0zxmoro5d -storage 99138 -input-file C:\Users\user\Desktop\NewTest\pic.png
- Скриншот результата

Пути соответственно необходимо указать свои, картинку любую.

Вот через CMD возвращает результат, а через VBA вызов нет.
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
Цитата
phelex написал:
Можете на примере подсказать как это сделать?  
например dir c: >c:\temp\c.txt
но рано об этом, хотя если в командной строке с данной добавкой получится файл в котором будет нужный ID, то все получится
ну посмотрите разные варианты.

Код
Sub ttt()
Set WshExec = CreateObject("WScript.Shell").Exec("nslookup /? 2>&1")
'Set WshExec = CreateObject("WScript.Shell").Exec("nslookup /? 2>&1")
'Set WshExec = CreateObject("WScript.Shell").Exec("nslookup 127.0.0.1 2>&1")
'Set WshExec = CreateObject("WScript.Shell").Exec("nslookup 127.0.0.1")

'For i = 1 To 100000: Next
While WshExec.Status = 0
Wend
Set OutStream = WshExec.StdOut
Strr = vbNullString
While Not OutStream.AtEndOfStream
    Strr = Strr & Trim(OutStream.ReadLine()) & vbCrLf
Wend
MsgBox Strr
End Sub
По вопросам из тем форума, личку не читаю.
 
БМВ, создает пустой файл.
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
phelex, странно, конечно. Попробуйте код команды поместить в cmd файл, допустим c:\temp\myBitrix.cmd и вызывать, изменив строчку
Код
Set pExec = pShell.Exec("c:\temp\myBitrix.cmd")
 
Цитата
phelex написал:
создает пустой файл.
а так если добавить? 2>
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал: а так если добавить? 2>
А вот так работает. Сохранило в файле результат.

Андрей VG, тут проблема шире, создал пустой myBitrix.cmd ругается что "нет версии для вашего компьютера".

Ну в целом путь через сохранение в файл, а потом взять из него и удалить тоже путь.
Понимаю что одна тема один вопрос, но все же, как получить потом в переменную содержимое c.txt
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
Цитата
phelex написал:
Понимаю что одна тема один вопрос, но все же, как получить потом в переменную содержимое c.txt
Так, а в чём проблема: создать тему "Как из текстового файла получить код ответа bitrix?", приложить этот самый текстовый файл (быть может, заменив в нём конфиденциальную информацию танки на груши) и указать признак(и), по которым нужно определить - где и что считать тот самый код ответа.
 
Цитата
phelex написал:
А вот так работает. Сохранило в файле результат.

Цитата
БМВ написал:
напримеr NSLOOKUP help возвращает в StdErr, но nslookup 127.0.0.1 скорее всего выведет в StdOut, что там битриx творит - ХЗ.

значит Set OutStream = WshExec.StdOut заменить на Set OutStream = WshExec.StdErr
По вопросам из тем форума, личку не читаю.
 
Сделал вот так, но теперь висит несколько секунд окно CMD. Подскажите как сделать это фоном?
Код
Sub NNN()
    Dim objFileSys As Object, sS As String, txtFile$, Param$
Set WshShell = CreateObject("WScript.Shell")
    txtFile = "C:\Users\user\Desktop\NewTest\c.txt"
    
    Param = "C:\Users\user\Desktop\NewTest\bitrix.exe -id 820 -profile mxwio7k0zxmoro5d -storage 99138 -input-file C:\Users\user\Desktop\NewTest\pic.png 2> " & txtFile
Set WshExec = WshShell.Exec("cmd")
Set InStream = WshExec.StdIn
InStream.WriteLine Param
WshExec.Terminate
    
    Set objFileSys = CreateObject("Scripting.FileSystemObject")
    sS = objFileSys.OpenTextFile(txtFile).ReadAll
    Kill txtFile
End Sub
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
БМВ, РАБОТЕТ!

Все прекрасно, я вот только думаю с учетом что мы знаем что ответ одна строка, нужен ли цикл While?
Код
Sub ttt()
Dim Param$
Param = "C:\Users\user\Desktop\NewTest\bitrix.exe -id 820 -profile mxwio7k0zxmoro5d -storage 99138 -input-file C:\Users\user\Desktop\NewTest\pic.png"
Set WshExec = CreateObject("WScript.Shell").Exec(Param)
While WshExec.Status = 0

Wend
Set OutStream = WshExec.StdErr
Strr = vbNullString
While Not OutStream.AtEndOfStream
    Strr = Strr & Trim(OutStream.ReadLine())
Wend
Debug.Print Strr
Debug.Print ("Конец")
End Sub
Изменено: phelex - 05.04.2021 12:34:31
невозможное делаем сразу, чудо - требует небольшой подготовки.
 
Цитата
phelex написал:
нужен ли цикл While?
если уверены что одна, то не нужен.
По вопросам из тем форума, личку не читаю.
 
Цитата
phelex написал:
БМВ , РАБОТЕТ!
Это только админ с огроменным опытом может предсказать, что вместо StdOut внезапно используется StdErr  :D  
Спасибо, Михаил!
 
Off
Цитата
Андрей VG написал:
вместо StdOut внезапно используется StdErr
Привык к выдумкам программистов :-)
По вопросам из тем форума, личку не читаю.
 
Андрей VG, БМВ,
огромное спасибо за помощь.
Тему можно закрывать.
невозможное делаем сразу, чудо - требует небольшой подготовки.
Страницы: 1 2 След.
Наверх