Como Powershell Foreach, While e Other Loops funcionam

Como Powershell Foreach, While e Other Loops funcionam

Uma primeira etapa crucial no aprendizado de programação é trabalhar com loops. Felizmente, o PowerShell continua a crescer com suas habilidades.





tempo limite do watchdog do relógio do simulador de construção de pc

Você pode enquadrar os comandos existentes que usa todos os dias dentro de loops para economizar tempo e esforço. Seus scripts fazem o trabalho pesado enquanto você faz o importante trabalho de ler mais artigos no MakeUseOf!





Powershell ForEach Loops: a porta para o tratamento avançado de dados

ForEach é o alias de ForEach-Object. (Um Alias ​​é apenas um atalho para um comando no PowerShell.) Este é um bom momento para falar sobre a maneira como o PowerShell trata os dados.





Como a maioria das linguagens de programação modernas, o PowerShell é orientado a objetos. Tudo no PowerShell é um objeto, o que significa que mesmo as variáveis têm propriedades e funções estendidas . Essa propriedade é a razão pela qual você pode definir suas pesquisas como uma variável e acabar com uma matriz de resultados.

$yourVar = Get-ChildItem *
foreach ($file in $yourVar){
Your Steps
}

Em algumas linguagens, o processamento dessa matriz seria um processo de várias etapas. Primeiro, pegue o comprimento e depois conte cada passo.



No PowerShell, você percorre a matriz e executa a ação em cada uma usando ForEach. Isso economiza várias linhas de código, o que é útil se você tiver um script mais longo. Por exemplo, o seguinte é um pequeno script que usaria alguns loops Powershell ForEach. Ele cria um arquivo ZIP de todos os seus arquivos que você não abre há 30 dias.

Construindo um sistema de arquivamento de arquivos usando ForEach Loops

Vamos quebrar as etapas. Você usa Get-ChildItem para obter todos os arquivos da pasta Documentos. A variável de ambiente $ env: USERPROFILE executa o script usando o perfil atual. Esta variável é mais portátil do que um caminho codificado. Os resultados dessa pesquisa são atribuídos à variável $ MyDocs . Em seguida, criamos nosso loop ForEach fazendo-o passar por cada $ Doc em $ MyDocs .





$oldDocs = @()
$MyDocs = Get-ChildItem -Path '$($env:USERPROFILE)Documents' -Recurse
foreach ($doc in $MyDocs){
if($doc.LastAccessTime -lt $(Get-Date).addDays(-30)){
$oldDocs += $doc
}
}
$ArchiveFolder = New-Item -Path '$($env:USERPROFILE)Documents$((Get-Date -Format MMddyy).toString())' -ItemType Directory
foreach ($doc in $oldDocs){
Move-Item -Path $doc.FullName -Destination '$($ArchiveFolder.FullName)$($doc.Name)' -Confirm $false
}
$source = $ArchiveFolder.FullName
$destination = '$($env:USERPROFILE)Documents$($ArchiveFolder.Name).zip'
Add-Type -AssemblyName 'system.io.compression.filesystem'
[io.compression.zipfile]::CreateFromDirectory($source, $destination)
if(test-path $destination){
Remove-Item -Path $ArchiveFolder -Recurse -Confirm $false
}

Dentro do loop, verificamos se cada arquivo LastAccessTime propriedade tem mais de 30 dias. Conseguimos isso com o Get-Date cmdlet, e usando o AddDays função com trinta negativos. Se for, adicionamos o arquivo ao $ myOldDocs variedade. Após a conclusão da classificação do arquivo, pegamos nosso array completo e criamos um arquivo zip. Este processo é um pouco mais complicado, pois envolve invocar um pouco do .NET. Não se preocupe se você não entender - você pode roubar o código de este documento de ajuda do TechNet .

Para detalhar o que está acontecendo aqui: Moveremos todos os nossos arquivos antigos para um novo diretório com a data de hoje para mais de 30 dias. Uma vez que a pasta seja construída, temos que criar o arquivo ZIP com o mesmo nome. Testaremos para ter certeza de que o arquivamento foi bem-sucedido e o arquivo .ZIP está lá e, em seguida, excluiremos a nova pasta. Defina isso como uma tarefa agendada para ser executada uma vez por mês. Você economizará um pouco de espaço e manterá sua pasta Documentos limpa.





While e Do While: Loops na condição

Se você quiser executar um loop apenas quando uma condição específica for atendida, use um loop While. Se você estiver usando uma variável para rastrear a contagem, defina-a primeiro.

i=0
while(i<10){
Your Steps
i+=1
}

O problema é que, se você não estiver usando um contador, talvez queira que seu código seja executado pelo menos uma vez, mesmo que o teste seja verdadeiro. Este é o caso do script de exemplo abaixo. Então, nesses casos, você deseja usar um loop Do-While. A sintaxe é um pouco diferente.

