пятница, 20 апреля 2018 г.

O processo de diagnóstico do sistema powershell inicia esperaforexit


Diagnostics. Process] :: Start ($ StartInfo).WaitForExit.
Diagnostics. Process] :: Start ($ StartInfo).WaitForExit.
Usando um script Vista Home x64 powershell. Deseja iniciar um programa em um loop e aguardar a saída, tem muitos parâmetros, com argumentos de comprimento variável.
hlds. exe - console - insecure - game svencoop4 - port 27025 - noipx - num_edicts 4096 + log on + maxplayers 12 + map osprey.
. \ hlds. exe - console - insecure - game svencoop4 - port 27025 - noipx - num_edicts 4096 + log in + maxplayers 12 + mapa osprey | fora-nulo.
$ StartInfo. Arguments = & quot; - console + map c1a1 - game svencoop4 & quot;
OS vista home Premium x64 / sp2.
CPU e processador 9150e quad core 1.8gz.
Placa-mãe acpi x64.
Placa gráfica nvidia geforce 6150se nforce 430.
Cartão de som realtek high def audio.
Resolução da tela 1440x900.
Discos rígidos st350062 oas scsi.
Internet Speed ​​nvidia nforce 10/100 mbps ethernet, sem fio 802.11 b / g.
Re: Diagnostics. Process] :: Start ($ StartInfo).WaitForExit.
Tenho um problema com o Vista Home Premium (surpresa!) Tenho uma conexão com uma rede sem fio doméstica, que funciona: 2 computadores que executam o XP podem.
A classe acima, o método de início deve ser incluído com "exe", "lote" . ou pode ser encerrado com "powershelll cmd" Eg # pode ser executado externamente.
Olá a todos. Eu quero executar um comando contra um monte de nós IP (servidores, roteadores) em PARALELO (não um após o outro). Demonstra o meu caso.
Estou tentando descobrir como iniciar um processo com parâmetros. Por exemplo, eu posso fazer :: Start (& quotlook outlook & quot;) e o Outlook lança. Eu gostaria.
Alguém sabe por que usar System. Diagnostics. Process para "wrap & quot; um aplicativo de console nem sempre transmite as E / S, dependendo de quais processos.
Quero poder controlar o aplicativo que foi iniciado usando este método. Todas as ideias sobre como configurar um ProcessStartInfo para o qual posso passar.
Eu uso :: Start (& quot ;. & quot;) muito, pois pode fazer tudo o Start | O diálogo Run faz. Combinado com a expansão variável do PowerShell, também pode ser.

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.
Ao tentar 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 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 isso funciona. Mas eu usei Wait-Process em vez de confiar em um efeito colateral de recuperar o process handle.

