воскресенье, 10 июня 2018 г.

Waitforexit msdn


Waitforexit msdn
Eu quero esperar por um processo para concluir, mas process. WaitForExit () trava minha GUI. Existe uma maneira baseada em eventos, ou eu preciso gerar um thread para bloquear até sair e delegar o evento eu mesmo?
A partir do 4.0 / C # 5, é melhor representá-lo usando o padrão assíncrono.
Se você escolher a resposta @MgSam, esteja ciente, se você passar por WaitForExitAsync algum CancellationToken, que será automaticamente cancelado após o atraso especificado, você poderá obter uma InvalidOperationException. Para corrigir isso, você precisa mudar.
P. S .: não esqueça de descartar seu CancellationTokenSource a tempo.
De acordo com esse link, o método WaitForExit () é usado para fazer com que o thread atual espere até que o processo associado termine. No entanto, o processo tem um evento Exited que você pode conectar.

Exemplo de uso.
Eu resolvi assim:
Eu redirecionei tanto a entrada, saída e erro e lidou com a leitura de fluxos de saída e erro. Essa solução funciona para o SDK 7- 8,1, tanto para o Windows 7 quanto para o Windows 8.
Eu tentei fazer uma classe que resolveria seu problema usando leitura de fluxo assíncrona, levando em consideração Mark Byers, Rob, stevejay respostas. Ao fazer isso, percebi que há um erro relacionado à leitura do fluxo de saída do processo assíncrono.
Você não pode fazer isso:
Você receberá System. InvalidOperationException: StandardOut não foi redirecionado ou o processo ainda não foi iniciado.
Então você precisa iniciar a leitura assíncrona após o processo ser iniciado:
Fazendo isso, faça uma condição de corrida porque o fluxo de saída pode receber dados antes de defini-los como assíncronos:
Então, algumas pessoas podem dizer que você só precisa ler o fluxo antes de defini-lo como assíncrono. Mas o mesmo problema ocorre. Haverá uma condição de corrida entre a leitura síncrona e o fluxo em modo assíncrono.
Não há como obter uma leitura assíncrona segura de um fluxo de saída de um processo na maneira real como "Process" e "ProcessStartInfo" foram projetados.
Provavelmente, é melhor usar a leitura assíncrona, como sugerido por outros usuários para o seu caso. Mas você deve estar ciente de que pode perder alguma informação devido à condição de corrida.
Nenhuma das respostas acima está fazendo o trabalho.
A solução Rob trava e a solução 'Mark Byers' obtém a exceção descartada (tentei as "soluções" das outras respostas).
Então decidi sugerir outra solução:
Este código depurado e funciona perfeitamente.
Introdução.
A resposta aceita atualmente não funciona (gera exceção) e há muitas soluções alternativas, mas nenhum código completo. Isto é, obviamente, desperdiçando muito tempo das pessoas, porque esta é uma questão popular.
Combinando a resposta de Mark Byers e a resposta de Karol Tyl, escrevi o código completo com base em como eu quero usar o método Process. Start.
Eu usei-o para criar um diálogo de progresso em torno dos comandos do git. É assim que eu usei:
Em teoria, você também pode combinar stdout e stderr, mas eu não testei isso.
As outras soluções (incluindo EM0s) ainda estão em deadlock para meu aplicativo, devido a tempos limite internos e ao uso de StandardOutput e StandardError pelo aplicativo gerado. Aqui está o que funcionou para mim:
Editar: adicionada inicialização do StartInfo ao exemplo de código.
Este post talvez desatualizado, mas eu descobri a causa principal porque normalmente travar é devido ao estouro de pilha para a saída redirectStandard ou se você tiver redirectStandarderror.
Como os dados de saída ou os dados de erro são grandes, isso causará um tempo de interrupção, pois ainda está sendo processado por duração indefinida.
então, para resolver esse problema:
Eu acho que essa é uma abordagem simples e melhor (não precisamos do AutoResetEvent):
Eu estava tendo o mesmo problema, mas o motivo era diferente. No entanto, isso aconteceria no Windows 8, mas não no Windows 7. A linha a seguir parece ter causado o problema.
A solução foi NÃO desabilitar o UseShellExecute. Eu agora recebi uma janela popup do Shell, que é indesejada, mas muito melhor do que o programa esperando que nada de especial aconteça. Então eu adicionei a seguinte solução para isso:
Agora, a única coisa que me incomoda é por que isso está acontecendo no Windows 8 em primeiro lugar.
Eu sei que esta é a ceia de idade, mas, depois de ler esta página inteira, nenhuma das soluções estava funcionando para mim, embora eu não tenha tentado Muhammad Rehan como o código foi um pouco difícil de seguir, embora eu acho que ele estava no caminho certo . Quando eu digo que não funcionou isso não é inteiramente verdade, às vezes funcionaria bem, eu acho que é algo a ver com o comprimento da saída antes de uma marca EOF.
De qualquer forma, a solução que funcionou para mim foi usar diferentes threads para ler o StandardOutput e StandardError e escrever as mensagens.
Espero que isso ajude alguém, que pensou que isso poderia ser tão difícil!
Depois de ler todos os posts aqui, resolvi a solução consolidada de Marko Avlijaš. No entanto, isso não resolveu todos os meus problemas.
Em nosso ambiente, temos um serviço do Windows que está programado para executar centenas de arquivos. bat. cmd. exe diferentes. etc arquivos que se acumularam ao longo dos anos e foram escritos por muitas pessoas diferentes e em diferentes estilos. Nós não temos controle sobre a escrita dos programas & amp; scripts, somos responsáveis ​​apenas pelo agendamento, execução e geração de relatórios sobre sucesso / falha.
Então eu tentei praticamente todas as sugestões aqui com diferentes níveis de sucesso. A resposta de Marko foi quase perfeita, mas quando executada como um serviço, nem sempre captava stdout. Eu nunca cheguei ao fundo do por que não.