do{
Your Steps
}while(Conditional Statement)

Usá-los não é tão óbvio para um programador novato. Fazendo scripts diários normais, você pode não encontrá-los com frequência. Eles são especialmente úteis para criar um cronômetro improvisado para testar o sucesso de um processo.

disco em execução em 100 por cento do Windows 10

Vamos construir um script rápido para reinicializar uma máquina remota e alertar se ela não voltar em 15 minutos. Este cenário assume que é um servidor doméstico ou outra máquina que não reinicializa com frequência. Sinta-se à vontade para ajustar a hora se o seu computador costuma ficar mais rápido.

Reinicializar e verificar: usando um loop Do-While

Este script é um pouco mais simples. Primeiro, você usa o Reinicialização do computador comando para reinicializar a máquina remota. (Usamos um IP fictício aqui para os comandos de reinicialização, certifique-se de sobrescrevê-lo com o DNS / IP do seu computador). Em seguida, crie a variável de contador, eu e defina-o como 0. Em seguida, você tem seu loop Do com Start-Sleep interrompendo o script por 300 segundos (cinco minutos). Um segundo comando adiciona um ao contador.

Restart-Computer -ComputerName 127.0.0.1
i=0
do{
Start-Sleep -Seconds 300
$i += 1
}while((!(Test-Connection 127.0.0.1 -Quiet)) -or $i -gt 3)
if($i -gt 3){
Write-Ouput 'Remote Machine not responding, please check.'
}
else{
Write-Output 'Reboot Succeeded'
}

Então, temos nossos critérios While. Usamos um teste Or para garantir que uma falha gere um alerta. A alternativa é o script em loop indefinidamente à espera da máquina remota. Para verificar a máquina, estamos usando o Test-Connection cmdlet. Para simplificar, é Ping for PowerShell. Nós adicionamos o parâmetro -Quieto o que o força a retornar True ou False em vez dos resultados dos pacotes. A segunda parte da instrução Or verifica se o contador é mais de três.

Assim que o loop for concluído, queremos criar a saída. Isso significa que precisamos verificar nosso contador. Esta é uma declaração if / else rápida. Se for maior que três, o script informa que a máquina remota não está respondendo. Se não estiver, ele informa que a reinicialização foi bem-sucedida.

Outros Loops

Existem dois outros tipos de loops disponíveis no PowerShell. Eles estão um tanto relacionados aos dois loops anteriores, mas não são tão comumente usados. Um loop For funciona de maneira semelhante ao exemplo While. Você define todos os seus critérios na avaliação e, em seguida, define seus cmdlets.

for($i = 0;$i -lt 10;$i++){
Your Steps
}

Os loops Do Until são como os loops Do While, basta alterar a instrução While para Until. No script de exemplo, seria o mesmo tanto quanto o comportamento. É uma escolha de estilo, mas o Do While é mais versátil em outras situações. Portanto, se você se lembrar de apenas um, Do While é mais útil.

O PowerShell também oferece ajuda para cada um desses loops. Você pode obter ajuda adicionando cerca de antes do nome do loop em Get-Help. Você pode ver exemplos e outras dicas para cada tipo. Isso deve ser útil se você ficar preso.

Continuando a crescer com você

Neste ponto, você tem a maioria das habilidades para começar a construir scripts robustos. Seja automatizando seu equipamento doméstico ou economizando tempo no trabalho, os loops ajudam seus scripts a fazer mais. Combinar esses loops com o tratamento de erros move seu script além do básico. Isso abre a porta para idiomas mais avançados.

O que é um script PowerShell inteligente que você criou usando loops? Compartilhe conosco nos comentários.

Compartilhado Compartilhado Tweet O email Exclua esses arquivos e pastas do Windows para liberar espaço em disco

Precisa liberar espaço em disco no seu computador Windows? Aqui estão os arquivos e pastas do Windows que podem ser excluídos com segurança para liberar espaço em disco.

Leia a seguir
Tópicos relacionados
  • Programação
  • PowerShell
  • Scripting
Sobre o autor Michael McConnell(44 artigos publicados)

Michael não usou um Mac quando eles estavam condenados, mas ele pode codificar em Applescript. Ele é formado em Ciência da Computação e Inglês; ele tem escrito sobre Mac, iOS e videogames há algum tempo; e ele tem sido um macaco de TI durante o dia por mais de uma década, especializando-se em scripts e virtualização.

por que meu controlador de ps4 continua desconectando
Mais de Michael McConnell

Assine a nossa newsletter

Junte-se ao nosso boletim informativo para dicas de tecnologia, análises, e-books grátis e ofertas exclusivas!

Clique aqui para se inscrever