Thursday 1 March 2018

Processo de diagnóstico do sistema waitforexit powershell


System. diagnostics. process waitforexit powershell
Obter através da App Store Leia esta publicação em nosso aplicativo!
Obtendo ExitCode usando Start-Process e WaitForExit em vez de - Wait.
Estou tentando executar um programa do PowerShell, aguardar a saída, depois ter acesso ao ExitCode, mas não ter muita sorte. Eu não quero usar - Aguarde com o Processo de Início, como eu preciso de algum processamento para continuar em segundo plano.
Aqui está um script de teste simplificado:
A execução deste script fará com que o bloco de notas seja iniciado. Depois disso, é fechado manualmente, o código de saída será impresso, e ele será iniciado de novo, sem usar - wait. Nenhum ExitCode é fornecido quando isso é encerrado:
Eu preciso ser capaz de executar um processamento adicional entre iniciar o programa e aguardá-lo para sair, então eu não posso fazer uso de "Esperar". Alguma idéia de como posso fazer isso e ainda ter acesso à propriedade. ExitCode desse processo?
Duas coisas que você poderia fazer, eu acho.
Crie o objeto System. Diagnostics. Process manualmente e ignore o Start-Process Execute o executável em uma tarefa em segundo plano (apenas para processos não interativos).
Veja como você poderia fazer:
Há duas coisas para lembrar aqui. Um é adicionar o argumento - PassThru e dois é adicionar o argumento - Wait. Você precisa adicionar o argumento de espera por causa desse defeito, connect. microsoft/PowerShell/feedback/details/520554/start-process-does-not-return-exitcode-property.
Depois de fazer isso, um objeto de processo é passado de volta e você pode observar a propriedade ExitCode desse objeto. Aqui está um exemplo:
Se você executá-lo sem - PassThru ou - Wait, ele não imprimirá nada.
Enquanto tentava a sugestão final acima, descobri uma solução ainda mais simples. Tudo o que eu tinha que fazer era armazenar em cache o identificador do processo. Assim que eu fiz isso, $ process. ExitCode funcionou corretamente. Se eu não escondeu o process handle, $ process. ExitCode era nulo.
Ou tente adicionar isso.
Ao usar este código, você ainda pode permitir que o PowerShell se ocupe de gerir os fluxos de saída / erro redirecionados, o que você não pode fazer usando System. Diagnostics. Process. Start () diretamente.
A opção '' Esperar 'parecia me bloquear mesmo que meu processo tivesse terminado.
Eu tentei a solução de Adrian e funciona. Mas eu usei Wait-Process em vez de confiar em um efeito colateral de recuperar o process handle.

