Thursday 1 March 2018

Powershell start-process waitforexit timeout


Powershell start-process waitforexit timeout
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como capturar a saída do processo de forma assíncrona no powershell?
Eu quero capturar stdout e stderr de um processo que eu começo em um script Powershell e exibi-lo de forma assíncrona para o console. Eu encontrei alguma documentação ao fazer isso através do MSDN e outros blogs.
Depois de criar e executar o exemplo abaixo, não consigo obter qualquer saída para ser exibida de forma assíncrona. Toda a saída é exibida apenas quando o processo termina.
Neste exemplo, esperava ver o resultado de "oi" na linha de comando antes do final da execução do programa porque o evento OutputDataReceived deveria ter sido acionado.
Eu tentei isso usando outros executáveis ​​- java. exe, git. exe, etc. Todos eles têm o mesmo efeito, então me deixo pensar que há algo simples que não estou entendendo ou que perdi. O que mais precisa ser feito para ler o stdout de forma assíncrona?
Infelizmente, a leitura assíncrona não é tão fácil se você deseja fazê-lo corretamente. Se você chamar WaitForExit () sem tempo limite, você poderia usar algo como essa função que escrevi (com base no código C #):
Ele captura stdout, stderr e código de saída. Exemplo de uso:
Para mais informações e implementações alternativas (em C #), leia esta postagem no blog.
Com base na resposta de Alexander Obersht, criei uma função que usa tempo limite e tarefas Tarefas assíncronas em vez de manipuladores de eventos. De acordo com Mike Adelson.
Infelizmente, esse método (manipuladores de eventos) não fornece nenhuma maneira de saber quando o último bit de dados foi recebido. Porque tudo é assíncrono, é possível (e eu observei isso) para que os eventos disparem depois que WaitForExit () retornou.
Não consegui que nenhum desses exemplos funcionasse com o PS 4.0.
Eu queria executar uma aplicação de fantoche a partir de um pacote Octopus Deploy (via Deploy. ps1) e ver a saída em "tempo real" ao invés de aguardar o término do processo (uma hora depois), então eu criei o seguinte:
Os exemplos aqui são úteis, mas não se adequaram completamente ao meu caso de uso. Eu não queria invocar o comando e sair. Eu queria abrir um prompt de comando, enviar entrada, ler a saída e repetir. Aqui está a minha solução para isso.

Powershell start-process waitforexit timeout
Obter através da App Store Leia esta publicação em nosso aplicativo!
Usando o comando start-process e - wait no Powershell.
Eu sou novo no Powershell e não tenho muito um fundo de programação, apenas tentando usá-lo para embalagens de software. De qualquer forma, descobri sobre o comando start-process com o parâmetro - Wait, e funciona muito para a maioria das coisas. O que eu notei é que não só espera o processo que você especifica, ele espera por qualquer subprocesso, mesmo depois que o processo principal já não está sendo executado. Normalmente isso é bom, mas tenho uma situação estranha. Estou executando um complexo arquivo de lote do Oracle com o processo de início. O arquivo em lote eventualmente executa setup. exe, que é o que eu realmente quero esperar, mas outros processos também geram que nunca parar. Então, se eu usar o parâmetro - wait, o script nunca pára mesmo depois que o setup. exe não estiver sendo executado. O mais próximo que encontrei é usar isso:
Isso funciona, mas eu pensaria que haveria uma maneira melhor sem ter que usar um comando de tempo limite. Alguma ideia?

Powershell start-process waitforexit timeout
Estou usando um produto de backup chamado Commvault (versão 9 / SP6a).
Estou executando um comando Commvault & quot; qmedia - b XX2201L4 - el 'Offsite' & quot ;.
Isso corre OK a partir do prompt interativo powershell.
Coloquei o seguinte em um arquivo de script do powershell:
$ exportarg = & quot; - b XX2201L4 - e 'Offsite' & quot;
start-process $ export $ exportarg-wait.
No entanto, eu nunca obtive o & quot; feito? exibir na minha tela. Eu vejo que o processo de início cria uma nova janela, mas essa janela nunca desaparece mesmo quando o "qmedia" O comando fez seu trabalho.
Como faço para corrigir isso?
Você pode tentar executar alguns PSDebug e PSBreakpoints nele. Tente esses comandos se você não estiver familiarizado com a forma de configurá-lo:
Para então, execute seu script.
Quando é executado, você verá alguma saída amarela (porque o debug está ativado) e ele irá parar nas linhas 2, 3 e, 4. Quando ele pára, você pode consultar ao redor, olhando variáveis, verificando processos, etc. para determinar mais sobre o funcionamento atual do script do que simplesmente executá-lo e falhar. Além disso, você pode usar Write-Debug para obter uma visão semelhante, mas não permite que você visualize os objetos do pipeline como tempo de execução.
Por fim, talvez seja necessário escrever seu erro padrão e saída para o arquivo para ver se há algo que você não está pegando porque ele está sendo executado em uma janela diferente. Para cortar esse processo, experimente a opção - NoNewWindow. Se ocorrerem erros ou há alguma resposta do. exe, você deve vê-lo no console.
Marcado como resposta por Yan Li_ Moderador sexta-feira, 15 de junho de 2012 1:48.
Todas as respostas.
Agora tentei usar o caminho completo para "qmedia" e o mesmo acontece!
algumas perguntas e sugestões:
Além de fornecer o caminho completo para qmedia, sugiro incluir os nomes dos parâmetros - filepath e - guistlistlist. Você pode dizer se está recebendo os parâmetros que você pretende passar para ele? Você diz que pode executar o comando a partir do prompt do powershell. O que acontece quando você o executa a partir do prompt usando parâmetros de processo inicial e literal? O que acontece se você deixar a espera - a janela eventualmente fecha? O que acontece se você colocar o comando qmedia no script (sem usar o processo de início? Que janela é que o processo de início é aberto e, em seguida, não fecha?
Se o qmedia for executado corretamente a partir de um script de powershell sem usar o processo de início, mas você precisa de um processo de início por causa da funcionalidade de "wait", então talvez seu script principal possa usar start-process para iniciar o powershell para executar um script que contenha apenas o comando qmedia .
Você pode tentar executar alguns PSDebug e PSBreakpoints nele. Tente esses comandos se você não estiver familiarizado com a forma de configurá-lo:
Para então, execute seu script.
Quando é executado, você verá alguma saída amarela (porque o debug está ativado) e ele irá parar nas linhas 2, 3 e, 4. Quando ele pára, você pode consultar ao redor, olhando variáveis, verificando processos, etc. para determinar mais sobre o funcionamento atual do script do que simplesmente executá-lo e falhar. Além disso, você pode usar Write-Debug para obter uma visão semelhante, mas não permite que você visualize os objetos do pipeline como tempo de execução.
Por fim, talvez seja necessário escrever seu erro padrão e saída para o arquivo para ver se há algo que você não está pegando porque ele está sendo executado em uma janela diferente. Para cortar esse processo, experimente a opção - NoNewWindow. Se ocorrerem erros ou há alguma resposta do. exe, você deve vê-lo no console.
Marcado como resposta por Yan Li_ Moderador sexta-feira, 15 de junho de 2012 1:48.
Estou tendo um problema parecido. Eu faço o processo de início no dism (com caminho completo, lista de argumentos, aguarde e não é possível). A primeira vez que meus scripts executam este cmdlet, ele nunca terminará. Eu substituí a primeira chamada (que faz a / mount-wim) com um simples & quot; & quot; correndo e funciona.
Parece-me que o processo de início está sofrendo alguns recursos de processo severos.
PS C: \ OPK & gt; get-host.
Estou executando isso em uma caixa virtual Windows 7 profissional, atualizado PowerShell para v3.0.
P. S .: O PowerShell 3.0 tem problemas com sua ajuda off-line (Update-Help porque o Administrador não funciona bem)
Eu tive esse problema ao tentar lote o Adobe Flash CS 5.5. O problema é, aparentemente, que - aguardar espera que todo o grupo de processos termine. No caso de Flash, ele gera Adobe CS5 Extension Manager, que não termina quando o processo do Flash sai. Se eu matar o Extension Manager, o processo de início retornaria.
Eu tentei duas abordagens que ambos contornam esta questão:
Você pode criar um objeto de processo usando o novo sistema System. Diagnostic. Process etc. (a web deve fornecer exemplos suficientes para fazer isso).
ou, a maneira muito mais simples.
use start-process - passthru em vez de - wait, salve o processo retornado em uma variável e use WaitForExit (), como este:
Espero que isso ajude a alguém.
Editado por UWinkelmann sexta-feira, 15 de novembro de 2013 2:48 PM.
A Microsoft está realizando uma pesquisa on-line para entender sua opinião sobre o site da Technet. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site da Technet.

o registro de walter.
. Escrevendo enquanto aprende.
Sexta-feira, 18 de novembro de 2011.
Process. WaitForExit (Int32) bloqueia o problema.
Como você pode ver, o código inicia um processo "cmd. exe" e passa para ele o comando que eu quero ser executado.
No código eu usei o comando ping - t 8.8.8.8 que, por causa da opção - t, pings o host sem parar. O que acontece? O processo "cmd. exe" juntamente com o comando ping - t nunca sai e nunca fecha o fluxo de stdout e, portanto, o nosso código trava no Output = process. StandardOutput. ReadToEnd (); linha, porque não pode ter sucesso em ler todo o fluxo.
O mesmo acontece também se um comando em um arquivo em lotes trava por qualquer motivo e, portanto, o código acima pode funcionar continuamente por anos e, em seguida, pendure de repente sem nenhum motivo aparente.
você pode enfrentar um impasse se o comando que você atribui a "cmd. exe" ou o processo que você está chamando preenche a saída padrão ou erro padrão. Isso porque nosso código não pode alcançar as linhas.
Na verdade, o processo filho (o comando ping ou um arquivo em lote ou o processo que estiver executando) não pode continuar se o nosso programa não ler os buffers preenchidos dos fluxos e isso não pode acontecer porque o código está pendurado na linha com o processo. WaitForExit () que aguardará para sempre que o projeto filho saia.
O tamanho padrão de ambos os fluxos é de 4096 bytes. Você pode testar esses dois tamanhos com esses arquivos em lote:

No comments:

Post a Comment