Start-process powershell 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.
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 2017 (1) março 2017 (1) fevereiro 2017 (1) janeiro 2017 (1) dezembro 2018 (1) maio 2018 (2) abril 2018 (1) fevereiro 2018 (2) Outubro de 2018 (3) abril 2018 (1) janeiro 2018 (3) dezembro 2017 (1) outubro 2017 (1) setembro 2017 (2) julho 2017 (1) maio 2017 (3) abril 2017 (1) março 2017 (2) Junho 2018 (2) maio 2018 (3) dezembro 2018 (2) outubro 2018 (1) julho 2018 (2) junho 2018 (3) março 2018 (3) janeiro 2018 (1) outubro 2018 (3) setembro 2018 (1) Fevereiro 2018 (2) junho 2018 (1) maio 2018 (1) abril 2018 (1) fevereiro 2018 (2) janeiro de 2018 (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.
Start-process powershell waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como dizer ao PowerShell que aguarde até que cada comando termine antes de iniciar o próximo?
Eu tenho um script do PowerShell 1.0 para abrir um monte de aplicativos. A primeira é uma máquina virtual e as outras são aplicações de desenvolvimento. Quero que a máquina virtual termine a inicialização antes que o resto dos aplicativos sejam abertos.
Em bash, eu poderia simplesmente dizer "cmd1 & amp; amp; cmd2"
Isto é o que eu tenho.
Normalmente, para comandos internos, o PowerShell aguarda antes de iniciar o próximo comando. Uma exceção a esta regra é o EXE baseado no subsistema Windows externo. O primeiro truque é o pipeline para Out-Null, assim:
O PowerShell aguardará até que o processo Notepad. exe tenha sido encerrado antes de continuar. Isso é habilidoso, mas um pouco sutil de retirar da leitura do código. Você também pode usar Start-Process com o parâmetro - Wait:
Se você estiver usando a versão PowerShell Community Extensions, é:
Outra opção no PowerShell 2.0 é usar um trabalho em segundo plano:
Além de usar o Start-Process-Wait, a saída de um executável será executada pela Powershell. Dependendo da necessidade, tipicamente eu toco para Out-Null, Out-Default, Out-String ou Out-String - Stream. Aqui está uma longa lista de algumas outras opções de saída.
Sinto falta das operadoras de estilo CMD / Bash que você referenciou (& amp ;, & amp; & amp ;, ||). Parece que temos que ser mais detalhados com Powershell.
Basta usar "Wait-process":
Se você usar Start-Process & lt; path to exe & gt; - NãoNewWindow - Espere.
Você também pode usar a opção - PassThru para ecoar a saída.
Alguns programas não podem processar o fluxo de saída muito bem, usando o pipe para Out-Null pode não bloqueá-lo.
E Start-Process precisa da opção - ArgumentList para passar argumentos, não é tão conveniente.
Há também outra abordagem.
Incluindo a opção - NoNewWindow me dá um erro: Start-Process: Este comando não pode ser executado devido ao erro: o acesso é negado.
Como usar Process. Start no Visual Basic.
Quando você precisa iniciar outro aplicativo usando o código VB.
O método Start do objeto Process é possivelmente uma das ferramentas mais subapreciadas disponíveis para um programador. Como um método, o Start tem uma série de sobrecargas, que são diferentes conjuntos de parâmetros que determinam exatamente o que o método faz. As sobrecargas permitem especificar qualquer conjunto de parâmetros que você possa querer passar para outro processo quando ele for iniciado.
O que você pode fazer com Process. Start é realmente limitado apenas pelos processos que você pode usar com ele.
Se você quiser exibir seu arquivo ReadMe baseado em texto no Bloco de notas, é tão fácil quanto:
Isso pressupõe que o arquivo ReadMe está na mesma pasta que o programa e que o Notepad é o aplicativo padrão para tipos de arquivos. txt e ele está no caminho do ambiente do sistema.
Process. Start semelhante ao Shell Command no VB6.
Para programadores familiarizados com o Visual Basic 6, Process. Start é um pouco como o comando VB 6 Shell. Na VB 6, você usaria algo como:
Usando Process. Start.
Você pode usar esse código para iniciar o Bloco de notas maximizado e criar um objeto ProcessStartInfo que você pode usar para um controle mais preciso:
Iniciando um processo oculto.
Você pode até começar um processo oculto.
Mas tenha cuidado. A menos que você adicione mais código para finalizar o processo, provavelmente você terá que terminá-lo no Gerenciador de Tarefas. Os processos ocultos normalmente são usados apenas com processos que não possuem qualquer tipo de interface de usuário.
Recuperando o Nome de um Processo.
Trabalhando com Process. Start como um objeto oferece muita capacidade. Por exemplo, você pode recuperar o nome do processo que foi iniciado. Este código exibirá & # 34; notepad & # 34; na janela de saída:
Isso foi algo que você não poderia fazer com o comando VB6 Shell porque lançou o novo aplicativo de forma assíncrona. O uso de WaitForExit pode causar o problema inverso porque você deve iniciar um processo em um novo tópico se precisar dele para executar de forma assíncrona. Por exemplo, se você precisa que os componentes permaneçam ativos em um formulário onde um processo foi iniciado e WaitForExit foi executado. Normalmente, esses componentes não foram ativos. Codifique-o e veja por si mesmo.
Uma maneira de forçar o processo a parar é usar o método Kill.
Este código aguarda dez segundos e depois termina o processo.
Descobri que um atraso forçado era necessário para permitir que o processo terminasse de sair para evitar um erro.
Na maioria dos casos, provavelmente é uma boa idéia colocar seu processamento em um bloco Usando para garantir que os recursos usados pelo processo sejam lançados.
Para tornar tudo isso ainda mais fácil de trabalhar, há mesmo um componente do Processo que você pode adicionar ao seu projeto para que você possa fazer muitas das coisas mostradas acima em tempo de design em vez de tempo de execução.
Uma das coisas que isso torna muito mais fácil é codificar os eventos criados pelo processo, como o evento quando o processo foi encerrado. Você também pode adicionar um manipulador usando um código como este:
Mas simplesmente selecionar o evento para o componente é muito mais fácil.
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;
Re: Diagnostics. Process] :: Start ($ StartInfo).WaitForExit.
O Vista Forums é um site independente e não foi autorizado,
patrocinado ou aprovado pela Microsoft Corporation.
"Windows Vista", o Start Orb e materiais relacionados são marcas comerciais da Microsoft Corp.
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como dizer ao PowerShell que aguarde até que cada comando termine antes de iniciar o próximo?
Eu tenho um script do PowerShell 1.0 para abrir um monte de aplicativos. A primeira é uma máquina virtual e as outras são aplicações de desenvolvimento. Quero que a máquina virtual termine a inicialização antes que o resto dos aplicativos sejam abertos.
Em bash, eu poderia simplesmente dizer "cmd1 & amp; amp; cmd2"
Isto é o que eu tenho.
Normalmente, para comandos internos, o PowerShell aguarda antes de iniciar o próximo comando. Uma exceção a esta regra é o EXE baseado no subsistema Windows externo. O primeiro truque é o pipeline para Out-Null, assim:
O PowerShell aguardará até que o processo Notepad. exe tenha sido encerrado antes de continuar. Isso é habilidoso, mas um pouco sutil de retirar da leitura do código. Você também pode usar Start-Process com o parâmetro - Wait:
Se você estiver usando a versão PowerShell Community Extensions, é:
Outra opção no PowerShell 2.0 é usar um trabalho em segundo plano:
Além de usar o Start-Process-Wait, a saída de um executável será executada pela Powershell. Dependendo da necessidade, tipicamente eu toco para Out-Null, Out-Default, Out-String ou Out-String - Stream. Aqui está uma longa lista de algumas outras opções de saída.
Sinto falta das operadoras de estilo CMD / Bash que você referenciou (& amp ;, & amp; & amp ;, ||). Parece que temos que ser mais detalhados com Powershell.
Basta usar "Wait-process":
Se você usar Start-Process & lt; path to exe & gt; - NãoNewWindow - Espere.
Você também pode usar a opção - PassThru para ecoar a saída.
Alguns programas não podem processar o fluxo de saída muito bem, usando o pipe para Out-Null pode não bloqueá-lo.
E Start-Process precisa da opção - ArgumentList para passar argumentos, não é tão conveniente.
Há também outra abordagem.
Incluindo a opção - NoNewWindow me dá um erro: Start-Process: Este comando não pode ser executado devido ao erro: o acesso é negado.
Como usar Process. Start no Visual Basic.
Quando você precisa iniciar outro aplicativo usando o código VB.
O método Start do objeto Process é possivelmente uma das ferramentas mais subapreciadas disponíveis para um programador. Como um método, o Start tem uma série de sobrecargas, que são diferentes conjuntos de parâmetros que determinam exatamente o que o método faz. As sobrecargas permitem especificar qualquer conjunto de parâmetros que você possa querer passar para outro processo quando ele for iniciado.
O que você pode fazer com Process. Start é realmente limitado apenas pelos processos que você pode usar com ele.
Se você quiser exibir seu arquivo ReadMe baseado em texto no Bloco de notas, é tão fácil quanto:
Isso pressupõe que o arquivo ReadMe está na mesma pasta que o programa e que o Notepad é o aplicativo padrão para tipos de arquivos. txt e ele está no caminho do ambiente do sistema.
Process. Start semelhante ao Shell Command no VB6.
Para programadores familiarizados com o Visual Basic 6, Process. Start é um pouco como o comando VB 6 Shell. Na VB 6, você usaria algo como:
Usando Process. Start.
Você pode usar esse código para iniciar o Bloco de notas maximizado e criar um objeto ProcessStartInfo que você pode usar para um controle mais preciso:
Iniciando um processo oculto.
Você pode até começar um processo oculto.
Mas tenha cuidado. A menos que você adicione mais código para finalizar o processo, provavelmente você terá que terminá-lo no Gerenciador de Tarefas. Os processos ocultos normalmente são usados apenas com processos que não possuem qualquer tipo de interface de usuário.
Recuperando o Nome de um Processo.
Trabalhando com Process. Start como um objeto oferece muita capacidade. Por exemplo, você pode recuperar o nome do processo que foi iniciado. Este código exibirá & # 34; notepad & # 34; na janela de saída:
Isso foi algo que você não poderia fazer com o comando VB6 Shell porque lançou o novo aplicativo de forma assíncrona. O uso de WaitForExit pode causar o problema inverso porque você deve iniciar um processo em um novo tópico se precisar dele para executar de forma assíncrona. Por exemplo, se você precisa que os componentes permaneçam ativos em um formulário onde um processo foi iniciado e WaitForExit foi executado. Normalmente, esses componentes não foram ativos. Codifique-o e veja por si mesmo.
Uma maneira de forçar o processo a parar é usar o método Kill.
Este código aguarda dez segundos e depois termina o processo.
Descobri que um atraso forçado era necessário para permitir que o processo terminasse de sair para evitar um erro.
Na maioria dos casos, provavelmente é uma boa idéia colocar seu processamento em um bloco Usando para garantir que os recursos usados pelo processo sejam lançados.
Para tornar tudo isso ainda mais fácil de trabalhar, há mesmo um componente do Processo que você pode adicionar ao seu projeto para que você possa fazer muitas das coisas mostradas acima em tempo de design em vez de tempo de execução.
Uma das coisas que isso torna muito mais fácil é codificar os eventos criados pelo processo, como o evento quando o processo foi encerrado. Você também pode adicionar um manipulador usando um código como este:
Mas simplesmente selecionar o evento para o componente é muito mais fácil.
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;
Re: Diagnostics. Process] :: Start ($ StartInfo).WaitForExit.
O Vista Forums é um site independente e não foi autorizado,
patrocinado ou aprovado pela Microsoft Corporation.
"Windows Vista", o Start Orb e materiais relacionados são marcas comerciais da Microsoft Corp.
No comments:
Post a Comment