System. diagnostics. process waitforexit powershell
Eu tenho o seguinte código na minha aplicação:
System. Diagnostics. Process proc = new System. Diagnostics. Process ();
Uma vez que eu chamo isso através de outra aplicação, o processo está pendurado.
Então eu dei um tempo de 5 segundos e agora funciona bem. Mas eu preciso encontrar uma maneira melhor de resolver esse problema, pois esse valor de tempo limite pode depender dos recursos do sistema e a quantidade de aplicativo de entrada deve ser processada.
Então, minha pergunta é se estamos criando um processo usando o System. Diagnostics, o sistema operacional cria um segmento separado e o faz como fio primário ou UI thread?
Ou está criando um fio CLR que é o mesmo que System. Threading. Thread?
Se usarmos Thread-pool para criar uma thread de trabalho, seria uma opção melhor?
O pool de threads usa o modo de programação do usuário?
Aprecie sua ajuda nisso.
Eu preciso saber disso, porque se o System. Diagnostics também criar um thread de fundo ou thread de trabalho, nenhum ponto criando um thread separado novamente, pois não haverá nenhuma alteração no final do dia.
Qual a diferença entre a implementação acima sobre a criação de uma linha de fundo?
Você está confundindo os tópicos internos e externos ao seu aplicativo. Se você usa WaitForExit no seu segmento UI. Isso bloqueará o segmento UI tornando-o insensível. Se isso é um problema, genere o novo processo no evento DoWork de um BackgroundWorker. Quando o processo for encerrado, o RunWorkerCompleteEvent será ativado, alertando seu segmento UI.
Marcado como resposta por Min Zhu pessoal contingente da Microsoft, Moderador segunda-feira, 18 de julho de 2011 3:10 AM.
Todas as respostas.
Esperando um evento com EnableRaisingEvents = false significa que você está usando WaitForExit como um temporizador. Defina-o para um valor apropriado.
Esperando um evento com EnableRaisingEvents = false significa que você está usando WaitForExit como um temporizador. Defina-o para um valor apropriado.
Eu atribuí 5000 como o valor e corrigiu o problema. Minha preocupação é que funcionará de forma semelhante em diferentes recursos do sistema, tamanho de conteúdo de entrada etc.?
O que acontecerá se o processo associado não sair ao final do intervalo?
O Windows não é um sistema operacional em tempo real, então qualquer temporizador dependerá do agendamento do sistema operacional. Supostamente, o System. Timers. Timer é o mais preciso.
& quot; o que acontecerá se o processo associado não sair ao final do intervalo? & quot; Você desativou esse recurso. Se é isso que você está tentando fazer, habilite-o. Se você não deseja bloquear o segmento que você usou para iniciar o processo, inicie-o a partir de um segmento de fundo. O BackgxroundWorker seria apropriado para isso.
Eu preciso saber disso, porque se o System. Diagnostics também criar um thread de fundo ou thread de trabalho, nenhum ponto criando um thread separado novamente, pois não haverá nenhuma alteração no final do dia.
Qual a diferença entre a implementação acima sobre a criação de uma linha de fundo?
Eu preciso saber disso, porque se o System. Diagnostics também criar um thread de fundo ou thread de trabalho, nenhum ponto criando um thread separado novamente, pois não haverá nenhuma alteração no final do dia.
Qual a diferença entre a implementação acima sobre a criação de uma linha de fundo?
Você está confundindo os tópicos internos e externos ao seu aplicativo. Se você usa WaitForExit no seu segmento UI. Isso bloqueará o segmento UI tornando-o insensível. Se isso é um problema, genere o novo processo no evento DoWork de um BackgroundWorker. Quando o processo for encerrado, o RunWorkerCompleteEvent será ativado, alertando seu segmento UI.
Marcado como resposta por Min Zhu pessoal contingente da Microsoft, Moderador segunda-feira, 18 de julho de 2011 3:10 AM.
A Microsoft está conduzindo uma pesquisa on-line 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.

