Page 1 of 1

Работа с Cmd

PostPosted: 13 Sep 2018, 15:05
by Аня
Имеется архиватор 7zip, работающий из под командной строки. Взаимодействие с командной строкой осуществляется посредством инструмента System Exec.vi.

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

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

Каким образом я могу решить эту задачу?

Re: Работа с Cmd

PostPosted: 13 Sep 2018, 15:31
by Kosist
Попробуйте эту виайку - https://forums.ni.com/t5/LabVIEW/URGENT ... ue#M366027. Она позволяет считать текст, а затем Вам нужно будет его правильно распарсить.

Re: Работа с Cmd

PostPosted: 13 Sep 2018, 23:46
by Blackman
Запустите :vi: и в открывшемся окне cmd.exe вводите команды или любой текст. Индикатор :vi: Std out должен обновляться после каждого ввода (клавиша Enter). Закройте окно cmd.exe.

Re: Работа с Cmd

PostPosted: 14 Sep 2018, 19:47
by Blackman
Пересохранил в более удобоваримую :) версию 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

Re: Работа с Cmd

PostPosted: 15 Sep 2018, 21:17
by dadreamer
Странно, что никто не написал... Нативные каналы 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.

Re: Работа с Cmd

PostPosted: 16 Sep 2018, 00:57
by Blackman
После установки пакета 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".

Re: Работа с Cmd

PostPosted: 16 Sep 2018, 01:52
by dadreamer
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 не срабатывают. Это не есть хорошо, надо бы сделать отдельную кнопку "Отмена" или как-то иначе.

Re: Работа с Cmd

PostPosted: 16 Sep 2018, 02:15
by Blackman
Что значит - он устарел? VIPM установил все правильно, в соответствии со spec, которая соответствует дереву проекта на GitHub. Все дело в LV Process library.lvlib:Check and Generate Path to lv_proc.vi, который не учитывает случай, когда Top Level VI и dll-ка расположены в разных папках.

Re: Работа с Cmd

PostPosted: 16 Sep 2018, 02:33
by dadreamer
Blackman wrote:Что значит - он устарел?

По ссылке https://forums.ni.com/t5/Community-Docu ... -p/3497836 версия архива 0.6.0.1, тогда как на гитхаб 0.6.1.1.

Re: Работа с Cmd

PostPosted: 16 Sep 2018, 11:43
by Blackman
Я взял пакет на 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.