Exemplo de uso.
Resolvi assim:
Eu redirecionava a entrada, a saída e o erro e administrai a leitura dos fluxos de saída e erro. Esta solução funciona para o SDK 7- 8.1, tanto para o Windows 7 como para o Windows 8.
Eu tentei fazer uma aula que resolva seu problema usando a leitura de fluxo assíncrono, levando em conta Mark Byers, Rob, Stevejay responde. Ao fazê-lo, percebi que existe um erro relacionado à leitura assíncrona do fluxo de saída do processo.
Você não pode fazer isso:
Você receberá System. InvalidOperationException: StandardOut não foi redirecionado ou o processo ainda não começou.
Então, você deve iniciar a saída assíncrona lida 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 configurá-lo como assíncrono:
Então algumas pessoas podem dizer que você só precisa ler o fluxo antes de configurá-lo como assíncrono. Mas o mesmo problema ocorre. Haverá uma condição de corrida entre a leitura síncrona e configurará o fluxo em modo assíncrono.
Não há como conseguir uma leitura assíncrona segura de um fluxo de saída de um processo na forma real "Processo" e "ProcessStartInfo" foi projetado.
Você provavelmente está melhor usando a leitura assíncrona, como sugerido por outros usuários para o seu caso. Mas você deve estar ciente de que você pode perder algumas informações 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 descarta. (Eu tentei as "soluções" das outras respostas).
Então eu decidi sugerir outra solução:
Este código é depurado e funciona perfeitamente.
Eu acho que isso é uma abordagem simples e melhor (não precisamos do AutoResetEvent):
Eu estava tendo o mesmo problema, mas a razão era diferente. No entanto, isso aconteceria no Windows 8, mas não no Windows 7. A seguinte linha parece ter causado o problema.
A solução era NÃO desativar UseShellExecute. Agora recebi uma janela popup do Shell, que é indesejável, mas muito melhor do que o programa esperando que nada de particular aconteça. Então eu adicionei o seguinte trabalho para isso:
Agora, o único problema que me incomoda é o porquê isso está acontecendo no Windows 8, em primeiro lugar.
Introdução.
A resposta atualmente aceita não funciona (lança exceção) e há muitas soluções alternativas, mas nenhum código completo. Isso é, 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 um código completo baseado em como eu quero usar o método Process. Start.
Eu usei-o para criar um diálogo de progresso em torno dos comandos git. É assim que eu usei isso:
Em teoria, você também pode combinar stdout e stderr, mas não testei isso.
Eu sei que isso é velho, mas, depois de ler toda essa página, nenhuma das soluções estava funcionando para mim, embora eu não tentei Muhammad Rehan porque o código era 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, acho que é algo a ver com a duração da saída antes de uma marca EOF.
De qualquer forma, a solução que funcionou para mim era 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!
As outras soluções (incluindo o EM0) ainda estão bloqueadas para o meu aplicativo, devido a tempos de espera internos e ao uso de StandardOutput e StandardError pela aplicação gerada. Aqui está o que funcionou para mim:
Editar: inicialização adicionada de StartInfo para codificar a amostra.
Este post talvez esteja desactualizado, mas descobri a principal causa por que normalmente ele trava é devido ao excesso de pilha para o redirectStandardoutput ou se você tem redirectStandarderror.
Como os dados de saída ou os dados de erro são grandes, isso causará um tempo de espera, pois ele ainda está processando por tempo indefinido.

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 de assíncrono.
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 de assíncrono.
Use isso como um modelo:
Marcado como resposta por Oliver Lipkau Moderador quarta-feira, 12 de outubro de 2011 2:32.
Ok, eu entendi mal a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.
Na VB, eu sei como 1) gerar segmentos para lidar com isso e sei que você pode colocar o processo em um 2) loop até terminar como uma maneira de lidar com isso.
Eu não quero fazer # 2. Existe uma maneira multithread ou uma maneira assíncrona de ler a saída de um determinado processo à medida que o processo o está gerando?
Ok, eu entendi mal a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.
Na VB, eu sei como 1) gerar segmentos para lidar com isso e sei que você pode colocar o processo em um 2) loop até terminar como uma maneira de lidar com isso.
Eu não quero fazer # 2. Existe uma maneira multithread ou uma maneira assíncrona de ler a saída de um determinado processo à medida que o processo o 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 aborda o problema com o qual o OP está lutando - ou seja, redirecionar StdErr e StdOut e sofre com o erro de deadlock 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 aguardaria indefinidamente o processo filho para sair. 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 esperaríamos a conclusão. O código ZTHe provavelmente será enviado um 'sair' e nós verificaremos o processo e giraremos até ele ter encerrado.
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 é propositalmente limitado para torná-lo mais seguro para a população em geral e para preentender os problemas que ocorrem com os idiomas compilados.
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 deve ser feito através da pesquisa do objeto do processo ou pela saída e aguardando o processo para enviar sua mensagem de terminação e girando no 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 receber meus feeds de Saída e meus erros para ler da minha janela do 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 receber meus feeds de Saída e meus erros para ler da minha janela do 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.

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

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