System. diagnostics. process waitforexit powershell
Estou executando um aplicativo perfcalc. exe enviando alguns parâmetros através de "System. Diagnostics. Process". O objetivo é, eu quero receber de volta o código de saída e o padrão de saída. Está funcionando corretamente. MAS, eu também quero adicionar um limite de tempo limite, por isso, se o processo levar mais de 30 minutos, ele terminará automaticamente o trabalho. A razão pela qual eu preciso disso, o applicaiton perfcalc. exe, por vezes, get-halt ou mantenha o processo, desta forma, o código total não pode ser executado e não recebo nenhum email de notificação.
$ objProcess = New-Object System. Diagnostics. Process.
$ objProcess. StartInfo = New-Object System. Diagnostics. ProcessStartInfo.
$ objProcess. StartInfo. Arguments = & quot; - tSPDF - m \\ srvr098 \ reports \ calc. pdf & quot;
Editado por TekFinder sexta-feira, 06 de junho de 2014 às 17:04.
$ objProcess. WaitForExit () vai bloquear seu processo de script, esperando que ele termine.
Isso funciona para você?
Editado por mjolinor sexta-feira, 06 de junho de 2014 5:48 PM Marcado como resposta por AnnaWY Moderador quarta-feira, 18 de junho de 2014 3:26.
Adicionado tentar catch - Apenas para evitar erros.
Regards Chen V [MCTS SharePoint 2010]
Marcado como resposta por AnnaWY Moderador quarta-feira, 18 de junho de 2014 3:26.
Todas as respostas.
Isso pode dar alguma idéia.
para parar o serviço executando mais de 30 minutos.
Regards Chen V [MCTS SharePoint 2010]
Isso pode dar alguma idéia.
para parar o serviço executando mais de 30 minutos.
Regards Chen V [MCTS SharePoint 2010]
Na verdade, o problema é que o aplicativo perfcalc. exe às vezes está segurando meu processo por tempo indeterminado. Então não tenho chance de sair do porão e usar seu código para encontrar & amp; mate o processo. Se eu quiser usar sua solução, então eu tenho que executar seu código separadamente. Estou procurando por uma solução se eu puder adicionar o limite de tempo dentro da definição do objeto New-Object System. Diagnostics. Process? Como $ objProcess. TimeOut etc. É possível?
Editado por TekFinder sexta-feira, 06 de junho de 2014 5:22 PM.
$ objProcess. WaitForExit () vai bloquear seu processo de script, esperando que ele termine.
Isso funciona para você?
Editado por mjolinor sexta-feira, 06 de junho de 2014 5:48 PM Marcado como resposta por AnnaWY Moderador quarta-feira, 18 de junho de 2014 3:26.
Isso irá bloqueá-lo. Testando seu código agora.
Regards Chen V [MCTS SharePoint 2010]
Desculpe, não atualizei a página antes de publicar.
Agora você pode testar o código mjolinor.
Uma sugestão sobre o que acontece se o processo sair durante o Início-Sair 5 segundos - Stop-Process lançará erro. Mas vale a pena testar.
Regards Chen V [MCTS SharePoint 2010]
Você pode fazer uma tentativa para isso, suponho. Parece que seria discutível se o processo já tivesse saído.
Editado por mjolinor sexta-feira, 06 de junho de 2014 18:00.
Adicionado tentar catch - Apenas para evitar erros.
Regards Chen V [MCTS SharePoint 2010]
Marcado como resposta por AnnaWY Moderador quarta-feira, 18 de junho de 2014 3:26.
Desculpe, não atualizei a página antes de publicar.
Agora você pode testar o código mjolinor.
Uma sugestão sobre o que acontece se o processo sair durante o Início-Sair 5 segundos - Stop-Process lançará erro. Mas vale a pena testar.
Regards Chen V [MCTS SharePoint 2010]
Eu não acho que vai dar um erro. Está novamente verificando se o processo ainda está sendo executado fora do loop do temporizador, antes que ele tente parar o processo.
Se ele sair durante o último ciclo de sono, esse teste falhará e o processo de parada não será executado.
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.

