Comece processo waitforexit powershell
Iniciar processo 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.
Iniciar processo waitforexit powershell
Obter através da App Store Leia esta publicação em nosso aplicativo!
Capturando o padrão e o erro com o Start-Process.
Existe um erro no comando Start-Process do Powershell ao acessar as propriedades StandardError e StandardOutput?
Se eu executar o seguinte, não recebo saída.
Mas se eu redirecionar a saída para um arquivo, recebo o resultado esperado.
Foi assim que o Start-Process foi projetado por algum motivo. Aqui está uma maneira de obtê-lo sem enviar ao arquivo:
no código dado na pergunta, acho que a leitura da propriedade ExitCode da variável de iniciação deve funcionar.
Observe que (como no seu exemplo) você precisa adicionar os parâmetros "PassThru e - guardar" (isso me surpreendeu por um tempo)
Eu também tive esse problema e acabei usando o código Andys para criar uma função para limpar as coisas quando vários comandos precisam ser executados, ele retornará os códigos stderr, stdout e exit como objetos. Uma coisa a notar que a função não aceita. \ No caminho, os caminhos completos devem ser usados.
aqui é como usá-lo.
Eu realmente tive problemas com os exemplos acima de Andy Arismendi e LPG. Você sempre deve usar:
O exemplo completo é:
Nós usamos a função conforme previsto acima pelo GLP. No entanto, isso contém um erro que você pode encontrar quando você inicia um processo que gera muito resultado. Devido a isso, você pode acabar com um impasse ao usar esta função. Em vez disso use a versão adaptada abaixo:
Mais informações sobre este problema podem ser encontradas no MSDN:
Uma condição de impasse pode resultar se o processo pai chama p. WaitForExit antes de p. StandardError. 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 filho esperaria indefinidamente para o pai ler do fluxo completo do StandardError.
EDITAR: adicionou uma braçadeira curvada faltante no final do bloco Try.
Iniciar processo waitforexit powershell
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como capturar a saída do processo de forma assíncrona no powershell?
Eu quero capturar stdout e stderr de um processo que eu começo em um script Powershell e exibi-lo de forma assíncrona para o console. Eu encontrei alguma documentação ao fazer isso através do MSDN e outros blogs.
Depois de criar e executar o exemplo abaixo, não consigo obter qualquer saída para ser exibida de forma assíncrona. Toda a saída é exibida apenas quando o processo termina.
Neste exemplo, esperava ver o resultado de "oi" na linha de comando antes do final da execução do programa porque o evento OutputDataReceived deveria ter sido acionado.
Eu tentei isso usando outros executáveis - java. exe, git. exe, etc. Todos eles têm o mesmo efeito, então me deixo pensar que há algo simples que não estou entendendo ou que perdi. O que mais precisa ser feito para ler o stdout de forma assíncrona?
Infelizmente, a leitura assíncrona não é tão fácil se você deseja fazê-lo corretamente. Se você chamar WaitForExit () sem tempo limite, você poderia usar algo como essa função que escrevi (com base no código C #):
Ele captura stdout, stderr e código de saída. Exemplo de uso:
Para mais informações e implementações alternativas (em C #), leia esta postagem no blog.
Com base na resposta de Alexander Obersht, criei uma função que usa tempo limite e tarefas Tarefas assíncronas em vez de manipuladores de eventos. De acordo com Mike Adelson.
Infelizmente, esse método (manipuladores de eventos) não fornece nenhuma maneira de saber quando o último bit de dados foi recebido. Porque tudo é assíncrono, é possível (e eu observei isso) para que os eventos disparem depois que WaitForExit () retornou.
Não consegui que nenhum desses exemplos funcionasse com o PS 4.0.
Eu queria executar uma aplicação de fantoche a partir de um pacote Octopus Deploy (via Deploy. ps1) e ver a saída em "tempo real" ao invés de aguardar o término do processo (uma hora depois), então eu criei o seguinte:
Os exemplos aqui são úteis, mas não se adequaram completamente ao meu caso de uso. Eu não queria invocar o comando e sair. Eu queria abrir um prompt de comando, enviar entrada, ler a saída e repetir. Aqui está a minha solução para isso.
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.
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.
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 DSC Resource Kit Release dezembro de 2017 20 de dezembro de 2017.
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?
Iniciar processo waitforexit powershell
Ei, eu estou tentando usar o processo de início para chamar um aplicativo de console e redirecionar a saída para a janela do powershell. Isso é possível? Eu entendo que posso redirecioná-lo para um arquivo usando:
Eu sei que eu posso ler o arquivo e exibir o conteúdo no shell. Essa abordagem parece um hack. Estou tentando ver se há uma abordagem mais direta.
Eu também não estou casado com o uso do start-process se houver uma opção melhor.
Todas as respostas.
aqui é outro caminho.
O Almirante Ackbar diz.
Proposto como resposta por NimanthaW sexta-feira, 27 de junho de 2014 às 4:55 da manhã.
Basta verificar se as sugestões foram úteis. Por favor, deixe-nos saber se você gostaria de mais assistência.
Se você é usuário da Subscrição TechNet e tem algum feedback sobre a nossa qualidade de suporte, envie seus comentários aqui.
Suporte da Comunidade TechNet.
Você sempre pode obter a saída de um aplicativo de console atribuindo uma variável a ele:
PS C: \ Users \ me & gt; $ pingresult = ping myserver.
PS C: \ Users \ me & gt; $ pingresult.
Pinging myserver. mydom. local [10.101.0.103] com 32 bytes de dados:
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Estatísticas de ping para 10.101.0.103:
Pacotes: Enviado = 4, Recebido = 4, Perdido = 0 (perda de 0%),
Tempos de ida e volta aproximados em milissegundos:
Mínimo = 0ms, Máximo = 0ms, Média = 0ms.
--Espero que ajude!
Proposta como resposta por StrayMuse segunda-feira, 19 de novembro de 2012 17:19.
Infelizmente, essa estratégia pode causar confusão, pois os dois executáveis (PowerShell e o aplicativo de console) competiriam pelo controle do teclado e da janela. Isso pode ser menos um problema se o aplicativo de console estiver fazendo apenas saída, mas.
Al Dunbar - lembre-se de "marcar ou propor como resposta" ou "votar como útil", conforme apropriado.
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.
Obter através da App Store Leia esta publicação em nosso aplicativo!
Capturando o padrão e o erro com o Start-Process.
Existe um erro no comando Start-Process do Powershell ao acessar as propriedades StandardError e StandardOutput?
Se eu executar o seguinte, não recebo saída.
Mas se eu redirecionar a saída para um arquivo, recebo o resultado esperado.
Foi assim que o Start-Process foi projetado por algum motivo. Aqui está uma maneira de obtê-lo sem enviar ao arquivo:
no código dado na pergunta, acho que a leitura da propriedade ExitCode da variável de iniciação deve funcionar.
Observe que (como no seu exemplo) você precisa adicionar os parâmetros "PassThru e - guardar" (isso me surpreendeu por um tempo)
Eu também tive esse problema e acabei usando o código Andys para criar uma função para limpar as coisas quando vários comandos precisam ser executados, ele retornará os códigos stderr, stdout e exit como objetos. Uma coisa a notar que a função não aceita. \ No caminho, os caminhos completos devem ser usados.
aqui é como usá-lo.
Eu realmente tive problemas com os exemplos acima de Andy Arismendi e LPG. Você sempre deve usar:
O exemplo completo é:
Nós usamos a função conforme previsto acima pelo GLP. No entanto, isso contém um erro que você pode encontrar quando você inicia um processo que gera muito resultado. Devido a isso, você pode acabar com um impasse ao usar esta função. Em vez disso use a versão adaptada abaixo:
Mais informações sobre este problema podem ser encontradas no MSDN:
Uma condição de impasse pode resultar se o processo pai chama p. WaitForExit antes de p. StandardError. 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 filho esperaria indefinidamente para o pai ler do fluxo completo do StandardError.
EDITAR: adicionou uma braçadeira curvada faltante no final do bloco Try.
Iniciar processo waitforexit powershell
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como capturar a saída do processo de forma assíncrona no powershell?
Eu quero capturar stdout e stderr de um processo que eu começo em um script Powershell e exibi-lo de forma assíncrona para o console. Eu encontrei alguma documentação ao fazer isso através do MSDN e outros blogs.
Depois de criar e executar o exemplo abaixo, não consigo obter qualquer saída para ser exibida de forma assíncrona. Toda a saída é exibida apenas quando o processo termina.
Neste exemplo, esperava ver o resultado de "oi" na linha de comando antes do final da execução do programa porque o evento OutputDataReceived deveria ter sido acionado.
Eu tentei isso usando outros executáveis - java. exe, git. exe, etc. Todos eles têm o mesmo efeito, então me deixo pensar que há algo simples que não estou entendendo ou que perdi. O que mais precisa ser feito para ler o stdout de forma assíncrona?
Infelizmente, a leitura assíncrona não é tão fácil se você deseja fazê-lo corretamente. Se você chamar WaitForExit () sem tempo limite, você poderia usar algo como essa função que escrevi (com base no código C #):
Ele captura stdout, stderr e código de saída. Exemplo de uso:
Para mais informações e implementações alternativas (em C #), leia esta postagem no blog.
Com base na resposta de Alexander Obersht, criei uma função que usa tempo limite e tarefas Tarefas assíncronas em vez de manipuladores de eventos. De acordo com Mike Adelson.
Infelizmente, esse método (manipuladores de eventos) não fornece nenhuma maneira de saber quando o último bit de dados foi recebido. Porque tudo é assíncrono, é possível (e eu observei isso) para que os eventos disparem depois que WaitForExit () retornou.
Não consegui que nenhum desses exemplos funcionasse com o PS 4.0.
Eu queria executar uma aplicação de fantoche a partir de um pacote Octopus Deploy (via Deploy. ps1) e ver a saída em "tempo real" ao invés de aguardar o término do processo (uma hora depois), então eu criei o seguinte:
Os exemplos aqui são úteis, mas não se adequaram completamente ao meu caso de uso. Eu não queria invocar o comando e sair. Eu queria abrir um prompt de comando, enviar entrada, ler a saída e repetir. Aqui está a minha solução para isso.
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.
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.
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 DSC Resource Kit Release dezembro de 2017 20 de dezembro de 2017.
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?
Iniciar processo waitforexit powershell
Ei, eu estou tentando usar o processo de início para chamar um aplicativo de console e redirecionar a saída para a janela do powershell. Isso é possível? Eu entendo que posso redirecioná-lo para um arquivo usando:
Eu sei que eu posso ler o arquivo e exibir o conteúdo no shell. Essa abordagem parece um hack. Estou tentando ver se há uma abordagem mais direta.
Eu também não estou casado com o uso do start-process se houver uma opção melhor.
Todas as respostas.
aqui é outro caminho.
O Almirante Ackbar diz.
Proposto como resposta por NimanthaW sexta-feira, 27 de junho de 2014 às 4:55 da manhã.
Basta verificar se as sugestões foram úteis. Por favor, deixe-nos saber se você gostaria de mais assistência.
Se você é usuário da Subscrição TechNet e tem algum feedback sobre a nossa qualidade de suporte, envie seus comentários aqui.
Suporte da Comunidade TechNet.
Você sempre pode obter a saída de um aplicativo de console atribuindo uma variável a ele:
PS C: \ Users \ me & gt; $ pingresult = ping myserver.
PS C: \ Users \ me & gt; $ pingresult.
Pinging myserver. mydom. local [10.101.0.103] com 32 bytes de dados:
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Estatísticas de ping para 10.101.0.103:
Pacotes: Enviado = 4, Recebido = 4, Perdido = 0 (perda de 0%),
Tempos de ida e volta aproximados em milissegundos:
Mínimo = 0ms, Máximo = 0ms, Média = 0ms.
--Espero que ajude!
Proposta como resposta por StrayMuse segunda-feira, 19 de novembro de 2012 17:19.
Infelizmente, essa estratégia pode causar confusão, pois os dois executáveis (PowerShell e o aplicativo de console) competiriam pelo controle do teclado e da janela. Isso pode ser menos um problema se o aplicativo de console estiver fazendo apenas saída, mas.
Al Dunbar - lembre-se de "marcar ou propor como resposta" ou "votar como útil", conforme apropriado.
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.
Ei, eu estou tentando usar o processo de início para chamar um aplicativo de console e redirecionar a saída para a janela do powershell. Isso é possível? Eu entendo que posso redirecioná-lo para um arquivo usando:
Eu sei que eu posso ler o arquivo e exibir o conteúdo no shell. Essa abordagem parece um hack. Estou tentando ver se há uma abordagem mais direta.
Eu também não estou casado com o uso do start-process se houver uma opção melhor.
Todas as respostas.
aqui é outro caminho.
O Almirante Ackbar diz.
Proposto como resposta por NimanthaW sexta-feira, 27 de junho de 2014 às 4:55 da manhã.
Basta verificar se as sugestões foram úteis. Por favor, deixe-nos saber se você gostaria de mais assistência.
Se você é usuário da Subscrição TechNet e tem algum feedback sobre a nossa qualidade de suporte, envie seus comentários aqui.
Suporte da Comunidade TechNet.
Você sempre pode obter a saída de um aplicativo de console atribuindo uma variável a ele:
PS C: \ Users \ me & gt; $ pingresult = ping myserver.
PS C: \ Users \ me & gt; $ pingresult.
Pinging myserver. mydom. local [10.101.0.103] com 32 bytes de dados:
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Resposta de 10.101.0.103: bytes = 32 tempo & lt; 1ms TTL = 128.
Estatísticas de ping para 10.101.0.103:
Pacotes: Enviado = 4, Recebido = 4, Perdido = 0 (perda de 0%),
Tempos de ida e volta aproximados em milissegundos:
Mínimo = 0ms, Máximo = 0ms, Média = 0ms.
--Espero que ajude!
Proposta como resposta por StrayMuse segunda-feira, 19 de novembro de 2012 17:19.
Infelizmente, essa estratégia pode causar confusão, pois os dois executáveis (PowerShell e o aplicativo de console) competiriam pelo controle do teclado e da janela. Isso pode ser menos um problema se o aplicativo de console estiver fazendo apenas saída, mas.
Al Dunbar - lembre-se de "marcar ou propor como resposta" ou "votar como útil", conforme apropriado.
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.
Comments
Post a Comment