Wednesday 7 March 2018

Powershell waitforexit example


exemplo 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:

exemplo 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.

Wait-Process.
Aguarde que um ou mais processos sejam interrompidos antes de aceitar mais entrada.
Wait-Process funciona apenas em processos em execução no computador local.
Pare o processo do bloco de notas e aguarde até que o processo seja interrompido antes de prosseguir com o próximo comando:
PS C: \ & gt; $ nid = (bloco de notas de get-process).id.
PS C: \ & gt; stop-process - id $ nid.
PS C: \ & gt; wait-process - id $ nid.
PS C: \ & gt; wait-process-outlook do nome, winword - timeo 30.
Mostre três métodos diferentes de especificar um processo para o cmdlet Wait-Process:
PS C: \ & gt; $ p = notepad get-process.
PS C: \ & gt; wait-process - id $ p. id.
"Então, o que fazemos? Qualquer coisa. Alguma coisa. Enquanto não nos sentarmos lá. Se o destruiremos, comece de novo. Experimente outra coisa. Se aguardarmos a satisfação de todas as incertezas, pode ser muito tarde "
Wait-Job - Aguarde por um trabalho de fundo.
Wait-Event - Aguarde até que um determinado evento seja gerado.

Ei, Scripting Guy! Blog Hey, Scripting Guy! Blog.
Saiba mais sobre o Windows PowerShell.
Use o PowerShell para pausar um script enquanto outro processo sai.
Resumo: Saiba como usar o Windows PowerShell para pausar um script e esperar por outro processo para sair antes de continuar.
Ei, Scripting Guy! Estou tentando usar o Windows PowerShell para encerrar um aplicativo, mas o aplicativo é bastante complicado. Eu preciso parar um processo e aguardo que esse processo seja concluído antes de iniciar o segundo processo. Tentei usar o cmdlet Start-Sleep para pausar a execução do script para permitir que os diferentes processos sejam concluídos, mas, infelizmente, diferentes sistemas são mais rápidos do que outros, então esta é uma proposição de sucesso ou falta. Você consegue descobrir uma maneira melhor de fazer isso?
Microsoft Scripting Guy Ed Wilson aqui. Bem, eu estou flutuando a uma distância de 35.000 pés (10.850 metros) ouvindo a Waltz of the Prophets de Stan Kenton, que na minha mente (como ex-saxofone da universidade) é um dos melhores padrões de jazz já escritos. Tenho jogado com o Windows PowerShell nas últimas horas (decidiu agrupar várias funções do meu utilitário em um módulo do Windows PowerShell, criar um manifesto e instalá-los na minha pasta do Windows PowerShell usando minha função de Modos de cópia). Você deve realmente investir na escrita dos módulos do Windows PowerShell em vez de escrever scripts únicos, se possível. O esforço pagará grandes dividendos.
De qualquer forma, estou sentado na Primeira Classe (fui atualizado) com uma mesa de trabalho decente, e meu novo laptop terá mais de oito horas e ainda fornecerá um desempenho decente, então a vida é boa. A solidão proporciona um tempo maravilhoso para explorar e jogar com o Windows PowerShell. Estou me forçando a me afastar do WMI por enquanto e, em vez disso, estou me concentrando em diferentes maneiras de juntar os cmdlets, para ver se eu posso encontrar algo legal. Fiquei bastante satisfeito com o truque do caminho que eu criei na Last. fm dois truques poderosos para encontrar posts do PowerShell Scripts.
Uma das coisas com as quais eu estava jogando é o cmdlet Wait-Process. É muito útil quando usado em um script na medida em que interromperá a execução de um script até que um processo termine. Isso permite uma maneira fácil de escrever um script que encerra múltiplos processos e mdash, um de cada vez.
Há duas maneiras pelas quais o cmdlet Wait-Process aceita entrada: um nome de processo ou um ID de processo. Por exemplo, posso iniciar uma instância do Bloco de notas e, em seguida, usar o processo de espera para pausar até o Bloco de notas se fechar.
Quando qualquer instância do processo do Bloco de Notas sai, o controle para o script (ou console do Windows PowerShell) retorna. Isso funciona quando você não se importa qual a cópia do bloco de notas fecha, ou quando você sabe que há apenas uma instância de um processo em execução.
Uma maneira mais útil para fazer isso é capturar o ID do processo do processo quando ele lança e usar esse ID de processo específico com o cmdlet Wait-Process. Esta técnica usa o cmdlet Invoke-WmiMethod e é mostrado aqui:
$ proc = Invoke-WmiMethod - Class win32_process - Name create - ArgumentList "notepad"
Wait-Process - Id $ proc. ProcessId.
Um dos meus truques favoritos (mas não está nos meus dez melhores truques favoritos do Windows PowerShell) canaliza o Notepad to Out-Null para interromper o processamento do script até o Bloco de Notas se fechar. Em seguida, removo a cópia do arquivo de texto que foi visualizado. Esta é uma ótima maneira de lidar com arquivos temporários. Esta técnica é mostrada no seguinte código:
notepad $ tmpfile | fora-nulo.
O problema com este & ldquo; trick & rdquo; é que isso não funciona para outras coisas. Por exemplo, se eu escrever informações de processo em formato HTML e exibir que no Internet Explorer, o truque Out-Null não interrompe o script. Além disso, se eu tentar fechar o Internet Explorer sem um ID de processo específico, talvez eu possamos fechar mais de uma instância do Internet Explorer. O código que se segue cria um arquivo temporário em um local temporário. Ele muda a extensão de arquivo para HTML e, em seguida, usa o cmdlet Convertto-HTML para enviar dados formatados HTML do cmdlet Get-Process. Eu uso o cmdlet Out-File para escrever meus dados formatados em HTML para um arquivo e então eu uso o cmdlet Invoke-Item para abrir o arquivo HTML no Internet Explorer (pelo menos no meu sistema, esta metodologia irá abrir o arquivo HTML com o programa padrão associado a essa extensão):
Out-File - FilePath $ tmpFile - Incoding ascii - append.
Nota Veja o excelente convidado Hey, Scripting Guy! Postagem do blog, funções de proxy: especifique seus PowerDocs Core PowerShell, escritos pelo Microsoft PowerShell MVP Shay Levy para obter uma maneira de adicionar um parâmetro filepath ao cmdlet ConvertTo-HTML. Ao criar uma função de proxy, você pode evitar uma chamada para Out-File.
O truque Out-Null não pausará o script e permitirá a limpeza, e não saberemos qual versão ou instância do Internet Explorer pode ser morta de qualquer maneira, então é necessário que haja uma nova maneira. Aqui estão os passos envolvidos:
Crie um nome de arquivo temporário. Altere a extensão do arquivo para html. Pipe dados para o cmdlet ConvertTo-Html. Pipe os dados de ConvertTo-Html para Out-File e crie um documento HTML. Use o método Invoke-WMIM para abrir o arquivo e armazenar os valores de retorno. Use o cmdlet Wait-Process para interromper a execução do script e aguarde o fechamento do processo. Use Remover-Item para remover o arquivo temporário.
O script GetProcessInfoDisplayHTMLtrackProcessAndRemoveTmpFile. ps1 ilustra estas etapas.
-ChadPath "internet explorer \ iexplore. exe"
Out-File - FilePath $ tmpFile - Incoding ascii - append.
$ iepid = Invoke-WmiMethod - Class win32_process - Name create - Argument "$ iepath $ tmpfile"
Wait-Process - Id $ iepid. ProcessId.
No script, a primeira coisa que faço é obter um nome de arquivo temporário. O método GetTempFileName cria um nome de arquivo temporário na localização temporária. Um exemplo desse nome de arquivo é mostrado aqui:
Eu dividi a corda no período. Este não é um método confiável para dividir nomes de arquivos e remover a extensão do arquivo, mas funciona aqui. Por exemplo, isso irá falhar se um nome de arquivo tiver dois períodos no nome. Na minha ocasião, concatenei o nome do arquivo temporário com & ldquo;.html & rdquo; e acabou com um nome de arquivo com dois períodos, o que é, naturalmente, um nome de arquivo perfeitamente aceitável. Aqui estou simplesmente explorando outras formas de criar um nome de arquivo temporário com uma extensão de arquivo HTML. O Internet Explorer requer um arquivo para ter uma extensão de arquivo HTML, ou não irá renderizar a página corretamente. Por exemplo, se eu ficar com a extensão de arquivo. tmp, a página é exibida como mostrado na figura a seguir.
Eu gosto de usar o cmdlet Join-Path para criar caminhos. Para fazer isso, preciso fornecer a parte do caminho (caminho do pai) e a parcela do caminho da criança (caminho do filho) do caminho. Não estou restrito a simplesmente caminho \ executável na minha formatação. Posso, por exemplo, incluir diretórios adicionais na minha parcela do comando filho do comando. Neste exemplo, eu uso uma variável ambiental para recuperar o caminho para os arquivos do programa x86 e, em seguida, adiciono o restante do caminho para o executável do Internet Explorer. Eu quebrei o comando e usei o caractere do backtick (`) para a continuação da linha. Eu normalmente não faria isso, mas é necessário encaixá-lo na página. Esta parte do script segue:
-ChadPath "internet explorer \ iexplore. exe"
Nota Ao copiar o código do Hey, Scripting Guy! Blog, é possível que os caracteres estranhos apareçam após o caractere do backtick, e esse personagem invisível quebrará o código. A correção é colar o código no Windows PowerShell ISE e usar o caractere de retrocesso para apagar os caracteres invisíveis que seguem o caractere do backtick.
Agora crio uma página HTML usando o cmdlet Convertto-HTML. Eu escrevo o código HTML em um arquivo usando o cmdlet Out-File. Este código é mostrado aqui:
Out-File - FilePath $ tmpFile - Incoding ascii - append.
Eu uso o cmdlet Invoke-WMIMethod para chamar o método create da classe Win32_Process WMI. Eu uso essa metodologia porque retorna o ID do processo da instância recém-criada do Internet Explorer. Eu armazeno o ID do processo em uma variável chamada $ iepid. Este código é mostrado aqui:
$ iepid = Invoke-WmiMethod - Class win32_process - Name create - Argument "$ iepath $ tmpfile"
Agora paro a execução do script até a nova instância do Internet Explorer desaparecer. Depois que ele desaparece, eu chamo o cmdlet Remove-Item, e eu exclui o arquivo HTML temporário, como mostrado aqui:
Wait-Process - Id $ iepid. ProcessId.
O arquivo HTML que o script cria e exibe é mostrado na figura a seguir.
SK, é tudo o que há para usar o cmdlet Wait-Process para pausar a execução do script e aguardar a conclusão de um processo. Convido você para se juntar a mim amanhã para obter mais coisas legais do Windows PowerShell.
Convido você a me seguir no Twitter e no Facebook. Se você tiver alguma dúvida, envie-me no scriptermicrosoft ou publique suas perguntas no Official Scripting Guys Forum. Te vejo amanhã. Até então, paz.
Ed Wilson, Microsoft Scripting Guy.
Cancelar resposta.
Viajando Primeira Classe (ele foi atualizado) parece que a importância do blog HSG aumentou novamente!
Sua indicação "estou me forçando a ficar longe da WMI por enquanto" me faz rir, se eu olhar para este artigo de blog, notando que o método Invoke-WMI apareceu assim que eu puder contar com três :-)))
Bem, de volta à segurança, concordo que podemos controlar uma grande parte da funcionalidade operacional com powershell se pudermos ficar com PS durante todo o processo, o que não é o caso do problema da SK. Está ficando complicado se ele começou sua aplicação fora do powershell e espera que algumas partes dele desligem. Nós provavelmente não criamos o processo de aplicação da raiz em PS e não temos o PID a mão (alguém deve llok-lo, se não possamos usar o nome do processo). Se o aplicativo criar seus próprios processos durante a execução, talvez não seja fácil seguir a seqüência do novo processo gerado e encerrado, então, provavelmente, só esperamos o fim do aplicativo completo se não iniciarmos cada um parte dele separadamente.
De qualquer forma, seus exemplos mostram o que podemos fazer no powershell para controlar o fluxo de trabalho dos processos que criamos com o PS. Isso é bom o suficiente, enquanto não tenhamos que controlar múltiplas aplicações em paralelo ou ter que realizar mais cálculos enquanto isso. Isso é quando temos que considerar trabalhos em segundo plano e eventos assíncronos que podem nos ajudar a ficar atentos com o fluxo de trabalho em andamento.
Lembro-me de alguns artigos anteriores do blog aqui que apontaram nessa direção.
Mas esse tópico ganhou não seja o querido de todos & # 8230; com certeza! & # 8230; O material de Ninja do powershell daquele 🙂
Klaus Schulte, o atendente de voo disse: "É o Scripting Guy" e me mudou para o primeiro (não realmente, mas parece bom). Além disso, você me pegou, não consegui passar por um artigo inteiro sem falar sobre o WMI 🙂 Sim, este exemplo, é um caso de vantagem para ter certeza. Mas a coisa legal é que existe o cmdlet Wait-Process, e pode ser usado facilmente para resolver alguns tipos de problemas do mundo real. É também um desses cmdlets que "ninguém fala sobre" e eu queria ajudar a corrigir isso. Obrigado por seus comentários Klaus. Procuro por todas as manhãs 🙂
Se você estiver dependendo de um processo gerado em outro lugar, o WMI funciona. Mas se é um processo gerado pelo seu próprio script, por que o trabalho do Start-Processo? Isso lhe dá o identificador e você pode - espere se precisar dele para completar antes de iniciar outro trabalho.
O que é mais, você pode obter o uso da CPU do processo gerado e, pelo menos, monitorá-lo e reiniciá-lo se ele parar. Eu usei isso para controlar um codificador de mídia que precisava executar 24/7 e gostava de pendurar de tempos em tempos.
Por que não o processo de início? Por padrão, o cmdlet Start-Process não retorna nada. Para obter qualquer coisa a partir do cmdlet Start-Process, é necessário usar a opção Start-Process - Passthru. Quando - passthru é usado, ele retornará um objeto de diagnósticos. processo, que de fato inclui o ID do Processo. Eu estava apenas fazendo uma piada sobre não usar o WMI, e eu queria reforçar o uso do método Invoke-WMIM. Como sempre, existem muitas maneiras diferentes de fazer as coisas em powershell. Obrigado pelo seu comentário, e por ajudar a mencionar uma maneira diferente de fazer as coisas.
Uma pergunta rápida.
Estou tendo um problema com Enter-PSSession que a conexão demora um pouco antes de chegar e o script "continua" de modo que não pegue as próximas linhas de comando. Eu tentei com start-sleep e wait-event, mas sem sorte.
Eu uso isso para fazer login no servidor.
$ secstr = New-Object - TypeName System. Security. SecureString.
$ cred = new-object - typename System. Management. Automation. PSCredential - argumentlist $ username, $ secstr.
$ no91gpotestsrv = New-PSSession - Name no91-gpotestsrv - ComputerName no91-gpotestsrv - Credential $ cred.
(aqui não pára para Enter-PSSession parar mas apenas continua, o que posso fazer aqui?)
#Mapping av network drive hvor filer ligger.
$ net = new-object - ComObject WScriptwork.
#Kopiering av filer og renomear.
$ return_fileversion1 = (Get-Command & quot; c: infrontbinstreamingserver_x64.exe & quot;). FileVersionInfo. Fileversion.
$ return_fileversion2 = (Get-Command & quot; r: ServersStreamingServerLatestx64streamingserver_x64.exe & quot;). FileVersionInfo. Fileversion.
IF ($ return_fileversion2 - gt $ return_fileversion1)
$ currentdate = get-date - Format aaaaMMdd.
renomear-item c: tempbinserver_x64.exe - newname (& quot; server_x64.exe. & quot; + $ currentdate)
Copiar item r: ServersbuildServerLatestx64server_x64.exe c: tempbin.
$ text = & quot; Novo arquivo copiado com Fileversion + $ return_fileversion2 & quot;
ELSEif ($ return_fileversion2 - eq $ return_fileversion1)
Write-host "O arquivo de destino é igual como arquivo de origem & quot;
ELSEif ($ return_fileversion1 - gt $ return_fileversion2)
Write-host "O arquivo de destino é maior que o arquivo de origem & quot;

No comments:

Post a Comment