Gerenciando Processos no PowerShell.
Várias pessoas perguntaram recentemente sobre como gerenciar processos no PowerShell. Esta postagem no blog deve responder a uma série dessas questões.
Como se poderia esperar do & # 8220; shell & # 8221; 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; _.
Set objStartup = objWMIService. Get (& # 8220; Win32_ProcessStartup & # 8221;)
Defina objConfig = objStartup. SpawnInstance_.
Set objProcess = GetObject (& # 8220; winmgmts: root \ cimv2: Win32_Process & # 8221;)
objProcess. Create & # 8220; Notepad. exe & # 8221 ;, Null, objConfig, intProcessID.
mas em conchas (PowerShell, cmd. exe, bash, etc.), você pode simplesmente iniciar um programa como bloco de notas simplesmente digitando & # 8220; notepad & # 8221; como mostrado.
Agora, você notará que quando você faz isso, o shell retorna imediatamente e solicita o próximo comando. Isso ocorre porque o bloco de notas é um processo Win32 GUI e é executado em segundo plano. Por outro lado, se você iniciar um aplicativo de console como o & # 8220; ping. exe & # 8221 ;, o PowerShell aguardará até que esse processo seja concluído.
Mas e se eu quiser aguardar o processo Win32? Em cmd. exe, você deve fazer isso com o & # 8220; iniciar / aguardar / # 8221; mas este comando não está (diretamente) disponível no PowerShell. Então, o que fazemos?
O PowerShell executa executáveis ​​diretamente. Se aguarda a saída do processo, o código de saída deixado em $ LASTEXITCODE. Agora, se um executável Win32 é o último comando em uma tubulação e não for redirecionado, o processo será executado em segundo plano. No entanto, se você canalizar sua saída para algo, o PowerShell aguardará o comando para sair.
Então, esta é uma espera simples (se não intuitiva) para aguardar um processo GUI para sair.
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. Desta vez, encontraremos o processo por título da janela em vez do 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 próprios processos. 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 idéia do diretório atual. (Esta nota se aplica ao uso de qualquer API que acessa 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 possui todo o poder dessas linguagens. Aqui é um exemplo de script & # 8220; background. ps1 & # 8221; Isso permitirá que você execute um bloco de script separado 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 do cmd. exe, mas pode fazer a partir do VBScript.
Finalmente, aqui estão mais duas maneiras de trabalhar com os 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, as extensões da comunidade PowerShell incluem um cmdlets Start-Process. Você pode obter uma lista desses recursos em:
Bruce Payette [MSFT]
Lead Lead Tech do Windows PowerShell.
Top Server & # 038; Ferramentas Blogs.
Postagens recentes.
DSC Resource Kit Release Fevereiro de 2018 7 de fevereiro de 2018 Atualização de Planejamento de Configuração de Estado Desejado (DSC) & # 8211; Janeiro de 2018 26 de janeiro de 2018 PowerShell Core 6.1 Roadmap 24 de janeiro de 2018 PowerShell Core 6.0: geralmente disponível (GA) e com suporte! 10 de janeiro de 2018.
Eu obtive um script master powershell que chama um subíndice. O subscrito lança um erro, mas $ LASTEXITCODE no MASTER não parece atrapalhar.
Basicamente, meu processo pára no momento em que o comando throw é executado e o processo não é retornado para MASTER.
Existe uma maneira de contornar isso?
Muito obrigado por este artigo !
Seria realmente ótima ver uma versão atualizada deste com todas as extensões do V2 como Start-Process e as extensões de Jobs.
Obrigado por todo o trabalho, o PowerShell está se formando para ser uma ferramenta verdadeiramente surpreendente para a automação de processos!
Você pode encontrar mais detalhes aqui: [link] Shay [link]
Uma breve pesquisa no google obteve: & amp; lt; [link] & amp; gt; onde a saída da ponta para o tubo é out-null. bloco de anotações.
Na verdade, estou integrando o VB e um programa escrito em C ++. Posso executar este programa C ++ clicando em um botão projetado no VB. Uma vez que eu clique no botão o prgram é executado na plataforma do DOS. Eu não quero essa plataforma DOS visível. Mas o processo C ++ deve continuar a ser executado 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 andei jogando com os recursos para obter o processamento em segundo plano de blocos de script (em ps1.soapyfrog / 2007/01/22 / running-pipelines-in-the-background /)
É provável que este se torne mais amigável nos próximos lançamentos?
Eu percebo que os espaços de operação estão realmente lá 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, criado por você, etc., em um esforço para mitigar erros, mas sim, # 8211; devíamos ter fornecido uma maneira de obter o processo mais recente criado em uma área de trabalho. Ao invés de ter uma única variável $ LASTPROCESS, eu estava pensando que uma matriz de $ processar ao longo das linhas de $ erro seria bom. O processo criado mais recentemente seria mantido em $ process [0].
& gt; como PowerShell é um shell, shouldn & # 8217; t processo / controle de trabalho ser um cidadão de primeira classe.
Pareceria óbvio que não poderia implementar 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.
Envie um pedido no site de conexão do PowerShell para que outras pessoas possam mod-lo. Esta é uma importante fonte de dados no processo de tiragem para o que se passa na próxima versão. Se um número suficiente de pessoas o solicitar, então vai na lista curta para V. Seguinte.
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 em 1.0 exigem que você use WMI, APIs removíveis ou outros mecanismos de controle remoto existentes. O PowerShell 1.0 não possui recursos remotos explícitos. O suporte para remoting é um Pri 0 para a próxima versão.
Bloco de notas $ np = get-process.
é um pouco errado & # 8211; qual processo do bloco de notas deve obter? 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 PowerShell é um shell, shouldn & # 8217; t processo / controle de trabalho ser um cidadão de primeira classe e ser apoiado 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?

fora da web.
Início Como iniciar um processo e aguardar a conclusão? #PowerShell.
Como iniciar um processo e aguardar a conclusão? #PowerShell.
Um dos novos Cmdlets introduzidos com o PowerShell v2 é chamado de Processo inicial. Ele inicia um processo no computador local e, opcionalmente, espera que ele seja completado se você usar o parâmetro do interruptor Cmdlet & # 8217; s Wait. Start-Process é implementado usando o método Start da classe System. Diagnostics. Process do NET Framework.
O primeiro lançamento do Windows PowerShell didn & # 8217; t veio com um Cmdlet como Start-Process. A função abaixo, também é chamado de Processo de Início, aguarda a conclusão do processo por padrão. Além disso, a função aguardará que todos os processos filho do processo sejam concluídos se você usar o parâmetro do parâmetro WaitForChildProcesses. Além disso, a função não vai esperar infinitamente, pois ele suporta um parâmetro Timeout. Por padrão, ele aguardará 600 segundos para que um processo (e processos filho) sejam concluídos. Como Posh v2 & # 8217; s Start-Process, a função usa a classe System. Diagnostics. Process NET Framework.
Então, por que esperar por processos infantis? Se é importante aguardar a conclusão do processo, talvez aguarde os processos infantis para completar os assuntos também. Por exemplo, o instalador da Oracle invoca Java e termina enquanto o Java Runtime ainda está ocupado ao instalar o software.
Além disso, considero um Timeout como obrigatório para evitar uma espera infinita devido a um processo suspenso (ou processo infantil).
BTW, é claro, você também pode usar a função no PowerShell v2. Lembre-se de que a função tem duas vantagens: aguarde processos infantis e tempo limite!
Alexey Matashkin.
Obrigado! Este foi muito útil!
Deixe uma resposta.
Categorias.
Postagens recentes.
Arquivos.
Novembro 2017 (1) outubro 2017 (2) maio de 2017 (1) março 2017 (1) fevereiro 2017 (1) janeiro 2017 (1) dezembro 2016 (1) maio 2016 (2) abril 2016 (1) fevereiro 2016 (2) Outubro de 2015 (3) abril de 2015 (1) janeiro de 2015 (3) dezembro de 2014 (1) outubro de 2014 (1) setembro de 2014 (2) julho de 2014 (1) maio de 2014 (3) abril de 2014 (1) março de 2014 (2) Junho de 2013 (2) maio de 2013 (3) dezembro de 2012 (2) outubro de 2012 (1) julho de 2012 (2) junho de 2012 (3) março de 2012 (3) janeiro de 2012 (1) outubro de 2011 (3) setembro de 2011 (1) Fevereiro de 2010 (2) Junho de 2010 (1) Maio de 2010 (1) Abril de 2010 (1) Fevereiro de 2010 (2) Janeiro de 2010 (2) Dezembro de 2009 (3) Novembro de 2009 (2) Outubro de 2009 (1) Agosto de 2009 (1) Junho de 2009 (2) março de 2009 (1) novembro de 2008 (1) julho de 2008 (2) maio de 2008 (2) abril de 2008 (1) fevereiro de 2008 (1) agosto de 2007 (2) agosto de 2006 (1) fevereiro de 2006 (1) Janeiro de 2006 (3) setembro de 2005 (12)
© 2017 Frank Peter Schultze | Tema desenvolvido por temas Weblizar.

System. diagnostics. process waitforexit powershell
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
Aqui está a minha função de lançamento:
Estou violando o modelo de Threading Powershell? Obrigado!
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
A mensagem de erro está informando o que você está fazendo de errado.
Você não pode atribuir funções a um processo síncrono. As funções não são delegados, então não funcionará. Você precisa usar um modelo de evento ou usar a variação do asynch.
Use isso como um modelo:
Marcado como resposta por Oliver Lipkau Moderador quarta-feira, 12 de outubro de 2011 2:32.
Todas as respostas.
Eu acredito que você tenha alguns erros de digitação em seu código. Eu sou a pessoa mais humilde que você já conheceu.
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
A mensagem de erro está informando o que você está fazendo de errado.
Você não pode atribuir funções a um processo síncrono. As funções não são delegados, então não funcionará. Você precisa usar um modelo de evento ou usar a variação do asynch.
Use isso como um modelo:
Marcado como resposta por Oliver Lipkau Moderador quarta-feira, 12 de outubro de 2011 2:32.
Ok, eu não entendi a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.
Em VB, eu sei como 1) gerar threads para lidar com isso e eu sei que você pode colocar o processo em um loop 2) até que seja concluído como uma maneira de lidar com isso.
Eu não quero fazer # 2. Existe uma maneira multithreaded ou assíncrona para ler a saída de um determinado processo como o processo está gerando?
Ok, eu não entendi a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.
Em VB, eu sei como 1) gerar threads para lidar com isso e eu sei que você pode colocar o processo em um loop 2) até que seja concluído como uma maneira de lidar com isso.
Eu não quero fazer # 2. Existe uma maneira multithreaded ou assíncrona para ler a saída de um determinado processo como o processo está gerando?
Na verdade, a menos que você queira criar um evento delegado. Mas, então, isso é o PowerShell, não é o VB.
Você pode começar aqui e ver se o evento que você está procurando pode ser "conectado"
Ajude Register-ObjectEvent - full.
Editado por jrv terça-feira, 27 de setembro de 2011 15:22.
A resposta marcada não resolve o problema com o qual o OP está lutando - isto é, redirecionando StdErr e StdOut e sofre com o bug de conflito discutido aqui:
Uma condição de impasse pode resultar se o processo pai chamar p. WaitForExit antes de p. StandardOutput. ReadToEnd e o processo filho grava texto suficiente para preencher o fluxo redirecionado. O processo pai esperaria indefinidamente para que o processo filho saísse. O processo infantil esperaria indefinidamente para o pai ler do fluxo de StandardOutput completo. & Quot;
Eu também estou tentando a melhor resposta para fazer isso funcionar no Powershell, mas todos os exemplos de código que estou executando, que utilizam System. Diagnostics. Process em powersehll são replicando o impasse nesta implementação ou não estão redirecionando stderr e stdout.
A solução em que estou indo usa o cmdlet Start-Process da seguinte maneira:
Não é uma ótima solução, pois só redirecionará stdout e stderr para um arquivo de texto. mas funcionará o tempo todo e redirecionará stdout e stderr.
Se nós vamos usar a saída redirecionada, não usaremos a espera. Esse foi o design do CreateProcess desde NT4.
O uso de arquivos para capturar a saída funcionará porque um fluxo é anexado que publica uma leitura constante para o fluxo de saída. O fluxo de saída nunca é suspenso. Yu não pode fazer isso em um loop de código. O fluxo corre o sistema do sistema do pecado Eu acredito e sempre terei uma chance de ler. A espera está no seu segmento para que você não consiga ler manualmente. É um impasse como afirmado.
O uso da leitura do console é geralmente porque estamos à procura de um prompt. Nesse caso, nunca esperamos a conclusão. O código ZTHe provavelmente será enviado para 'quit' e nós iremos verificar o processo e girá-lo até que ele seja desligado.
A questão aqui é que não podemos gerar um Thead. Em VB ou C #, C, usaríamos apenas threads de separação para IO e um para espera. Melhor ainda, eu usaria um semáforo, pois pode dinamicamente capturar um desligamento inesperado.
Talvez a próxima versão do PowerSHell tenha boas possibilidades de multithreading.
Esta é apenas mais uma lição de que a Powershell é uma linguagem de script, não uma linguagem de programação, e tão poderosa quanto é, existem armadilhas.
O código de exemplo da Microsoft simplesmente não é abrangente o suficiente para um hack de powershell perceber que não podem chegar lá a partir daqui. Foi o que me atrapalhou e também acredito no OP, porque havia alguma expectativa de que BeginOutputReadline implementasse a magia para que ele funcionasse threads que resolveriam o problema de bloqueio. Não, então acabamos aqui.
E uma pequena correção para o meu código - deixei o sinalizador - que é necessário para o resto do código funcionar:
Esta é apenas mais uma lição de que a Powershell é uma linguagem de script, não uma linguagem de programação, e tão poderosa quanto é, existem armadilhas.
O código de exemplo da Microsoft simplesmente não é abrangente o suficiente para um hack de powershell perceber que não podem chegar lá a partir daqui. Foi o que me atrapalhou e também acredito no OP, porque havia alguma expectativa de que BeginOutputReadline implementasse a magia para que ele funcionasse threads que resolveriam o problema de bloqueio. Não, então acabamos aqui.
E uma pequena correção para o meu código - deixei o sinalizador - que é necessário para o resto do código funcionar:
Certo. O PowerShell é propositadamente limitado para torná-lo mais seguro para a população em geral e para reduzir os problemas que ocorrem com as linguagens compiladas.
Sim - o sinalizador de espera ajudaria, pois o arquivo pode não ter terminado o spool antes do programa encerrar.
Start-Process é um wrapper fraco na API do processo, mas protege os desavisados ​​dos deadlocks porque você não pode redirecionar a entrada, exceto de um arquivo.
Você não precisa - venha para redirecionar. Você precisa de aguardar os arquivos e como uma maneira fácil de detecção de terminação. Usando a API, isso tem que ser feito consultando o objeto de processo ou extraindo a saída e aguardando que o processo envie sua mensagem de término e então gire o status.
Isso é muito demais para os scripts de administração e, como você apontou, não os levará a nenhum problema.
Olá, tenho feito muita leitura e tropeçando com esse tópico, percebi que tenho um problema semelhante. Estou tendo dificuldade em obter meus feeds de saída e meus erros para ler na janela do meu console ISE. Mesmo depois de ler tudo o que foi escrito acima e olhar para o local de ajuda do MSDN, ainda não consigo ver o erro em meus caminhos. Eu entendo que você não pode ler de forma assíncrona e síncrona ao mesmo tempo e que, se você chamar um antes do outro, eles ficarão impassíveis, mas ainda não consigo ver onde meu erro é porque eu não obtenho nenhum resultado. Meu código está abaixo. Se algum de vocês sabe de grandes recursos na aprendizagem do PowerShell, por favor me avise, eu poderia usar para aprender um pouco mais.
Apenas um estudante de tecnologia, é tudo!
Desculpe, mas este tópico foi fechado por 5 anos. Você precisa iniciar seu próprio tópico.
Olá, tenho feito muita leitura e tropeçando com esse tópico, percebi que tenho um problema semelhante. Estou tendo dificuldade em obter meus feeds de saída e meus erros para ler na janela do meu console ISE. Mesmo depois de ler tudo o que foi escrito acima e olhar para o local de ajuda do MSDN, ainda não consigo ver o erro em meus caminhos. Eu entendo que você não pode ler de forma assíncrona e síncrona ao mesmo tempo e que, se você chamar um antes do outro, eles ficarão impassíveis, mas ainda não consigo ver onde meu erro é porque eu não obtenho nenhum resultado. Meu código está abaixo. Se algum de vocês sabe de grandes recursos na aprendizagem do PowerShell, por favor me avise, eu poderia usar para aprender um pouco mais.
Apenas um estudante de tecnologia, é tudo!
Oi, você encontrou a solução? Eu tenho o mesmo problema :(
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.

No comments:

Post a Comment