Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Criação de scripts
Quando se passa de escrever comandos de uma só linha em PowerShell para criar scripts, parece mais complicado do que realmente é. Um script nada mais é do que os mesmos comandos ou comandos semelhantes que você executa interativamente no console do PowerShell, exceto que você os salva como um arquivo .ps1. Há algumas construções de script que você pode usar, como um loop de foreach em vez do cmdlet ForEach-Object. As diferenças podem ser confusas para iniciantes ao considerar que foreach é uma palavra-chave de idioma e um alias para o cmdlet ForEach-Object.
Looping
Um dos melhores aspetos do PowerShell é sua escalabilidade. Depois de aprender a executar uma tarefa para um único item, aplicar a mesma ação a centenas de itens é quase tão simples. Percorra os itens usando um dos diferentes tipos de ciclos no PowerShell.
ForEach-Object
ForEach-Object é um cmdlet para iteração através de itens em um pipeline, como com one-liners do PowerShell.
ForEach-Object transmite os objetos através do pipeline.
Embora o parâmetro do módulo de Get-Command aceite vários valores de cadeia de caracteres, ele só os aceita via entrada de pipeline por nome de propriedade. No cenário a seguir, se você quiser canalizar dois valores de cadeia de caracteres para Get-Command para uso com o parâmetro Module, precisará usar o cmdlet ForEach-Object.
'ActiveDirectory', 'SQLServer' |
ForEach-Object {Get-Command -Module $_} |
Group-Object -Property ModuleName -NoElement |
Sort-Object -Property Count -Descending
Count Name
----- ----
147 ActiveDirectory
82 SqlServer
No exemplo anterior, $_ é o objeto atual. A partir da versão 3.0 do PowerShell, $PSItem pode ser usado em vez de $_. A maioria dos usuários experientes do PowerShell prefere usar $_ já que é compatível com versões anteriores e há menos para escrever.
Ao usar a palavra-chave foreach, você deve armazenar os itens na memória antes de iterá-los, o que pode ser difícil se você não souber com quantos itens está trabalhando.
$ComputerName = 'DC01', 'WEB01'
foreach ($Computer in $ComputerName) {
Get-ADComputer -Identity $Computer
}
DistinguishedName : CN=DC01,OU=Domain Controllers,DC=mikefrobbins,DC=com
DNSHostName : dc01.mikefrobbins.com
Enabled : True
Name : DC01
ObjectClass : computer
ObjectGUID : c38da20c-a484-469d-ba4c-bab3fb71ae8e
SamAccountName : DC01$
SID : S-1-5-21-2989741381-570885089-3319121794-1001
UserPrincipalName :
DistinguishedName : CN=WEB01,CN=Computers,DC=mikefrobbins,DC=com
DNSHostName : web01.mikefrobbins.com
Enabled : True
Name : WEB01
ObjectClass : computer
ObjectGUID : 33aa530e-1e31-40d8-8c78-76a18b673c33
SamAccountName : WEB01$
SID : S-1-5-21-2989741381-570885089-3319121794-1107
UserPrincipalName :
Muitas vezes um loop como foreach ou ForEach-Object é necessário. Caso contrário, você receberá uma mensagem de erro.
Get-ADComputer -Identity 'DC01', 'WEB01'
Get-ADComputer : Cannot convert 'System.Object[]' to the type
'Microsoft.ActiveDirectory.Management.ADComputer' required by parameter
'Identity'. Specified method is not supported.
At line:1 char:26
+ Get-ADComputer -Identity 'DC01', 'WEB01'
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-ADComputer], Parame
terBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.ActiveDirecto
ry.Management.Commands.GetADComputer
Outras vezes, podes obter os mesmos resultados enquanto eliminas o ciclo. Consulte a ajuda do cmdlet para entender suas opções.
'DC01', 'WEB01' | Get-ADComputer
DistinguishedName : CN=DC01,OU=Domain Controllers,DC=mikefrobbins,DC=com
DNSHostName : dc01.mikefrobbins.com
Enabled : True
Name : DC01
ObjectClass : computer
ObjectGUID : c38da20c-a484-469d-ba4c-bab3fb71ae8e
SamAccountName : DC01$
SID : S-1-5-21-2989741381-570885089-3319121794-1001
UserPrincipalName :
DistinguishedName : CN=WEB01,CN=Computers,DC=mikefrobbins,DC=com
DNSHostName : web01.mikefrobbins.com
Enabled : True
Name : WEB01
ObjectClass : computer
ObjectGUID : 33aa530e-1e31-40d8-8c78-76a18b673c33
SamAccountName : WEB01$
SID : S-1-5-21-2989741381-570885089-3319121794-1107
UserPrincipalName :
Como você pode ver nos exemplos anteriores, o parâmetro Identity para Get-ADComputer só aceita um único valor quando fornecido por meio da entrada de parâmetros. No entanto, usando o pipeline, você pode enviar vários valores para o comando porque os valores são processados um de cada vez.
Para a
Um loop de for itera enquanto uma condição especificada é verdadeira. Eu não uso o loop de for com frequência, mas ele tem usos.
for ($i = 1; $i -lt 5; $i++) {
Write-Output "Sleeping for $i seconds"
Start-Sleep -Seconds $i
}
Sleeping for 1 seconds
Sleeping for 2 seconds
Sleeping for 3 seconds
Sleeping for 4 seconds
No exemplo anterior, o loop itera quatro vezes, começando com o número um e continuando enquanto a variável contador $i for menor que 5. Dorme por um total de 10 segundos.
Faz
Há dois loops de do diferentes no PowerShell: do until e do while.
do until executa-se enquanto a condição especificada é falsa.
O exemplo a seguir é um jogo de números que continua até que o valor que você adivinha seja igual ao mesmo número que o cmdlet Get-Random gerou.
$number = Get-Random -Minimum 1 -Maximum 10
do {
$guess = Read-Host -Prompt "What's your guess?"
if ($guess -lt $number) {
Write-Output 'Too low!'
} elseif ($guess -gt $number) {
Write-Output 'Too high!'
}
}
until ($guess -eq $number)
What's your guess?: 1
Too low!
What's your guess?: 2
Too low!
What's your guess?: 3
Do While é o contrário. É executado enquanto a condição especificada for avaliada como verdadeira.
$number = Get-Random -Minimum 1 -Maximum 10
do {
$guess = Read-Host -Prompt "What's your guess?"
if ($guess -lt $number) {
Write-Output 'Too low!'
} elseif ($guess -gt $number) {
Write-Output 'Too high!'
}
}
while ($guess -ne $number)
What's your guess?: 1
Too low!
What's your guess?: 2
Too low!
What's your guess?: 3
Too low!
What's your guess?: 4
Os mesmos resultados são obtidos com um loop Do While ao alterar a condição de teste para não igual.
do loops sempre são executados pelo menos uma vez porque a condição é avaliada no final do loop.
Enquanto
Como o loop do while, um loop while é executado desde que a condição especificada seja verdadeira. A diferença, no entanto, é que um loop while avalia a condição na parte superior do loop antes que qualquer código seja executado. Portanto, ele não é executado se a condição for avaliada como falsa.
O exemplo a seguir calcula o dia do Dia de Ação de Graças nos Estados Unidos. É sempre na quarta quinta-feira de novembro. O loop começa com o dia 22 de novembro e adiciona um dia, enquanto o dia da semana não é igual a quinta-feira. Se o dia 22 for uma quinta-feira, o loop não é executado.
$date = Get-Date -Date 'November 22'
while ($date.DayOfWeek -ne 'Thursday') {
$date = $date.AddDays(1)
}
Write-Output $date
Thursday, November 23, 2017 12:00:00 AM
interromper, continuar e retornar
A palavra-chave break é projetada para sair de um loop e geralmente é usada com a instrução switch. No exemplo a seguir, break faz com que o loop termine após a primeira iteração.
for ($i = 1; $i -lt 5; $i++) {
Write-Output "Sleeping for $i seconds"
Start-Sleep -Seconds $i
break
}
Sleeping for 1 seconds
A palavra-chave continue foi projetada para pular para a próxima iteração de um loop.
O exemplo a seguir gera os números 1, 2, 4 e 5. Ele pula o número 3 e continua com a próxima iteração do loop. Como break, continue sai do loop, exceto apenas para a iteração atual. A execução continua com a próxima iteração, em vez de sair completamente do loop e parar.
while ($i -lt 5) {
$i += 1
if ($i -eq 3) {
continue
}
Write-Output $i
}
1
2
4
5
A palavra-chave return foi projetada para sair do escopo existente.
Observe no exemplo a seguir que return produz o primeiro resultado e, em seguida, sai do loop.
$number = 1..10
foreach ($n in $number) {
if ($n -ge 4) {
return $n
}
}
4
Uma explicação mais completa da declaração de resultado pode ser encontrada em um dos artigos no meu blog: A palavra-chave return do PowerShell.
Resumo
Neste capítulo, você aprendeu sobre os diferentes tipos de loops que existem no PowerShell.
Avaliação
- Qual é a diferença entre o cmdlet
ForEach-Objecte a instruçãoforeach? - Qual é a principal vantagem de usar um loop
whileem vez de um loopdo whileoudo until? - Em que diferem as declarações
breakecontinue?
Referências
- ParaCada-Objeto
- about_Foreach
- sobre_Para
- about_Do
- about_While
- sobre_Pausa
- about_Continue
- sobre_Retorno
Próximos passos
No Capítulo 7, irá aprender a recuperar e trabalhar com informação do sistema utilizando o Windows Management Instrumentation (WMI) e o Common Information Model (CIM). Irá explorar os cmdlets modernos baseados em CIM, perceber como diferem dos comandos WMI antigos e usá-los para consultar sistemas locais e remotos de forma eficiente.