EXEC
[ Processo = ] EXEC Comando [ WAIT ] [ FOR { { READ | INPUT } | { WRITE | OUTPUT } } ] [ AS Nome ]
EXEC Commando TO Variavel
Executa um comando. Um objeto
Process é criado para gerenciar o comando.
O comando deve ser especificado como uma array de strings contendo ao menos um elemento. O primeiro elemento deste array é o nome do comando e os outros são parâmetros opcionais.
-
Se
WAIT
é especificado, então o interpretador espera pelo término do comando. Caso contrário, o comando é executado em background.
-
Se
FOR
é especificado, então as entradas e saídas do comando são redirecionadas de forma que o programa os intercepte:
-
Se
WRITE
é especificado, você pode enviar dados à entrada padrão do comando usando o objeto Process com instruções comuns de saída: PRINT, WRITE, ... Note que você pode precisar de uma referência ao objeto Process para isso.
-
Se
READ
é especificado, então eventos serão gerados cada vez que o comando enviar dados para sua stream de saída padrão: o evento Read é gerado quando dados são enviados para o stream de saída padrão, e o evento Error é gerado quando dados são enviados para o stream de erros padrão. Use o objeto Process com stream para ler a saída padrão do processo.
Se você usar as palavras chaves
INPUT
e
OUTPUT
ao invés de
READ
e
WRITE
, então o processo é executado dentro de um terminal virtual. Isso significa que o processo irá pensar que está rodando de um terminal verdadeiro.
Nome
é o nome de evento usado pelo objeto
Process. Por padrão, ele é
"Process"
.
Você pode obter uma referência ao objeto
Process interno criado usando uma atribuição.
Se você usar a segunda sintaxe, o comando é executado, o interpretador espera pelo seu término, e a saída completa do comando é colocada na string especificada.
Examples
' Obtém o conteúdo de um diretório
EXEC [ "ls", "-la", "/tmp" ] WAIT
' Coloca o conteúdo de um diretório em uma string
DIM sSaida AS String
EXEC [ "ls", "-la", "/tmp" ] TO sSaida
' Coloca o conteúdo de um diretório em uma string, mas em background
DIM sSaida AS String
' Um nome de evento específico é usado
EXEC [ "ls", "-la", "/tmp" ] FOR READ AS "Conteudos"
...
PUBLIC SUB Conteudos_Read()
DIM sLinha AS String
READ #LAST, sLinha, -256
sSaida &= sLinha
END
PUBLIC SUB Conteudos_Kill()
PRINT sSaida
END
Se você quiser saber quantos bytes você pode ler em um
event handler Process_Read
, use a função
Lof.
Como os argumentos são enviados diretamente ao processo, você não tem que colocá-los entre aspas, como teria que fazer em um shell.
Examples
' perl -e 'print while <>;' se torna
EXEC [ "perl", "-e", "print while <>;" ] FOR READ WRITE
Veja também