ForEach-Object
Esegue un'operazione su ogni elemento in una raccolta di oggetti di input.
Sintassi
ScriptBlockSet (Impostazione predefinita)
ForEach-Object
[-Process] <ScriptBlock[]>
[-InputObject <PSObject>]
[-Begin <ScriptBlock>]
[-End <ScriptBlock>]
[-RemainingScripts <ScriptBlock[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
PropertyAndMethodSet
ForEach-Object
[-MemberName] <String>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Descrizione
Il cmdlet ForEach-Object esegue un'operazione su ogni elemento in un insieme di oggetti di input. Gli oggetti di input possono essere inviati tramite pipe al cmdlet o specificati utilizzando il parametro InputObject .
A partire da Windows PowerShell 3.0, esistono due modi diversi per costruire un comando ForEach-Object .
Blocco di script. È possibile usare un blocco di script per specificare l'operazione. All'interno del blocco di script usare la variabile
$_per rappresentare l'oggetto corrente. Il blocco di script è il valore del parametro Process . Il blocco di script può contenere qualsiasi script di PowerShell.Ad esempio, il comando seguente ottiene il valore della proprietà ProcessName di ogni processo nel computer.
Get-Process | ForEach-Object {$_.ProcessName}Istruzione operativa. È anche possibile scrivere un'istruzione operativa, che è molto più simile al linguaggio naturale. È possibile utilizzare l'istruzione operation per specificare un valore di proprietà o chiamare un metodo. Le istruzioni operative sono state introdotte in Windows PowerShell 3.0.
Ad esempio, il comando seguente ottiene anche il valore della proprietà ProcessName di ogni processo nel computer.
Get-Process | ForEach-Object ProcessNameQuando si utilizza il formato del blocco di script, oltre a utilizzare il blocco di script che descrive le operazioni eseguite su ogni oggetto di input, è possibile fornire due blocchi di script aggiuntivi. Il blocco di script Begin, che è il valore del parametro Begin , viene eseguito prima che questo cmdlet elabori il primo oggetto di input. Il blocco di script End, che è il valore del parametro End , viene eseguito dopo che questo cmdlet ha elaborato l'ultimo oggetto di input.
Esempio
Esempio 1: Dividere numeri interi in una matrice
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Questo comando accetta un array di tre numeri interi e divide ciascuno di essi per 1024.
Esempio 2: Ottenere la lunghezza di tutti i file in una directory
Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Questo comando ottiene i file e le directory nella directory $pshome di installazione di PowerShell e li passa al ForEach-Object cmdlet.
Se l'oggetto non è una directory, il blocco di script ottiene il nome del file, divide il valore della relativa proprietà Length per 1024 e aggiunge uno spazio (" ") per separarlo dalla voce successiva.
Il cmdlet usa la proprietà PSISContainer per determinare se un oggetto è una directory.
Esempio 3: Operare sugli eventi di sistema più recenti
$Events = Get-EventLog -LogName System -Newest 1000
$events | ForEach-Object -Begin {Get-Date} -Process {Out-File -FilePath Events.txt -Append -InputObject $_.Message} -End {Get-Date}
Questo comando ottiene i 1000 eventi più recenti dal registro eventi di sistema e li memorizza nella $Events variabile.
Gli eventi vengono quindi reindirizzati al ForEach-Object cmdlet.
Il parametro Begin visualizza la data e l'ora correnti.
Successivamente, il parametro Process utilizza il Out-File cmdlet per creare un file di testo denominato events.txt e archivia la proprietà message di ogni evento in tale file.
Infine, il parametro End viene utilizzato per visualizzare la data e l'ora al termine di tutta l'elaborazione.
Esempio 4: Modificare il valore di una chiave del Registro di sistema
Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}
Questo comando modifica il valore della voce del Registro di sistema RemotePath in tutte le sottochiavi nella chiave HKCU:\Network in testo maiuscolo. È possibile utilizzare questo formato per modificare il formato o il contenuto di un valore di voce del Registro di sistema.
Ogni sottochiave nella chiave di rete rappresenta un'unità di rete mappata che si riconnetterà all'accesso. La voce RemotePath contiene il percorso UNC dell'unità connessa. Ad esempio, se si esegue il mapping dell'unità E: a \\Server\Share, sarà presente una sottochiave E di HKCU:\Network e il valore della voce del Registro di sistema RemotePath nella sottochiave E sarà \\Server\Share.
Il comando usa il Get-ItemProperty cmdlet per ottenere tutte le sottochiavi della chiave di rete e il Set-ItemProperty cmdlet per modificare il valore della voce del Registro di sistema RemotePath in ogni chiave.
Nel comando Set-ItemProperty il percorso è il valore della proprietà PSPath della chiave del Registro di sistema.
Si tratta di una proprietà dell'oggetto Microsoft .NET Framework che rappresenta la chiave del Registro di sistema, non una voce del Registro di sistema.
Il comando utilizza il metodo ToUpper() del valore RemotePath , che è una stringa (REG_SZ).
Poiché Set-ItemProperty modifica la proprietà di ogni chiave, per accedere alla proprietà è necessario il cmdlet ForEach-Object.
Esempio 5: Utilizzare la variabile automatica $Null
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
In questo esempio viene illustrato l'effetto del piping della variabile automatica $Null al cmdlet ForEach-Object.
Poiché PowerShell considera null come un segnaposto esplicito, il ForEach-Object cmdlet genera un valore per $Null, esattamente come avviene per altri oggetti che vengono reindirizzati ad esso.
Per ulteriori informazioni sulla $Null variabile automatica, vedere about_Automatic_Variables.
Esempio 6: Ottenere i valori delle proprietà
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
Questi comandi ottengono il valore della proprietà Path di tutti i moduli di PowerShell installati. Usano il parametro MemberName per specificare la proprietà Path dei moduli.
Il secondo comando equivale al primo.
Utilizza l'alias Foreach del ForEach-Object cmdlet e omette il nome del parametro MemberName , che è facoltativo.
Il ForEach-Object cmdlet è molto utile per ottenere i valori delle proprietà, perché ottiene il valore senza modificare il tipo, a differenza dei cmdlet Format o del Select-Object cmdlet, che modificano il tipo di valore della proprietà.
Esempio 7: Suddividere i nomi dei moduli in nomi di componenti
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object {$_.Split(".")}
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object -MemberName Split -ArgumentList "."
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | Foreach Split "."
Microsoft
PowerShell
Core
Microsoft
PowerShell
Host
Questi comandi suddividono due nomi di moduli separati da punti nei nomi dei componenti. I comandi chiamano il metodo Split di stringhe. I tre comandi usano una sintassi diversa, ma sono equivalenti e intercambiabili.
Il primo comando usa la sintassi tradizionale, che include un blocco di script e l'operatore oggetto corrente $_.
Usa la sintassi del punto per specificare il metodo e le parentesi per racchiudere l'argomento delimitatore.
Il secondo comando utilizza il parametro MemberName per specificare il metodo Split e il parametro ArgumentName per identificare il punto (".") come delimitatore di divisione.
Il terzo comando utilizza l'alias Foreach del cmdlet Foreach-Object e omette i nomi dei parametri MemberName e ArgumentList , che sono facoltativi.
L'output di questi tre comandi, mostrato di seguito, è identico.
La divisione è solo uno dei tanti metodi utili per le stringhe.
Per visualizzare tutte le proprietà e i metodi delle stringhe, reindirizzare una stringa al Get-Member cmdlet.
Parametri
-ArgumentList
Specifica una matrice di argomenti per una chiamata al metodo.
Questo parametro è stato introdotto in Windows PowerShell 3.0.
Proprietà dei parametri
| Tipo: | Object[] |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
| Alias: | Argomenti |
Set di parametri
PropertyAndMethodSet
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-Begin
Specifica un blocco di script eseguito prima dell'elaborazione di qualsiasi oggetto di input da parte di questo cmdlet.
Proprietà dei parametri
| Tipo: | ScriptBlock |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
ScriptBlockSet
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-Confirm
Richiede conferma prima di eseguire il cmdlet.
Proprietà dei parametri
| Tipo: | SwitchParameter |
| Valore predefinito: | False |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
| Alias: | cfr |
Set di parametri
(All)
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-End
Specifica un blocco di script eseguito dopo che questo cmdlet elabora tutti gli oggetti di input.
Proprietà dei parametri
| Tipo: | ScriptBlock |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
ScriptBlockSet
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-InputObject
Specifica gli oggetti di input.
ForEach-Object esegue l'istruzione del blocco di script o dell'operazione su ogni oggetto di input.
Immettere una variabile contenente gli oggetti oppure digitare un comando o un'espressione che ottiene gli oggetti .
Quando si usa il parametro InputObject con ForEach-Object, invece di eseguire il piping dei risultati del comando a ForEach-Object, il valore InputObject viene considerato come un singolo oggetto.
Questo vale anche se il valore è un insieme che è il risultato di un comando, ad esempio -InputObject (Get-Process).
Poiché InputObject non è in grado di restituire singole proprietà da una matrice o da un insieme di oggetti, è consigliabile utilizzare ForEach-Object nella pipeline se si utilizzano ForEach-Object operazioni su un insieme di oggetti per gli oggetti che hanno valori specifici nelle proprietà definite.
Proprietà dei parametri
| Tipo: | PSObject |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
(All)
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | True |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-MemberName
Specifica la proprietà da ottenere o il metodo da chiamare.
I caratteri jolly sono consentiti, ma funzionano solo se la stringa risultante viene risolta in un valore univoco.
Se, ad esempio, si esegue Get-Process | ForEach -MemberName *Namee esistono più membri con un nome che contiene la stringa Name, ad esempio le proprietà ProcessName e Name , il comando non riesce.
Questo parametro è stato introdotto in Windows PowerShell 3.0.
Proprietà dei parametri
| Tipo: | String |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | True |
| DontShow: | False |
Set di parametri
PropertyAndMethodSet
| Posizione: | 0 |
| Obbligatorio: | True |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-Process
Specifica l'operazione che viene eseguita su ogni oggetto di input. Immettere un blocco di script che descrive l'operazione.
Proprietà dei parametri
| Tipo: | ScriptBlock[] |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
ScriptBlockSet
| Posizione: | 0 |
| Obbligatorio: | True |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-RemainingScripts
Specifica tutti i blocchi di script che non vengono utilizzati dal parametro Process .
Questo parametro è stato introdotto in Windows PowerShell 3.0.
Proprietà dei parametri
| Tipo: | ScriptBlock[] |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
ScriptBlockSet
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-WhatIf
Mostra gli effetti dell'esecuzione del cmdlet. Il cmdlet non viene eseguito.
Proprietà dei parametri
| Tipo: | SwitchParameter |
| Valore predefinito: | False |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
| Alias: | Wi |
Set di parametri
(All)
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
CommonParameters
Questo cmdlet supporta i parametri comuni: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction e -WarningVariable. Per altre informazioni, vedi about_CommonParameters.
Input
PSObject
È possibile passare qualsiasi oggetto come input a questo cmdlet.
Output
PSObject
Questo cmdlet restituisce oggetti determinati dall'input.
Note
- Il cmdlet
ForEach-Objectfunziona in modo analogo all'istruzione Foreach, ad eccezione del fatto che non è possibile inviare tramite pipe l'input a un'istruzione Foreach. Per altre informazioni sull'istruzione Foreach, vedere about_Foreach. - A partire da PowerShell 4.0, sono stati aggiunti metodi
WhereeForEachper l'uso con le raccolte. - Altre informazioni su questi nuovi metodi sono disponibili qui about_arrays