Start-process powershell waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Usando o comando start-process e - wait no Powershell.
Eu sou novo no Powershell e não tenho muito um fundo de programação, apenas tentando usá-lo para embalagens de software. De qualquer forma, descobri sobre o comando start-process com o parâmetro - Wait, e funciona muito para a maioria das coisas. O que eu notei é que não só espera o processo que você especifica, ele espera por qualquer subprocesso, mesmo depois que o processo principal já não está sendo executado. Geralmente isso é bom, mas eu tenho uma situação estranha. Eu estou executando um arquivo de lote complexo do Oracle com o processo de início. O arquivo em lote eventualmente executa setup. exe, que é o que eu realmente quero esperar, mas outros processos também geram que nunca parar. Então, se eu usar o parâmetro - wait, o script nunca pára mesmo depois que o setup. exe não estiver sendo executado. O mais próximo que encontrei é usar isso:
Isso funciona, mas eu acho que haveria uma maneira melhor sem ter que usar um comando de tempo limite. Alguma ideia?
Start-process powershell waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Powershell start-process - wait parâmetro falha no bloco de script remoto.
Então, aqui está uma amostra do que estou tentando fazer:
Ele se conecta à outra máquina muito bem e lança o processo bem. O problema é que não aguarda que o processo seja concluído antes de seguir em frente. Isso causa problemas. Alguma ideia?
Edição rápida: por que o parâmetro - aquê de espera falha ao executar o processo remotamente?
Este é o problema com a Powershell versão 3, mas não a versão 2, onde - Espera funciona como deveria.
No Powershell 3. WaitForExit () faz o truque para mim:
Apenas Start-Sleep até. HasExited - não define. ExitCode, e geralmente é bom saber como seu. exe terminou.
Eu encontrei isso uma vez antes, e IIRC, a solução foi:
Você também pode contornar isso usando a classe System. Diagnostics. Process. Se você não se preocupa com a saída que você pode usar:
Se você se importa, pode fazer algo semelhante ao seguinte:
Isso aguardará o processo para concluir e, em seguida, retornará o fluxo de saída padrão.
Start-process powershell waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Aguarde até que o processo saia usando powershell.
Eu tinha um pequeno programa em F # (semelhante ao C #), que recebe processos por nome, depois filtra o particular por seu caminho e espera que ele saia:
Mas este código funciona apenas no computador local. Agora eu quero alcançar a mesma funcionalidade no computador remoto.
Então é por isso que escolho o PowerShell (eu sou completamente novo para ele).
É possível filtrar o processo por seu caminho e esperar que ele saia usando uma linha no powershell? Caso contrário, talvez você possa fornecer uma solução mais longa?
Como eu executarei essa linha no computador remoto. Eu já tenho uma idéia. Tudo o que preciso é apenas essa linha mágica.
EDIT: Na verdade, essa linha deve funcionar na máquina local, porque vou passá-la usando o msdeploy, que a executa na máquina remota como um comando local.
Passou algum tempo jogando com powershell e finalmente consegui o que queria:
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.
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.
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?
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.
Obter através da App Store Leia esta publicação em nosso aplicativo!
Powershell start-process - wait parâmetro falha no bloco de script remoto.
Então, aqui está uma amostra do que estou tentando fazer:
Ele se conecta à outra máquina muito bem e lança o processo bem. O problema é que não aguarda que o processo seja concluído antes de seguir em frente. Isso causa problemas. Alguma ideia?
Edição rápida: por que o parâmetro - aquê de espera falha ao executar o processo remotamente?
Este é o problema com a Powershell versão 3, mas não a versão 2, onde - Espera funciona como deveria.
No Powershell 3. WaitForExit () faz o truque para mim:
Apenas Start-Sleep até. HasExited - não define. ExitCode, e geralmente é bom saber como seu. exe terminou.
Eu encontrei isso uma vez antes, e IIRC, a solução foi:
Você também pode contornar isso usando a classe System. Diagnostics. Process. Se você não se preocupa com a saída que você pode usar:
Se você se importa, pode fazer algo semelhante ao seguinte:
Isso aguardará o processo para concluir e, em seguida, retornará o fluxo de saída padrão.
Start-process powershell waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Aguarde até que o processo saia usando powershell.
Eu tinha um pequeno programa em F # (semelhante ao C #), que recebe processos por nome, depois filtra o particular por seu caminho e espera que ele saia:
Mas este código funciona apenas no computador local. Agora eu quero alcançar a mesma funcionalidade no computador remoto.
Então é por isso que escolho o PowerShell (eu sou completamente novo para ele).
É possível filtrar o processo por seu caminho e esperar que ele saia usando uma linha no powershell? Caso contrário, talvez você possa fornecer uma solução mais longa?
Como eu executarei essa linha no computador remoto. Eu já tenho uma idéia. Tudo o que preciso é apenas essa linha mágica.
EDIT: Na verdade, essa linha deve funcionar na máquina local, porque vou passá-la usando o msdeploy, que a executa na máquina remota como um comando local.
Passou algum tempo jogando com powershell e finalmente consegui o que queria:
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.
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.
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?
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.
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.
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?
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.
Комментариев нет:
Отправить комментарий