Come funzionano Powershell Foreach, While e altri loop

Come funzionano Powershell Foreach, While e altri loop

Un primo passo cruciale nell'apprendimento della programmazione è lavorare con i loop. Per fortuna, PowerShell continua a crescere con le tue capacità.





trova il mio telefono su windowsphone com

Puoi inquadrare i comandi esistenti che usi ogni giorno all'interno dei loop per risparmiare tempo e fatica. I tuoi script fanno il lavoro pesante mentre svolgi l'importante lavoro di leggere più articoli su MakeUseOf!





Cicli Powershell ForEach: la porta per la gestione avanzata dei dati

ForEach è l'alias per l'oggetto ForEach. (Un alias è semplicemente una scorciatoia per un comando in PowerShell.) Questo è un buon momento per parlare del modo in cui PowerShell gestisce i dati.





Come la maggior parte dei linguaggi di programmazione moderni, PowerShell è orientato agli oggetti. Tutto in PowerShell è un oggetto, il che significa che anche le variabili hanno proprietà e funzioni estese . Questa proprietà è il motivo per cui puoi impostare le tue ricerche su una variabile e ottenere un array dei risultati.

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

In alcune lingue, l'elaborazione di questo array sarebbe un processo a più fasi. In primo luogo, ottenendo la lunghezza e poi contando ogni passo.



In PowerShell, si scorre l'array e si esegue l'azione su ciascuno di essi utilizzando ForEach. Ciò consente di risparmiare diverse righe di codice, il che è utile se si dispone di uno script più lungo. Ad esempio, il seguente è un piccolo script che utilizzerebbe un paio di cicli Powershell ForEach. Crea un archivio ZIP di tutti i tuoi file che non hai aperto da 30 giorni.

Creazione di un sistema di archiviazione file utilizzando i cicli ForEach

Rompiamo i passaggi. Usate Get-ChildItem per ottenere tutti i file nella cartella Documenti. La variabile d'ambiente $env:PROFILOUTENTE esegue lo script utilizzando il profilo corrente. Questa variabile è più portabile di un percorso codificato. I risultati di tale ricerca sono assegnati alla variabile $ MyDocs . Quindi creiamo il nostro ciclo ForEach facendolo passare attraverso ciascuno $Doc in $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
}

All'interno del ciclo, controlliamo per vedere se ogni file è UltimoAccessTime la proprietà è più vecchia di 30 giorni. Lo otteniamo con il Get-Date cmdlet e utilizzando il AggiungiGiorni funzione con trenta negativo. Se lo è, aggiungiamo il file a $myOldDocs Vettore. Al termine dell'ordinamento dei file, prendiamo il nostro array completato e creiamo un file zip. Questo processo è un po' più complicato in quanto implica l'invocazione di un po' di .NET. Non preoccuparti se non capisci bene: puoi rubare il codice da questo documento della guida TechNet .

Per analizzare ciò che sta accadendo qui: sposteremo tutti i nostri vecchi file in una nuova directory denominata per la data odierna per più di 30 giorni. Una volta creata la cartella, dobbiamo creare l'archivio ZIP con lo stesso nome. Verificheremo per assicurarci che l'archivio sia riuscito e che il file .ZIP sia presente, quindi elimineremo la nuova cartella. Imposta questo come un'attività pianificata da eseguire una volta al mese. Risparmierai un po' di spazio e manterrai pulita la cartella Documenti.





While e Do While: loop in condizione

Se vuoi eseguire un ciclo solo quando viene soddisfatta una particolare condizione, usi un ciclo While. Se stai utilizzando una variabile per tenere traccia del conteggio, impostala per prima.

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

Il problema è che se non stai usando un contatore, potresti volere che il tuo codice venga eseguito almeno una volta anche se il test è vero. Questo è il caso dello script di esempio di seguito. Quindi, in questi casi, vuoi usare un ciclo Do-While . La sintassi è leggermente diversa.

do{
Your Steps
}while(Conditional Statement)

L'utilizzo di questi non è così ovvio per un programmatore alle prime armi. Facendo il tipico scripting quotidiano, potresti non incontrarli così spesso. Dove sono particolarmente utili è creare un timer improvvisato per testare il successo di un processo.