Waitforexit msdn
Estou tendo um problema com isso e espero que alguns de vocês possam lançar alguma luz sobre isso para mim? O bloco de código:
Eu mudei o URL, obviamente, mas isso não é importante. Quando eu tento executá-lo, isso me dá uma exceção no & quot; WaitForExit & quot; linha indicando & quot; Nenhum processo está associado a este objeto & quot;
Qualquer ajuda aqui seria muito apreciada!
O nome do arquivo do processo deve ser um arquivo executável.
SITE DO CONVERSOR DE CÓDIGO.
Editado por kaymaf terça-feira, 19 de outubro de 2010 18:32 Marcado como Resposta Frank L. Smith terça-feira, 19 de outubro de 2010 18:35.
O dois método funcionará.
SITE DO CONVERSOR DE CÓDIGO.
Marcado como Resposta Frank L. Smith terça-feira, 19 de outubro de 2010 18:44.
Todas as respostas.
O nome do arquivo do processo deve ser um arquivo executável.
SITE DO CONVERSOR DE CÓDIGO.
Editado por kaymaf terça-feira, 19 de outubro de 2010 18:32 Marcado como Resposta Frank L. Smith terça-feira, 19 de outubro de 2010 18:35.
O nome do arquivo do processo deve ser um arquivo executável.
SITE DO CONVERSOR DE CÓDIGO.
OH! Bem, isso explicaria isso então, mas no passado usar & quot; Process. Start (& quot; url aqui & quot;) sempre funcionou.
Você tem uma ideia de como eu poderia fazer isso para que ele abra o navegador padrão para acessar o site?
Kaymaf tem razão - isso faz sentido quando eu dou a ele um nome de arquivo ou url, isso funciona por causa da associação do arquivo. O seguinte funciona:
Eu vou com isso, mas se alguém tem uma idéia de como eu posso conseguir usar o navegador padrão, eu agradeceria.
O dois método funcionará.
SITE DO CONVERSOR DE CÓDIGO.
Marcado como Resposta Frank L. Smith terça-feira, 19 de outubro de 2010 18:44.
O dois método funcionará.
SITE DO CONVERSOR DE CÓDIGO.
Obrigado - boa informação. :)
A Microsoft está realizando uma pesquisa online para entender sua opinião sobre o site da MSDN. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site do Msdn.

