Sunday 29 October 2017

Start process waitforexit powershell


Estou tentando executar um programa do PowerShell, aguarde a saída, em seguida, obter acesso ao ExitCode, mas não ter muita sorte. Eu não quero usar - Wait com Start-Process, como eu preciso de algum processamento para continuar em segundo plano. Heres um script de teste simplificado: Executar este script fará com que o bloco de notas seja iniciado. Depois que este for fechado manualmente, o código de saída será impresso, e ele será iniciado novamente, sem usar - wait. Nenhum ExitCode é fornecido quando isso é sair: Eu preciso ser capaz de executar o processamento adicional entre iniciar o programa e à espera dele sair, então eu não posso fazer uso de - Wait. Qualquer idéia de como eu posso fazer isso e ainda ter acesso à propriedade. ExitCode a partir deste processo pediu 21 abr às 19:23 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 deste defeito connect. microsoft/PowerShell/feedback/details/520554/start-process-does-not-return-exitcode-property Depois de fazer esse objeto de um processo é passado para trás e você pode olhar Na propriedade ExitCode desse objeto. Aqui está um exemplo: Se você executá-lo sem - PassThru ou - Wait, ele irá imprimir nada. Processos de Gerenciamento no PowerShell Várias pessoas perguntaram recentemente sobre como gerenciar processos no PowerShell. Esta postagem no blog deve responder a algumas dessas perguntas. Como se poderia esperar da parte 8220shell8221 do PowerShell, você não precisa fazer nada especial para iniciar um processo. Em uma linguagem de programação como VBScript, você tem que fazer algo bastante complexo como: strComputer 8220.8221 Set objWMIService GetObject (8220winmgmts: 8221 amp 8220 8221 amp strComputer amp 8220rootcimv28221) Set objStartup objWMIService. Get (8220Win32ProcessStartup8221) Set objConfig objStartup. SpawnInstance Set objProcess GetObject (8220winmgmts: rootcimv2: Win32Process8221) objProcess. Create 8220Notepad. exe8221, Null, objConfig, intProcessID mas em conchas (PowerShell, cmd. exe, festança, etc.) você pode simplesmente começar um programa como o bloco de notas simplesmente digitando 8220notepad8221 como mostrado. Agora, observe que ao fazer isso o shell retorna imediatamente e solicita o próximo comando. Isso ocorre porque o bloco de notas é um processo GUI win32 e é executado em segundo plano. Por outro lado, se você iniciar um aplicativo de console como 8220ping. exe8221, o PowerShell aguardará até que o processo seja concluído. Mas e se eu quiser esperar pelo processo Win32 Em cmd. exe, you8217d fazer isso com 8220start / wait8221, mas este comando não está (diretamente) disponível no PowerShell. Então, o que fazemos O PowerShell executa diretamente executáveis. Se espera o processo para sair, o código de saída será deixado em LASTEXITCODE. Agora, se um executável do Win32 for o último comando de um pipeline e não for redirecionado, o processo será executado em segundo plano. No entanto, se você canalizar sua saída para algo, então o PowerShell aguardará o comando para sair. Portanto, esta é uma espera simples (se não intuitiva) para aguardar um processo de GUI para sair. Como alternativa, se o processo já estiver em execução, você pode usar o Get-Process para obter as informações necessárias e, em seguida, fazer um WaitForExit () nesse objeto. Aqui está um exemplo um pouco mais sofisticado onde abrimos um documento em vez de iniciar um processo. Desta vez we8217ll encontrar o processo pelo título da janela em vez de pelo nome do executável Infelizmente procurar por um processo sempre significa que você pode encontrar o processo errado. Idealmente, você gostaria de obter o objeto Processar diretamente. Assim, para um gerenciamento de processos mais preciso, você precisará usar a classe. NET System. Diagnostics. Process e iniciar os processos por conta própria. Por exemplo, você pode usar diagnostics. process :: Start () para aguardar um processo: Observe o uso de 8220pwdfoo. txt8221 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 aplica-se ao uso de qualquer API. NET que acesse o sistema de arquivos que você precisa para dar-lhe um caminho absoluto.) Agora we8217re começando a voltar ao nível de complexidade que você encontrar em uma linguagem de programação. No entanto, você também tem todo o poder dessas línguas. Here8217s um exemplo de script 8220background. ps18221 que lhe permitirá executar um scriptblock isolada em uma janela separada (ou na mesma janela se você especificar o parâmetro inconsole. Este script let8217s você faz as coisas em PowerShell que você can8217t fazer a partir cmd. exe, mas pode Fazer a partir do VBScript Finalmente, aqui estão duas outras maneiras de trabalhar com processos. Mesmo que o PowerShell doesn8217t têm um comando de início, cmd. exe faz isso você pode fazer um start / wait por fazer E, por último mas não menos importante, o PowerShell Community Extensions Inclui um Start-Process cmdlets. Você pode obter uma lista desses recursos em: Bruce Payette MSFTHey Estou tentando usar start-process para chamar um aplicativo de console e redirecionar a saída para a janela powershell. Isso é possível eu entendo que eu posso Redirecioná-lo para um arquivo usando: Eu sei que eu posso ler o arquivo e exibir o conteúdo no shell. Esta abordagem parece ser um hack. Eu estou tentando ver se há uma abordagem mais direta. Eu também não sou casado com Usando start-process se houver uma opção melhor. Segunda-feira, 12 de novembro de 2017 22:03 Todas as respostas Você pode apenas chamar o aplicativo de console pelo nome, mas se usando start-process você pode obter o mesmo efeito usando o parâmetro - NoNewWindow. Comece-Process - NoNewWindow - FilePath: ltpath-to-console executablegt terça-feira, novembro 13, 2017 12:27 AM Você sempre pode obter a saída de um aplicativo de console através da atribuição de uma variável a ele: PS C: Usersmegt pingresult de ping myserver PS C: Usersmegt pingresult Pinging myserver. mydom. local 10.101.0.103 com 32 bytes de dados: resposta de 10.101.0.103: timelt1ms bytes32 TTL128 Responder de 10.101.0.103: bytes32 timelt1ms TTL128 Responder de 10.101.0.103: timelt1ms bytes32 TTL128 Responder de 10.101. 0,103: bytes32 timelt1ms estatísticas TTL128 Ping para 10.101.0.103: Pacotes: enviados 4, Recebidos 4, perdidos 0 (0 perda), Tempo de ida e volta aproximado em milissegundos: Mínimo 0ms 0ms, Máximo, Média 0ms --Hope que ajuda a propostas Como resposta por StrayMuse Segunda-feira, 19 de novembro de 2017 17:19 Você pode apenas chamar o aplicativo de console pelo nome, mas se usar o processo de início você pode obter o mesmo efeito usando o - NoNewWindow alternar. Comece-Process - NoNewWindow - FilePath: ltpath-to-console executablegt Infelizmente, essa estratégia pode causar confusão, já que os dois executáveis ​​(PowerShell e o aplicativo de console) seriam disputando o controle do teclado e da janela. Isso pode ser menos um problema se o aplicativo de console está fazendo apenas saída, mas. Al Dunbar - lembre-se de marcar ou propor como resposta ou voto útil como apropriado. Segunda-feira, 19 de novembro de 2017 22:06 Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site Technet. Se você optar por participar, a pesquisa on-line será apresentada a você quando sair do site da Technet. Gostaria de participar 2017 Microsoft. Todos os direitos reservados.

No comments:

Post a Comment