SHELL Command [ WAIT ] [ FOR
( READ | WRITE | READ WRITE
) [ AS Variable ]

Выполняет команду через системный командный процессор (shell).
Создается внутренний объект Process для обслуживания команды.
- Если задано WAIT , тогда интерпретатор ждет
окончания команды. Иначе команда выполняется в фоновом режиме.
- Если задано FOR , тогда команда ввода-вывода
перенаправляется так, что ваша программа перехватывает их :
- Если задано WRITE , вы можете отправить
данные на стандартный ввод команд, используя объект Process с общим
выводом инструкций: PRINT, WRITE, ... Заметьте, что вам нужна ссылка на
объект Process для этого.
- Если задано READ , тогда события будут
генерироваться каждый раз, когда команда посылает данные в ее
стандартные выводные потоки: событие Read
возбуждается, когда данные отправляются в стандартый поток вывода, а
событие Error возбужадется, когда данные отправляются в стандартный
поток ошибок. Используйте объект process с общим вводом
инструкций для чтения стандартного вывода process: INPUT, READ или
LINE INPUT.
- И, наконец, вы можете получить ссылку на внутренний объект
Process в переменную Variable , задавая ключ AS
.
Пример
' Get the content of a directory
SHELL "ls -la > /tmp/result" WAIT
Content = File.Load("/tmp/result")
' Same thing, but in background
SHELL "ls -la > /tmp/result" FOR READ
...
PUBLIC SUB Process_Read()
DIM sLine AS String
LINE INPUT #LAST, sLine
Content = Content & sLine
END
Отличия от VB
В отличие от VB Shell комманд, которые возвращают process ID и
полагаются на то, что программист сделает API вызов для управления
процессом, Gambas Shell функция опционно возвращает объект Process
(если вызвается с параметром AS), который может быть использован для
непосредственного уничтожения или иного управления порожденным
процессом. Дополнительно процесс может быть запущен синхронно в
противоположность VB эквиваленту.
Совет:
Вы могли заметить, что все события Process запускают те же поддержки
событий, именно Process_Read, Process_Kill и т.д. Вы можете различить
процессы двумя путями:
- Сделать каждый объект Process глобальным для вашего класса и
далее "IF LAST.Id = Process1.Id THEN..."
- Использовать Object.Attach
для перенаправления его событий в различные наборы поддержки.
Предыдущее: Sgn Следующее: Shl