Waitforexit msdn
Estou tendo um problema com isso e espero que alguns de vocês possam lançar alguma luz sobre isso para mim? O bloco de código:
Eu mudei o URL, obviamente, mas isso não é importante. Quando eu tento executá-lo, isso me dá uma exceção no & quot; WaitForExit & quot; linha indicando & quot; Nenhum processo está associado a este objeto & quot;
Qualquer ajuda aqui seria muito apreciada!
O nome do arquivo do processo deve ser um arquivo executável.
SITE DO CONVERSOR DE CÓDIGO.
Editado por kaymaf terça-feira, 19 de outubro de 2010 18:32 Marcado como Resposta Frank L. Smith terça-feira, 19 de outubro de 2010 18:35.
O dois método funcionará.
SITE DO CONVERSOR DE CÓDIGO.
Marcado como Resposta Frank L. Smith terça-feira, 19 de outubro de 2010 18:44.
Todas as respostas.
O nome do arquivo do processo deve ser um arquivo executável.
SITE DO CONVERSOR DE CÓDIGO.
Editado por kaymaf terça-feira, 19 de outubro de 2010 18:32 Marcado como Resposta Frank L. Smith terça-feira, 19 de outubro de 2010 18:35.
O nome do arquivo do processo deve ser um arquivo executável.
SITE DO CONVERSOR DE CÓDIGO.
OH! Bem, isso explicaria isso então, mas no passado usar & quot; Process. Start (& quot; url aqui & quot;) sempre funcionou.
Você tem uma ideia de como eu poderia fazer isso para que ele abra o navegador padrão para acessar o site?
Kaymaf tem razão - isso faz sentido quando eu dou a ele um nome de arquivo ou url, isso funciona por causa da associação do arquivo. O seguinte funciona:
Eu vou com isso, mas se alguém tem uma idéia de como eu posso conseguir usar o navegador padrão, eu agradeceria.
O dois método funcionará.
SITE DO CONVERSOR DE CÓDIGO.
Marcado como Resposta Frank L. Smith terça-feira, 19 de outubro de 2010 18:44.
O dois método funcionará.
SITE DO CONVERSOR DE CÓDIGO.
Obrigado - boa informação. :)
A Microsoft está realizando uma pesquisa online para entender sua opinião sobre o site da MSDN. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site do Msdn.

