Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Skriptování
Když přecházíte z psaní one-linerů PowerShellu na psaní skriptů, zní to složitější, než je. Skript není nic víc než stejné nebo podobné příkazy, které spouštíte interaktivně v konzole PowerShellu, s výjimkou toho, že je uložíte jako soubor .ps1. Existují některé skriptovací konstrukce, které můžete použít, například smyčku foreach místo rutiny ForEach-Object. Rozdíly můžou být pro začátečníky matoucí, když zvažujete, že foreach je klíčové slovo jazyka i alias pro rutinu ForEach-Object.
Smyčkování
Jedním z nejlepších aspektů PowerShellu je jeho škálovatelnost. Jakmile se naučíte, jak provést úlohu pro jednu položku, použití stejné akce na stovky položek je téměř stejně jednoduché. Projděte položky pomocí jednoho z různých typů smyček v PowerShellu.
ForEach-Object
ForEach-Object je cmdlet pro iteraci položek v datovém toku, jako jsou například one-linery PowerShellu.
ForEach-Object streamuje objekty prostřednictvím pipeline.
Ačkoli parametr modulu Get-Command přijímá více řetězcových hodnot, přijímá je pouze prostřednictvím názvu vlastnosti z pipeline. Pokud chcete v následujícím scénáři převést dvě řetězcové hodnoty k Get-Command pro použití s parametrem Module, musíte použít rutinu 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
V předchozím příkladu je $_ aktuálním objektem. Počínaje PowerShellem verze 3.0 je možné místo $PSItempoužít $_. Většina zkušených uživatelů PowerShellu dává přednost použití $_, protože je zpětně kompatibilní a vyžaduje méně psaní.
Při použití klíčového slova foreach musíte položky před iterací uložit do paměti, což může být obtížné, pokud nevíte, s kolika položkami pracujete.
$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 :
Často je smyčka, jako foreach nebo ForEach-Object, nutná. V opačném případě se zobrazí chybová zpráva.
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
Jindy můžete získat stejné výsledky a zároveň odstranit smyčku. Informace o možnostech najdete v dokumentaci ke cmdletu.
'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 :
Jak vidíte v předchozích příkladech, parametr Identity pro Get-ADComputer přijímá pouze jednu hodnotu, pokud je zadaný prostřednictvím vstupu parametru. Pomocí kanálu však můžete do příkazu odeslat více hodnot, protože se hodnoty zpracovávají po jednom.
Pro
Smyčka for iteruje, když je zadaná podmínka pravdivá. Smyčku for nepoužívám často, ale má své využití.
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
V předchozím příkladu smyčka iteruje čtyřikrát tím, že začne číslem jedna a pokračuje tak dlouho, dokud proměnná čítače $i je menší než 5. Spí celkem 10 sekund.
Udělat
V PowerShellu existují dvě různé smyčky do: do until a do while.
do until se spustí, když je zadaná podmínka nepravdivá.
Následující příklad je hra s čísly, která pokračuje, dokud hodnota, kterou hádáte, se rovná stejnému číslu, jaké Get-Random rutina vygenerovala.
$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 je opak. Běží, dokud se zadaná podmínka vyhodnotí jako pravda.
$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
Stejných výsledků je dosaženo pomocí smyčky Do While změnou testovací podmínky na nerovná se.
do smyčky se vždy spustí alespoň jednou, protože podmínka se vyhodnocuje na konci smyčky.
Zatímco
Podobně jako u smyčky do while běží smyčka while, dokud je zadaná podmínka pravdivá. Rozdíl je ale v tom, že smyčka while vyhodnocuje podmínku v horní části smyčky před spuštěním jakéhokoli kódu. Proto se nespustí, pokud je podmínka vyhodnocena jako nepravdivá.
Následující příklad vypočítá, na který den připadá Den díkůvzdání ve Spojených státech. Vždy je to čtvrtek v listopadu. Smyčka začíná 22. dnem listopadu a přidává den, zatímco den v týdnu se nerovná čtvrtek. Pokud je 22. den čtvrtek, smyčka se vůbec nespustí.
$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
break, continue, a return
Klíčové slovo break je určeno k ukončení smyčky a často se používá s příkazem switch. V následujícím příkladu break způsobí ukončení smyčky po první iteraci.
for ($i = 1; $i -lt 5; $i++) {
Write-Output "Sleeping for $i seconds"
Start-Sleep -Seconds $i
break
}
Sleeping for 1 seconds
Klíčové slovo continue je navržené tak, aby přeskočilo na další iteraci smyčky.
Následující příklad vypíše čísla 1, 2, 4 a 5. Přeskočí číslo 3 a pokračuje další iterací smyčky. Stejně jako break, continue přeruší smyčku pouze pro aktuální iteraci. Provádění pokračuje s další iterací místo toho, abyste úplně přerušovali smyčku a zastavili se.
while ($i -lt 5) {
$i += 1
if ($i -eq 3) {
continue
}
Write-Output $i
}
1
2
4
5
Klíčové slovo return je určené k opuštění existujícího oboru.
Všimněte si v následujícím příkladu, že return zobrazí první výsledek a následně ukončí smyčku.
$number = 1..10
foreach ($n in $number) {
if ($n -ge 4) {
return $n
}
}
4
Podrobnější vysvětlení výsledkového prohlášení najdete v jednom z mých blogových článků: klíčové slovo return v PowerShell.
Shrnutí
V této kapitole jste se dozvěděli o různých typech smyček, které existují v PowerShellu.
Přezkoumání
- Jaký je rozdíl mezi cmdletem
ForEach-Objecta příkazemforeach? - Jaká je hlavní výhodou použití smyčky
whilemísto smyčkydo whilenebodo until? - Jak se liší příkazy
breakacontinue?
Odkazy
Další kroky
V kapitole 7 se dozvíte, jak načíst a pracovat se systémovými informacemi pomocí rozhraní WMI (Windows Management Instrumentation) a modelu CIM (Common Information Model). Prozkoumáte moderní rutiny založené na CIM, pochopíte, jak se liší od starších příkazů rozhraní WMI, a použijete je k efektivnímu dotazování místních a vzdálených systémů.