вторник, 5 июня 2018 г.

O processo de diagnóstico do sistema powershell inicia esperaforexit


O processo de diagnóstico do sistema Powershell inicia waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como executar o script do PowerShell usando System. Diagnostics. Process. Start in c #?
Eu estou escrevendo isso:
Tudo isso faz é abrir o script no Windows PowerShell ISE. Mas eu também quero que FUNCIONE! Então, quais outros argumentos eu tenho que passar para que ele seja executado?
Você não deseja executar powershell_ise. exe, mas powershell. exe. A partir de um prompt de comando DOS, você pode apenas prefixar seu comando ou script com powershell, mas para um processo, você vai querer usar algo como.
(isso é meu no Win 8.1), o seu deve estar em algum lugar perto, se você estiver em uma versão diferente.
Os caras chocolatey jogam nesses interruptores.
Ao executar powershell a partir do prompt de comando, talvez seja necessário fazer isso também dependendo de como sua política de execução está definida.
Você poderia chamar assim:
e certifique-se de que todas as suas configurações do Windows estejam corretas, então um duplo clique no arquivo irá executá-lo.

O processo de diagnóstico do sistema Powershell inicia waitforexit
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.

O processo de diagnóstico do sistema Powershell inicia waitforexit
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.

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.

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

O processo de diagnóstico do sistema Powershell inicia waitforexit
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.

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

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