Работа с Cmd

Простейшие вопросы в области инженерной разработки

Работа с Cmd

Postby Аня on 13 Sep 2018, 15:05

Имеется архиватор 7zip, работающий из под командной строки. Взаимодействие с командной строкой осуществляется посредством инструмента System Exec.vi.

Создание архива занимает некоторое время, в течение которого в консоль выводится статус операции в процентах. Я хочу считывать этот статус, отображая его в программе в виде слайдера загрузки.

Проблема заключается в том, что System Exec.vi возвращает вывод командной строки только после полного выполнения операции.

Каким образом я могу решить эту задачу?
Attachments
Пример исходного кода.png
Программа запускает процесс архивации и ожидает его завершения.
Пример исходного кода.png (2.87 KiB) Viewed 786 times
Командная строка в процессе.png
Во время архивации в консоль выводится значение в процентах. Именно его я хочу считывать и парсить.
Командная строка в процессе.png (8.52 KiB) Viewed 786 times
Вывод командной строки после выполнения операции.png
System Exec.vi возвращает эту информацию после завершения архивации. Программа завершает свою работу.
Вывод командной строки после выполнения операции.png (11.52 KiB) Viewed 786 times
Аня
beginner
beginner
 
Posts: 27
Joined: 25 May 2015, 20:09
LabVIEW Version: 14.1
Karma: 0

Re: Работа с Cmd

Postby Kosist on 13 Sep 2018, 15:31

Попробуйте эту виайку - https://forums.ni.com/t5/LabVIEW/URGENT ... ue#M366027. Она позволяет считать текст, а затем Вам нужно будет его правильно распарсить.
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 900
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 253
CLAD I/O VIP students

Re: Работа с Cmd

Postby Blackman on 13 Sep 2018, 23:46

Запустите :vi: и в открывшемся окне cmd.exe вводите команды или любой текст. Индикатор :vi: Std out должен обновляться после каждого ввода (клавиша Enter). Закройте окно cmd.exe.
Attachments
Blackman--ExecNET.png
Blackman--ExecNET.vi
LabVIEW 2016
(25.81 KiB) Downloaded 20 times
Blackman
leader
leader
 
Posts: 806
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 240
VIP

Re: Работа с Cmd

Postby Blackman on 14 Sep 2018, 19:47

Пересохранил в более удобоваримую :) версию 2013.
Добавил 2 режима работы (чтения):
1. NOT TO READ - аналогично wait until completion? = FALSE в System Exec
2. READ TO END - аналогично wait until completion? = TRUE в System Exec
Доработал режим READ LINE (обновление Std Out во время работы программы) - нет в System Exec
Attachments
Blackman--ExecNET 2013.vi
LabVIEW 2013
(31.22 KiB) Downloaded 17 times
Blackman--ExecNET 2013.png
Заменить reference control на strict reference Std out или property node на local variable
Blackman
leader
leader
 
Posts: 806
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 240
VIP

Re: Работа с Cmd

Postby dadreamer on 15 Sep 2018, 21:17

Странно, что никто не написал... Нативные каналы Windows (Pipes) прекрасно работают со стандартными потоками stdin, stdout и stderr, то есть, возможна полноценная работа с любым консольным приложением в реальном времени: не только запуск, но и передача/получение информации от приложения. Более развёрнуто о каналах я писал вот здесь. На то время существовал единственный тулкит для работы с каналами - OpenG Pipes (oglib_pipe) (можно поставить через VIPM). В настоящее время создан ещё один набор :vi: - LV Process, который постабильнее в работе, более понятен и поддерживается/обновляется автором (хотя пока нет поддержки 64-битных LV).

В общем, я попробовал, каких-то особых "граблей" не заметил. Как юзать - качаем с гитхаба проект (зелёная кнопка "Clone or download"), распаковываем куда-нибудь, заходим в папку LV Process, открываем LV Process library.lvlib. Дальше можно открыть Demo.vi и посмотреть, как всё это работает. В коде легко разобраться, прочитав примечания на панели и диаграмме. Используя :vi: из LV Process library.lvlib, можно написать что-то своё, например, переходя ближе к сабжу, вот такой код для архивации с помощью 7za:

2018-09-15_22-58-57.jpg
7z_Pipe_Test.vi
lv2014
(18.65 KiB) Downloaded 13 times

Небольшое видео, демонстрирующее процесс сжатия:
Untitled Project.zip
(846.63 KiB) Downloaded 15 times

Обращаю также внимание на ключ -bs, который я добавил в исходную командную строку: progress information (p) > redirect to stdout stream (1)

Подход на .NET, предложенный Blackman, неплох и тоже имеет шанс на существование. Но только в том случае, если вас не беспокоит привязка программы (exe) к .NET Framework - при распространении программы его придётся ставить на целевые компы (если его там нет), и первоначальный запуск приложения будет несколько медленнее из-за подгрузки нескольких десятков DLL.
User avatar
dadreamer
professor
professor
 
Posts: 3157
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 803
I/O VIP vision internet

Re: Работа с Cmd

Postby Blackman on 16 Sep 2018, 00:57

После установки пакета LV Process.vip в LabVIEW x32,
LV Process library.lvlib:Demo.vi не работает в Main Application Instance. :wink:
"Error 5000 occurred at LV Process library.lvlib:Check and Generate Path to lv_proc.vi".
Blackman
leader
leader
 
Posts: 806
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 240
VIP

Re: Работа с Cmd

Postby dadreamer on 16 Sep 2018, 01:52

Blackman wrote:После установки пакета LV Process.vip в LabVIEW x32,
LV Process library.lvlib:Demo.vi не работает в Main Application Instance. :wink:
"Error 5000 occurred at LV Process library.lvlib:Check and Generate Path to lv_proc.vi".

Не используйте vip пакет для установки через VIPM - он устарел. Просто скачайте архив с гитхаб и запустите файл из библиотеки.

ЗЫ: Кстати, в VIPM есть вот такие недоделки.
1. Иногда, когда :labview: не запущен, и нужно установить пакет, VIPM запускает :labview: и ждёт его ответа. Но по какой-то непонятной причине ответа не получает, хотя :labview: открыт и всё ок. В настройках :labview: всё на вкладке VI Server разрешено и всё должно работать (и часто работает). В чём тут проблема, я даже без понятия. :dntknw:
2. Когда VIPM ожидает ответа от :labview: он ждёт 120 сек. В процесе ожидания я не могу никак отменить это дейстие - ни кнопка с красным крестом, ни File -> Close не срабатывают. Это не есть хорошо, надо бы сделать отдельную кнопку "Отмена" или как-то иначе.
User avatar
dadreamer
professor
professor
 
Posts: 3157
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 803
I/O VIP vision internet

Re: Работа с Cmd

Postby Blackman on 16 Sep 2018, 02:15

Что значит - он устарел? VIPM установил все правильно, в соответствии со spec, которая соответствует дереву проекта на GitHub. Все дело в LV Process library.lvlib:Check and Generate Path to lv_proc.vi, который не учитывает случай, когда Top Level VI и dll-ка расположены в разных папках.
Blackman
leader
leader
 
Posts: 806
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 240
VIP

Re: Работа с Cmd

Postby dadreamer on 16 Sep 2018, 02:33

Blackman wrote:Что значит - он устарел?

По ссылке https://forums.ni.com/t5/Community-Docu ... -p/3497836 версия архива 0.6.0.1, тогда как на гитхаб 0.6.1.1.
User avatar
dadreamer
professor
professor
 
Posts: 3157
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 803
I/O VIP vision internet

Re: Работа с Cmd

Postby Blackman on 16 Sep 2018, 11:43

Я взял пакет на GitHub:
https://github.com/KaeroDot/GOLPI/blob/ ... p?raw=true

LV Process: build v. 0.6.1.1, only source distribution to GOLPI. Package build not needed, no code change.
Blackman
leader
leader
 
Posts: 806
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 240
VIP


Return to Для чайников

Who is online

Users browsing this forum: Bing [Bot], Yandex and 16 guests

cron