Gerenciando Processos no PowerShell.
Várias pessoas perguntaram recentemente sobre como gerenciar processos no PowerShell. Esta postagem do blog deve responder a várias dessas perguntas.
Como se poderia esperar do & # 8220; shell & # 8221; Como parte do PowerShell, você não precisa fazer nada especial para iniciar um processo. Em uma linguagem de programação como o VBScript, você precisa fazer algo bastante complexo como:
Defina objWMIService = GetObject (& # 8220; winmgmts: & # 8221; _.
Defina objStartup = objWMIService. Get (& # 8220; Win32_ProcessStartup & # 8221;)
Defina objConfig = objStartup. SpawnInstance_.
Defina objProcess = GetObject (& # 8220; winmgmts: raiz \ cimv2: Win32_Process & # 8221;)
objProcess. Create & # 8220; Notepad. exe & # 8221 ;, Null, objConfig, intProcessID.
mas em shells (PowerShell, cmd. exe, bash, etc.) você pode simplesmente iniciar um programa como o bloco de notas simplesmente digitando & # 8220; notepad & # 8221; como mostrado.
Agora você notará que, quando fizer isso, o shell retornará imediatamente e solicitará o próximo comando. Isso porque o notepad é um processo de GUI do win32 e é executado em segundo plano. Por outro lado, se você iniciar um aplicativo de console como o & # 8220; ping. exe & # 8221 ;, o PowerShell esperará até que esse processo seja concluído.
Mas e se eu quiser esperar pelo processo do Win32? No cmd. exe, você faria isso com & # 8220; start / wait & # 8221; mas esse comando não está (diretamente) disponível no PowerShell. Então, o que fazemos?
O PowerShell executa diretamente executáveis. Se aguarda a saída do processo, o código de saída será deixado em $ LASTEXITCODE. Agora, se um executável do Win32 for o último comando em um pipeline e não for redirecionado, o processo será executado em segundo plano. No entanto, se você enviar sua saída para algo, o PowerShell aguardará a saída do comando.
Portanto, essa é uma espera simples (se não intuitiva) para aguardar a saída de um processo da GUI.
Como alternativa, se o processo já estiver em execução, você poderá usar Get-Process para recuperar as informações necessárias e, em seguida, executar um WaitForExit () nesse objeto.
Aqui está um exemplo um pouco mais sofisticado, onde abrimos um documento em vez de iniciar um processo. Dessa vez, encontraremos o processo pelo título da janela, e não pelo nome do executável.
Infelizmente, procurar um processo sempre significa que você pode encontrar o processo errado. Idealmente, você gostaria de obter o objeto Process diretamente. Portanto, para um gerenciamento de processos mais preciso, você terá que usar a classe System. Diagnostics. Process e iniciar os processos por conta própria. Por exemplo, você pode usar [diagnostics. process] :: Start () para aguardar um processo:
Observe o uso de & # 8220; $ pwd \ foo. txt & # 8221; para especificar o caminho completo para o arquivo. Isso ocorre porque o PowerShell mantém sua própria ideia do diretório atual. (Esta nota se aplica ao uso de qualquer API que acesse o sistema de arquivos - você precisa dar um caminho absoluto.)
Agora, estamos começando a voltar ao nível de complexidade que você encontra em uma linguagem de programação. No entanto, você também tem todo o poder dessas linguagens. Aqui está um script de exemplo & # 8220; background. ps1 & # 8221; Isso permitirá que você execute um scriptblock desanexado em uma janela separada (ou na mesma janela se você especificar o parâmetro – inconsole.
Este script permite que você faça coisas no PowerShell que você não pode fazer a partir do cmd. exe, mas pode fazer a partir do VBScript.
Finalmente, aqui estão mais duas maneiras de trabalhar com processos. Mesmo que o PowerShell não tenha um comando de início, o cmd. exe faz isso, você pode iniciar / esperar fazendo.
E, por último, mas não menos importante, o PowerShell Community Extensions inclui um cmdlet Start-Process. Você pode obter uma lista desses recursos em:
Bruce Payette [MSFT]
Windows PowerShell Tech Lead.
Top Server & # 038; Blogs de ferramentas.
Postagens recentes.
DSC Resource Kit versão de fevereiro de 2018 7 de fevereiro de 2018 Configuração do estado desejado (DSC) Planning Update & # 8211; Janeiro de 2018 26 de janeiro de 2018 PowerShell Core 6.1 Roadmap 24 de janeiro de 2018 PowerShell Core 6.0: disponível em geral (GA) e com suporte! 10 de janeiro de 2018.
Eu tenho um script master powershell chamando um subscrito. O subscrito lança um erro, mas $ LASTEXITCODE em MASTER não parece pegá-lo.
Basicamente meu processo pára no momento em que o comando throw é executado e o processo não é retornado para o MASTER.
Existe uma maneira de contornar isso?
Muito obrigado por este artigo !
Seria muito bom ver uma versão atualizada disso com todas as extensões V2 como Start-Process e as extensões Jobs.
Obrigado por todo o trabalho duro, o PowerShell está se preparando para ser uma ferramenta realmente incrível para automação de processos!
Você pode encontrar mais detalhes aqui: [link] Shay [link]
Uma breve pesquisa no google: & amp; lt; [link] & gt; onde é dada a ponta a saída do pipe para out-null. bloco de anotações.
Na verdade eu estou integrando o VB e um programa escrito em C ++. Eu sou capaz de executar este programa C ++, clicando em um botão projetado em VB. Quando clico no botão, o prgram é executado na plataforma DOS. Eu não quero essa plataforma DOS visível. Mas o processo C ++ deve continuar rodando em segundo plano, invisível.
Se eu passar o scriptblock que contém variável, o código não parece funcionar. Isso ocorre porque o processo filho não herda as variáveis ​​do pai. Como posso superar isso?
Bruce, eu tenho andado por aí com runspaces para obter processamento em background de scriptblocks (em ps1.soapyfrog / 2007/01/22 / running-pipelines-in-the-background /)
Será que provavelmente veremos isso se tornando mais amigável nos próximos lançamentos?
Eu percebo que os runspaces estão realmente disponíveis para aplicativos host, mas eles parecem úteis.
Seu comentário no & quot; site de conexão do PowerShell & quot; é notado.
& # 8220; $ np = bloco de notas do processo get & # 8221; é * extemely * acertar ou errar se você usar muito o bloco de notas. Você poderia classificar os processos por data de início, criados por você, etc., em um esforço para mitigar os erros, mas sim & # 8211; deveríamos ter fornecido uma maneira de obter o processo mais recente criado em um runspace. Em vez de ter uma única variável $ LASTPROCESS, eu estava pensando que uma matriz de $ process ao longo das linhas de $ error seria legal. O processo criado mais recentemente seria mantido em $ process [0].
& gt; como o PowerShell é um shell, o controle de processos / tarefas não deve ser um cidadão de primeira classe.
Isso parece óbvio se não tivesse implementado um cmdlet New-Process / Start-Process, mas foi cortado do projeto em um ponto. Na triagem do que ocorreu na V1, nada além do gerenciamento básico de processos obteve uma classificação relativamente baixa, pois o PowerShell permite que você tenha acesso ao [Diagnostics. Process]. Isso significa que, embora possa ser complexo, você pode fazer praticamente qualquer coisa. Enviar é escolher como Jeffrey diz.
Poste uma solicitação no site de conexão do PowerShell para que outras pessoas possam modificá-lo. Esta é uma fonte de dados importante no processo de tiragem para o que vai para a próxima versão. Se um número suficiente de pessoas pedir, então ele vai para a lista curta do V. Next.
E, respondendo a um comentário anterior:
& gt; Qual é o poder de equivalência dos processos de inicialização em máquinas remotas, ele ainda usa o WMI?
As operações remotas no 1.0 exigem que você use o WMI, APIs remotos ou outros mecanismos de remoting existentes. O PowerShell 1.0 não possui recursos remotos explícitos. Suporte para remoting é um Pri 0 para o próximo lançamento.
Bloco de notas $ np = get-process.
é um pouco errático & # 8211; qual processo de bloco de notas deve ser obtido? Pior, se houver uma correspondência, ela retornará um único objeto Process & # 8230; se não, uma matriz.
Talvez a próxima versão do PowerShell possa pré-carregar uma variável $ LASTPROCESS com o objeto de processo do último processo que ela lançou, então coisas como:
Além disso, como o PowerShell é um shell, o controle de processo / trabalho não deve ser um cidadão de primeira classe e ser suportado com cmdlets?
Sim & # 8211; Eu consertei a entrada do blog. Obrigado.
O $ LASTERRORCODE deve ser $ LASTEXITCODE?
O exemplo VB permite que você execute o processo em máquinas remotas. Caso contrário, um comando WSH muito mais simples pode executar processos. Qual é o poder de equivalência dos processos de inicialização em máquinas remotas, ele ainda usa o WMI?

Processo . Método WaitForExit.
A documentação de referência da API tem uma nova casa. Visite o Navegador da API em docs. microsoft para ver a nova experiência.
Define o período de tempo para aguardar a saída do processo associado e bloqueia o thread atual de execução até que o tempo tenha transcorrido ou o processo tenha sido encerrado. Para evitar o bloqueio do segmento atual, use o evento Exited.
Para exemplos de código, consulte as páginas de referência de propriedade StandardError e ExitCode.
Assembly: System (no System. dll)
Instrui o componente Process a aguardar indefinidamente que o processo associado seja encerrado.
Instrui o componente Processo a aguardar o número especificado de milissegundos para o processo associado sair.

Комментариев нет:

Отправить комментарий