Ricerca…
introduzione
Un ciclo è una sequenza di istruzioni che viene ripetuta continuamente finché non viene raggiunta una determinata condizione. Essere in grado di far eseguire ripetutamente il proprio codice a un blocco di codice è uno dei compiti più semplici ma utili nella programmazione. Un ciclo consente di scrivere un'istruzione molto semplice per produrre un risultato significativamente maggiore semplicemente mediante ripetizione. Se la condizione è stata raggiunta, l'istruzione successiva "passa attraverso" alla successiva istruzione sequenziale o rami all'esterno del ciclo.
Sintassi
for (<Initialization>; <Condition>; <Repetition>) {<Script_Block>}
<Collezione> | Foreach-Object {<Script_Block_with _ $ __ as_current_item>}
foreach (<Item> in <Collection>) {<Script_Block>}
while (<Condition>) {<Script_Block>}
do {<Script_Block>} while (<Condition>)
fare {<Script_Block>} fino a (<Condizione>)
<Collection> .foreach ({<Script_Block_with _ $ __ as_current_item>})
Osservazioni
Per ciascuno
Esistono diversi modi per eseguire un ciclo foreach in PowerShell e presentano tutti i loro vantaggi e svantaggi:
Soluzione | vantaggi | svantaggi |
---|---|---|
Dichiarazione Foreach | Più veloce. Funziona al meglio con le raccolte statiche (memorizzate in una variabile). | Nessun input o output della pipeline |
Metodo ForEach () | La stessa sintassi di scriptblock di Foreach-Object , ma più veloce. Funziona al meglio con le raccolte statiche (memorizzate in una variabile). Supporta l'output della pipeline. | Nessun supporto per l'input della pipeline. Richiede PowerShell 4.0 o versioni successive |
Foreach-Object (cmdlet) | Supporta input e output della pipeline. Supporta i blocchi di script di inizio e fine per l'inizializzazione e la chiusura delle connessioni ecc. Soluzione più flessibile. | più lento |
Prestazione
$foreach = Measure-Command { foreach ($i in (1..1000000)) { $i * $i } }
$foreachmethod = Measure-Command { (1..1000000).ForEach{ $_ * $_ } }
$foreachobject = Measure-Command { (1..1000000) | ForEach-Object { $_ * $_ } }
"Foreach: $($foreach.TotalSeconds)"
"Foreach method: $($foreachmethod.TotalSeconds)"
"ForEach-Object: $($foreachobject.TotalSeconds)"
Example output:
Foreach: 1.9039875
Foreach method: 4.7559563
ForEach-Object: 10.7543821
Mentre Foreach-Object
è il più lento, il supporto della pipeline potrebbe essere utile in quanto consente di elaborare gli elementi non appena arrivano (durante la lettura di un file, la ricezione di dati, ecc.). Questo può essere molto utile quando si lavora con big data e poca memoria dato che non è necessario caricare tutti i dati nella memoria prima dell'elaborazione.
Per
for($i = 0; $i -le 5; $i++){
"$i"
}
Un tipico utilizzo del ciclo for è quello di operare su un sottoinsieme dei valori di un array. Nella maggior parte dei casi, se si desidera ripetere tutti i valori in una matrice, considerare l'uso di un'istruzione foreach.
Per ciascuno
ForEach
ha due diversi significati in PowerShell. Uno è una parola chiave e l'altro è un alias per il cmdlet ForEach-Object . Il primo è descritto qui.
Questo esempio dimostra come stampare tutti gli elementi in una matrice sull'host della console:
$Names = @('Amy', 'Bob', 'Celine', 'David')
ForEach ($Name in $Names)
{
Write-Host "Hi, my name is $Name!"
}
Questo esempio dimostra come catturare l'output di un ciclo ForEach:
$Numbers = ForEach ($Number in 1..20) {
$Number # Alternatively, Write-Output $Number
}
Come l'ultimo esempio, questo esempio, invece, dimostra la creazione di un array prima di memorizzare il ciclo:
$Numbers = @()
ForEach ($Number in 1..20)
{
$Numbers += $Number
}
Mentre
Un ciclo while valuterà una condizione e se true eseguirà un'azione. Finché la condizione diventa vera, l'azione continuerà ad essere eseguita.
while(condition){
code_block
}
Nell'esempio seguente viene creato un ciclo che eseguirà il conto alla rovescia da 10 a 0
$i = 10
while($i -ge 0){
$i
$i--
}
A differenza del ciclo Do
-While, la condizione viene valutata prima della prima esecuzione dell'azione. L'azione non verrà eseguita se la condizione iniziale è falsa.
Nota: durante la valutazione della condizione, PowerShell considererà true l'esistenza di un oggetto restituito. Questo può essere utilizzato in diversi modi, ma di seguito è riportato un esempio per monitorare un processo. Questo esempio genererà un processo di blocco note e quindi interromperà la shell corrente finché il processo è in esecuzione. Quando si chiude manualmente l'istanza del blocco note, la condizione while non riuscirà e il ciclo si interromperà.
Start-Process notepad.exe
while(Get-Process notepad -ErrorAction SilentlyContinue){
Start-Sleep -Milliseconds 500
}
ForEach-Object
Il cmdlet ForEach-Object
funziona in modo simile all'istruzione foreach
, ma prende il suo input dalla pipeline.
Utilizzo di base
$object | ForEach-Object {
code_block
}
Esempio:
$names = @("Any","Bob","Celine","David")
$names | ForEach-Object {
"Hi, my name is $_!"
}
Foreach-Object
ha due alias predefiniti, foreach
e %
(sintassi abbreviata). Il più comune è %
perché foreach
può essere confuso con l' istruzione foreach . Esempi:
$names | % {
"Hi, my name is $_!"
}
$names | foreach {
"Hi, my name is $_!"
}
Utilizzo avanzato
Foreach-Object
si distingue dalle soluzioni foreach
alternative perché è un cmdlet che significa che è progettato per utilizzare la pipeline. Per questo motivo, supporta tre scriptblock proprio come un cmdlet o una funzione avanzata:
- Inizia : eseguito una volta prima di scorrere gli elementi che arrivano dalla pipeline. Solitamente utilizzato per creare funzioni da utilizzare nel loop, creando variabili, aprendo connessioni (database, web +) ecc.
- Processo : eseguito una volta per elemento arrivato dalla pipeline. "Normal" foreach codeblock. Questo è il default usato negli esempi sopra quando il parametro non è specificato.
- Fine : eseguito una volta dopo l'elaborazione di tutti gli elementi. Solitamente utilizzato per chiudere le connessioni, generare un report, ecc.
Esempio:
"Any","Bob","Celine","David" | ForEach-Object -Begin {
$results = @()
} -Process {
#Create and store message
$results += "Hi, my name is $_!"
} -End {
#Count messages and output
Write-Host "Total messages: $($results.Count)"
$results
}
Fare
I loop di do sono utili quando si desidera eseguire sempre un codice di blocco almeno una volta. Un Do-loop valuterà la condizione dopo aver eseguito il codice, diversamente da un ciclo while che lo esegue prima di eseguire il codice.
Puoi usare loop di do in due modi:
Loop mentre la condizione è vera:
Do { code_block } while (condition)
Loop fino a quando la condizione è vera, in altre parole, loop mentre la condizione è falsa:
Do { code_block } until (condition)
Esempi reali:
$i = 0
Do {
$i++
"Number $i"
} while ($i -ne 3)
Do {
$i++
"Number $i"
} until ($i -eq 3)
Do-While e Do-Until sono loop antonymous. Se il codice è all'interno dello stesso, la condizione verrà invertita. L'esempio sopra illustra questo comportamento.
Metodo ForEach ()
Invece del cmdlet ForEach-Object
, qui è anche la possibilità di utilizzare un metodo ForEach
direttamente su array di oggetti come questo
(1..10).ForEach({$_ * $_})
oppure - se lo si desidera - le parentesi intorno al blocco di script possono essere omesse
(1..10).ForEach{$_ * $_}
Entrambe genereranno l'output di seguito
1
4
9
16
25
36
49
64
81
100
Continua
L'operatore Continue
lavora nei cicli For
, ForEach
, While
e Do
Salta l'iterazione corrente del loop, saltando in cima al ciclo più interno.
$i =0
while ($i -lt 20) {
$i++
if ($i -eq 7) { continue }
Write-Host $I
}
Quanto sopra uscirà da 1 a 20 alla console ma mancherà il numero 7.
Nota : quando si utilizza un loop di pipeline, è necessario utilizzare return
anziché Continue
.
Rompere
L'operatore di break
uscirà immediatamente da un loop di programma. Può essere utilizzato nei cicli For
, ForEach
, While
e Do
o in un'istruzione Switch
.
$i = 0
while ($i -lt 15) {
$i++
if ($i -eq 7) {break}
Write-Host $i
}
Quanto sopra conterà fino a 15 ma si fermerà non appena 7 sarà raggiunto.
Nota : quando si utilizza un loop di pipeline, break
si comporterà come continue
. Per simulare l' break
del ciclo della pipeline, è necessario incorporare logica aggiuntiva, cmdlet, ecc. È più semplice attaccare con loop non di pipeline se è necessario utilizzare l' break
.
Rompere etichette
Break può anche chiamare un'etichetta posizionata davanti all'istanza di un ciclo:
$i = 0
:mainLoop While ($i -lt 15) {
Write-Host $i -ForegroundColor 'Cyan'
$j = 0
While ($j -lt 15) {
Write-Host $j -ForegroundColor 'Magenta'
$k = $i*$j
Write-Host $k -ForegroundColor 'Green'
if ($k -gt 100) {
break mainLoop
}
$j++
}
$i++
}
Nota: questo codice incrementerà $i
a 8
e $j
a 13
che causerà $k
uguale a 104
. Poiché $k
supera 100
, il codice uscirà da entrambi i cicli.