puoi vedere chi ti si è iscritto su youtube?

Creeremo uno script rapido per riavviare una macchina remota e avvisare se non si ripresenta entro 15 minuti. Questo scenario presuppone che si tratti di un server domestico o di un'altra macchina che non si riavvia molto spesso. Sentiti libero di regolare l'ora se il tuo computer in genere si avvia più velocemente.

Riavvia e verifica: utilizzo di un ciclo Do-While

Questo script è un po' più semplice. Per prima cosa, usi il Riavvia il computer comando per riavviare la macchina remota. (Abbiamo usato un IP fittizio qui per i comandi di riavvio, assicurati di sovrascriverlo con il DNS/IP del tuo computer). Quindi creare la variabile contatore, io e impostalo su 0. Successivamente, hai il tuo ciclo Do con Start-Sleep che interrompe lo script per 300 secondi (cinque minuti). Un secondo comando aggiunge uno al contatore.

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'
}

Poi abbiamo i nostri criteri While. Utilizziamo un test Or per garantire che un errore generi un avviso. L'alternativa è lo script che si ripete all'infinito in attesa della macchina remota. Per controllare la macchina, stiamo usando il Collegamento di prova cmdlet. Per semplicità, questo è Ping per PowerShell. Aggiungiamo il parametro -Tranquillo che lo costringe a restituire True o False anziché i risultati dei pacchetti. La seconda parte dell'istruzione Or controlla se il contatore è maggiore di tre.

Una volta completato il ciclo, vogliamo creare l'output. Ciò significa che dobbiamo controllare il nostro contatore. Questa è una rapida dichiarazione if/else. Se è maggiore di tre, lo script indica che la macchina remota non risponde. In caso contrario, viene visualizzato che il riavvio è andato a buon fine.

Altri loop

Esistono altri due tipi di loop disponibili in PowerShell. Sono in qualche modo correlati ai due cicli precedenti, semplicemente non sono così comunemente usati. Un ciclo For funziona in modo simile all'esempio While. Impostare tutti i criteri nella valutazione, quindi impostare i cmdlet.

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

I cicli Do Until sono come i cicli Do While, è sufficiente modificare l'istruzione While in Until. Nello script di esempio, sarebbe lo stesso per quanto riguarda il comportamento. È una scelta di stile, ma il Do While è più versatile in altre situazioni. Quindi, se ne ricordi solo uno, Do While è più utile.

PowerShell ha anche un aiuto per ciascuno di questi loop. Puoi ottenere l'aiuto aggiungendo di prima del nome del ciclo in Get-Help. Puoi quindi vedere esempi e altri suggerimenti per ogni tipo. Questi dovrebbero essere utili se rimani bloccato.

Continuando a crescere con te

A questo punto, hai la maggior parte delle competenze per iniziare a creare script robusti. Che si tratti di automatizzare il tuo impianto di casa o di risparmiare tempo al lavoro, i loop aiutano i tuoi script a fare di più. La combinazione di questi cicli con la gestione degli errori sposta lo scripting oltre le basi. Questo apre le porte a linguaggi più avanzati.

Che cos'è uno script PowerShell intelligente che hai creato usando i loop? Condividilo con noi nei commenti.

Condividere Condividere Tweet E-mail Elimina questi file e cartelle di Windows per liberare spazio su disco

Hai bisogno di liberare spazio su disco sul tuo computer Windows? Ecco i file e le cartelle di Windows che possono essere eliminati in sicurezza per liberare spazio su disco.

Leggi Avanti
Argomenti correlati
  • Programmazione
  • PowerShell
  • Scripting
Circa l'autore Michael McConnell(44 articoli pubblicati)

Michael non ha usato un Mac quando erano condannati, ma può programmare in Applescript. È laureato in Informatica e Inglese; è da un po' che scrive di Mac, iOS e videogiochi; ed è stato una scimmia IT diurna per oltre un decennio, specializzato in scripting e virtualizzazione.

trova tutti gli account collegati al mio indirizzo email gratis
Altro da Michael McConnell

Iscriviti alla nostra Newsletter

Iscriviti alla nostra newsletter per suggerimenti tecnici, recensioni, ebook gratuiti e offerte esclusive!

Clicca qui per iscriverti