Condividi tramite


Informazioni sulle matrici

Descrizione breve

Descrive le matrici, che sono strutture di dati progettate per archiviare raccolte di elementi.

Descrizione lunga

Una matrice è una struttura di dati progettata per archiviare una raccolta di elementi. Gli elementi possono essere lo stesso tipo o tipi diversi.

A partire da Windows PowerShell 3.0, una raccolta di zero o un oggetto ha alcune proprietà delle matrici.

Creazione e inizializzazione di una matrice

Per creare e inizializzare una matrice, assegnare più valori a una variabile. I valori archiviati nella matrice sono delimitati da una virgola e separati dal nome della variabile dall'operatore di assegnazione (=).

Ad esempio, per creare una matrice denominata $A contenente i sette valori numerici (int) di 22, 5, 5, 10, 8, 12, 9 e 80, digitare:

$A = 22,5,10,8,12,9,80

È anche possibile creare e inizializzare una matrice usando l'operatore range (..). Ad esempio, per creare e inizializzare una matrice denominata "$B" contenente i valori da 5 a 8, digitare:

$B = 5..8

Di conseguenza, $B contiene quattro valori: 5, 6, 7 e 8.

Quando non viene specificato alcun tipo di dati, PowerShell crea ogni matrice come matrice di oggetti (tipo: System.Object[]). Per determinare il tipo di dati di una matrice, usare il metodo GetType(). Ad esempio, per determinare il tipo di dati della matrice $a, digitare:

$a.GetType()

Per creare una matrice fortemente tipizzata, ovvero una matrice che può contenere solo valori di un tipo specifico, eseguire il cast della variabile come tipo di matrice, ad esempio string[], long[]o int32[]. Per eseguire il cast di una matrice, precedere il nome della variabile con un tipo di matrice racchiuso tra parentesi quadre. Ad esempio, per creare una matrice integer a 32 bit denominata $ia contenente quattro interi (1500, 2230, 3350 e 4000), tipo:

[int32[]]$ia = 1500,2230,3350,4000

Di conseguenza, la matrice di $ia può contenere solo interi.

È possibile creare matrici che vengono eseguite in cast in qualsiasi tipo supportato in Microsoft .NET Framework. Ad esempio, gli oggetti recuperati Get-Process per rappresentare i processi sono del tipo System.Diagnostics.Process. Per creare una matrice fortemente tipizzata di oggetti di processo, immettere il comando seguente:

[Diagnostics.Process[]]$zz = Get-Process

Operatore dell'espressione secondaria della matrice

L'operatore dell'espressione secondaria della matrice crea una matrice, anche se contiene zero o un oggetto.

La sintassi dell'operatore matrice è la seguente:

@( ... )

È possibile usare l'operatore matrice per creare una matrice di zero o un oggetto. Ad esempio:

PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0

L'operatore di matrice è particolarmente utile negli script quando si ottengono oggetti, ma non si conosce il numero di oggetti che si otterranno. Ad esempio:

$p = @(Get-Process Notepad)

Per altre informazioni sull'operatore dell'espressione secondaria della matrice, vedere about_Operators.

Accesso e uso di elementi di matrice

Lettura di una matrice

È possibile fare riferimento a una matrice usando il nome della variabile. Per visualizzare tutti gli elementi della matrice, digitare il nome della matrice. Ad esempio, presupponendo $a che sia una matrice contenente interi 0, 1, 2, fino a 9; digitando:

$a
0
1
2
3
4
5
6
7
8
9

È possibile fare riferimento agli elementi in una matrice usando un indice, a partire dalla posizione 0. Racchiudere il numero di indice tra parentesi quadre. Ad esempio, per visualizzare il primo elemento nella $a matrice, digitare:

$a[0]
0

Per visualizzare il terzo elemento nella $a matrice, digitare:

$a[2]
2

È possibile recuperare parte della matrice usando un operatore di intervallo per l'indice. Ad esempio, per recuperare il secondo a quinto elementi della matrice, digitare:

$a[1..4]
1
2
3
4

Numero di numeri negativi dalla fine della matrice. Ad esempio, "-1" fa riferimento all'ultimo elemento della matrice. Per visualizzare gli ultimi tre elementi della matrice, nell'ordine crescente dell'indice digitare:

$a = 0 .. 9
$a[-3..-1]
7
8
9

Se si digitano indici negativi in ordine decrescente, l'output cambia.

$a = 0 .. 9
$a[-1..-3]
9
8
7

Tuttavia, prestare attenzione quando si usa questa notazione. Cicli di notazione dal limite finale all'inizio della matrice.

$a = 0 .. 9
$a[2..-2]
2
1
0
9
8

Inoltre, un errore comune consiste nell'assumere si riferisce $a[0..-2] a tutti gli elementi della matrice, ad eccezione dell'ultimo. Fa riferimento al primo, ultimo e secondo all'ultimo elemento nella matrice.

È possibile usare l'operatore più (+) per combinare un intervallo con un elenco di elementi in una matrice. Ad esempio, per visualizzare gli elementi in posizioni di indice da 0, 2 e 4 a 6, digitare:

$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6

Inoltre, per elencare più intervalli e singoli elementi è possibile usare l'operatore plus. Ad esempio, per elencare gli elementi zero a due, quattro e sei e l'elemento all'ottavo tipo posizionale:

$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8

Iterazioni sugli elementi della matrice

È anche possibile usare costrutti di ciclo, ad esempio ForEach, Foreach e While, per fare riferimento agli elementi in una matrice. Ad esempio, per usare un ciclo ForEach per visualizzare gli elementi nella $a matrice, digitare:

$a = 0..9
foreach ($element in $a) {
  $element
}
0
1
2
3
4
5
6
7
8
9

Il ciclo Foreach esegue l'iterazione della matrice e restituisce ogni valore nella matrice fino a raggiungere la fine della matrice.

Il ciclo For è utile quando si incrementano i contatori esaminando gli elementi in una matrice. Ad esempio, per usare un ciclo For per restituire ogni altro valore in una matrice, digitare:

$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
  $a[$i]
}
0
2
4
6
8

È possibile usare un ciclo While per visualizzare gli elementi in una matrice fino a quando una condizione definita non è più vera. Ad esempio, per visualizzare gli elementi nella matrice mentre l'indice $a della matrice è minore di 4, digitare:

$a = 0..9
$i=0
while($i -lt 4) {
  $a[$i];
  $i++
}
0
1
2
3

Proprietà delle matrici

Conteggio o lunghezza o LongLength

Per determinare il numero di elementi in una matrice, usare la proprietà o il Length relativo Count alias. Longlength è utile se la matrice contiene più di 2.147.483.647 elementi.

$a = 0..9
$a.Count
$a.Length
10
10

Classifica

Restituisce il numero di dimensioni nella matrice. La maggior parte delle matrici in PowerShell ha una sola dimensione. Anche quando si pensa di creare una matrice multidimensionale; come nell'esempio seguente:

$a = @(
  @(0,1),
  @("b", "c"),
  @(Get-Process)
)

[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1

La creazione di una matrice veramente multidimensionale in PowerShell richiede l'assistenza di .Net Framework. Come nell'esempio seguente:

[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2

Metodi di matrici

Cancella

Imposta tutti i valori di elemento sul valore predefinito del tipo di elemento della matrice. Il metodo Clear() non reimposta le dimensioni della matrice.

Nell'esempio $a seguente è una matrice di oggetti.

$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True

In questo esempio viene $intA digitato in modo esplicito per contenere numeri interi.

[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0

ForEach

Consente di eseguire l'iterazione di tutti gli elementi della matrice ed eseguire un'operazione specificata per ogni elemento della matrice.

Il metodo ForEach include diversi overload che eseguono operazioni diverse.

ForEach(scriptblock expression)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)
ForEach(scriptblock expression, object[] arguments)

ForEach(espressione scriptblock)

ForEach(espressione scriptblock, object[] argomenti)

Nota

La sintassi richiede l'utilizzo di un blocco di script. Le parentesi sono facoltative.

Nell'esempio seguente viene illustrato come usare il metodo foreach. In questo caso, la finalità consiste nel generare il valore quadrato degli elementi nella matrice.

Si noti che questo metodo è stato aggiunto in PowerShell v4 e non è disponibile nelle versioni seguenti. Per le versioni precedenti, usare il metodo Pipelining per il cmdlet ForEach-Object

$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9

Analogamente al parametro di ForEach-Object, il arguments-ArgumentList parametro consente il passaggio di una matrice di argomenti a un blocco di script configurato per accettarli.

ForEach(type convertToType)

Il metodo può essere usato per eseguire rapidamente il cast degli elementi in un tipo diverso. Nell'esempio ForEach seguente viene illustrato come convertire un elenco di date stringa in [DateTime] tipo.

@("1/1/2017", "2/1/2017", "3/1/2017").ForEach([datetime])

Sunday, January 1, 2017 12:00:00 AM
Wednesday, February 1, 2017 12:00:00 AM
Wednesday, March 1, 2017 12:00:00 AM

ForEach(string propertyName)

ForEach(string propertyName, object[] newValue)

Il ForEach metodo può essere usato anche per recuperare rapidamente o impostare i valori delle proprietà per ogni elemento della raccolta.

# Set all LastAccessTime properties of files to the current date.
(dir 'C:\Temp').ForEach('LastAccessTime', (Get-Date))
# View the newly set LastAccessTime of all items, and find Unique entries.
(dir 'C:\Temp').ForEach('LastAccessTime') | Get-Unique
Wednesday, June 20, 2018 9:21:57 AM

ForEach(string methodName)

ForEach(string methodName, object[] arguments)

Infine, i ForEach metodi possono essere usati per eseguire un metodo in ogni elemento della raccolta.

("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE

Analogamente al parametro di ForEach-Object, il arguments-ArgumentList parametro consente il passaggio di una matrice di argomenti a un blocco di script configurato per accettarli.

Nota

A partire da Windows PowerShell 3.0 recupero delle proprietà ed esecuzione di metodi per ogni elemento in una raccolta può essere eseguito anche usando "Metodi di oggetti scalari e raccolte" È possibile leggere altre informazioni su questo about_methods

Where

Consente di filtrare o selezionare gli elementi della matrice. Lo script deve valutare in modo diverso da zero (0), stringa $false vuota o $null per visualizzare l'elemento dopo l'oggetto Where

Esiste una definizione per il Where metodo.

Where(scriptblock expression[, WhereOperatorSelectionMode mode
                            [, int numberToReturn]])

Lo Expression scriptblock necessario per il filtro, l'argomento mode facoltativo consente funzionalità di selezione aggiuntive e l'argomento numberToReturn facoltativo consente di limitare il numero di elementi restituiti dal filtro.

Nota

La sintassi richiede l'utilizzo di un blocco di script. Le parentesi sono facoltative.

Nell'esempio seguente viene illustrato come selezionare tutti i numeri dispari dalla matrice.

(0..9).Where{ $_ % 2 }
1
3
5
7
9

Sono disponibili le modalità di selezione seguenti.

Default

La Default modalità filtra gli elementi usando lo Expression scriptblock.

Se viene specificato un numberToReturn oggetto, specifica il numero massimo di elementi da restituire.

# Get the zip files in the current users profile, sorted by LastAccessTime.
$Zips = dir $env:userprofile -Recurse '*.zip' | Sort-Object LastAccessTime
# Get the least accessed file over 100MB
$Zips.Where({$_.Length -gt 100MB}, 'Default', 1)

Nota

Sia la modalità che First la Default modalità restituiscono i primi elementi (numberToReturn) e possono essere usati in modo interscambiabile.

Last (Ultimo)

$h = (Get-Date).AddHours(-1)
$logs = dir 'C:\' -Recurse '*.log' | Sort-Object CreationTime
# Find the last 5 log files created in the past hour.
$logs.Where({$_.CreationTime -gt $h}, 'Last', 5)

SkipUntil

La SkipUntil modalità ignora tutti gli oggetti in un insieme fino a quando un oggetto passa il filtro dell'espressione del blocco di script. Restituisce quindi TUTTI gli elementi rimanenti della raccolta senza testarli. Viene testato un solo elemento passato

Ciò significa che la raccolta restituita conterrà sia il passaggio che gli elementi non passati che non sono stati testati.

Il numero di elementi restituiti può essere limitato passando un valore all'argomento numberToReturn .

$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost

Fino a

La Until modalità inverte la SkipUntil modalità. Restituisce TUTTI gli elementi in una raccolta fino a quando un elemento passa l'espressione del blocco di script. Dopo che un elemento passa l'espressione scriptblock, il Where metodo arresta l'elaborazione degli elementi.

Ciò significa che si riceverà il primo set di elementi non passati dal Where metodo . Dopo il passaggio di un elemento, il resto non verrà testato né restituito.

Il numero di elementi restituiti può essere limitato passando un valore all'argomento numberToReturn .

# Retrieve the first set of numbers less than or equal to 10.
(1..50).Where({$_ -gt 10}, 'Until')
# This would perform the same operation.
(1..50).Where({$_ -le 10})
1
2
3
4
5
6
7
8
9
10

Nota

Entrambi Until e SkipUntil operano in locale di NOT test di un batch di elementi.

Until restituisce gli elementi PRIMA del primo passaggio.

SkipUntil restituisce tutti gli elementi AFTER il primo passaggio, incluso il primo elemento passing.

Doppia visualizzazione

La Split modalità divide o raggruppa gli elementi della raccolta in due raccolte separate. Quelli che passano l'espressione scriptblock e quelli che non lo fanno.

Se viene specificato un oggetto numberToReturn , la prima raccolta conterrà gli elementi passing , non per superare il valore specificato.

Gli oggetti rimanenti, anche quelli che PASSAno il filtro dell'espressione, verranno restituiti nella seconda raccolta.

$running, $stopped = (Get-Service).Where({$_.Status -eq 'Running'}, 'Split')
$running
Status   Name               DisplayName
------   ----               -----------
Running  Appinfo            Application Information
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
...
$stopped
Status   Name               DisplayName
------   ----               -----------
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
...

Ottenere i membri di una matrice

Per ottenere le proprietà e i metodi di una matrice, ad esempio la proprietà Length e il metodo SetValue, usare il parametro InputObject del cmdlet Get-Member.

Quando si esegue la pipe di una matrice in Get-Member, PowerShell invia gli elementi uno alla volta e Get-Member restituisce il tipo di ogni elemento nella matrice (ignorando i duplicati).

Quando si usa il parametro -InputObject , Get-Member restituisce i membri della matrice.

Ad esempio, il comando seguente ottiene i membri della $a variabile di matrice.

Get-Member -InputObject $a

È anche possibile ottenere i membri di una matrice digitando una virgola (,) prima del valore piped al cmdlet Get-Member. La virgola rende la matrice il secondo elemento in una matrice di matrici. Windows PowerShell pipe le matrici una alla volta e Get-Member restituisce i membri della matrice. Come i due esempi successivi.

,$a | Get-Member

,(1,2,3) | Get-Member

Modifica di una matrice

È possibile modificare gli elementi in una matrice, aggiungere un elemento a una matrice e combinare i valori di due matrici in una terza matrice.

Per modificare il valore di un particolare elemento in una matrice, specificare il nome della matrice e l'indice dell'elemento che si vuole modificare e quindi usare l'operatore di assegnazione (=) per specificare un nuovo valore per l'elemento. Ad esempio, per modificare il valore del secondo elemento della $a matrice (posizione indice 1) su 10, digitare:

$a[1] = 10

È anche possibile usare il metodo SetValue di una matrice per modificare un valore. Nell'esempio seguente viene modificato il secondo valore (posizione indice 1) della $a matrice a 500:

$a.SetValue(500,1)

È possibile usare l'operatore += per aggiungere un elemento a una matrice. Nell'esempio seguente viene illustrato come aggiungere un elemento alla $a matrice.

$a = @(0..4)
$a += 5

Nota

Quando si usa l'operatore += , PowerShell crea effettivamente una nuova matrice con i valori della matrice originale e il valore aggiunto. Ciò potrebbe causare problemi di prestazioni se l'operazione viene ripetuta più volte o la dimensione della matrice è troppo grande.

Non è facile eliminare elementi da una matrice, ma è possibile creare una nuova matrice che contiene solo elementi selezionati di una matrice esistente. Ad esempio, per creare la $t matrice con tutti gli elementi della matrice, ad eccezione del valore nella $a posizione di indice 2, digitare:

$t = $a[0,1 + 3..($a.length - 1)]

Per combinare due matrici in una singola matrice, usare l'operatore più (+). L'esempio seguente crea due matrici, le combina e quindi visualizza la matrice combinata risultante.

$x = 1,3
$y = 5,9
$z = $x + $y

Di conseguenza, la $z matrice contiene 1, 3, 5 e 9.

Per eliminare una matrice, assegnare un valore di $null alla matrice. Il comando seguente elimina la matrice nella $a variabile.

$a = $null

È anche possibile usare il cmdlet, ma l'assegnazione Remove-Item di un valore di $null è più veloce, soprattutto per le matrici di grandi dimensioni.

Matrici di zero o uno

A partire da Windows PowerShell 3.0, una raccolta di zero o un oggetto ha la proprietà Count e Length. È anche possibile indicizzare in una matrice di un oggetto. Questa funzionalità consente di evitare errori di scripting che si verificano quando un comando che prevede che una raccolta ottenga meno di due elementi.

Gli esempi seguenti illustrano questa funzionalità.

Oggetti Zero

$a = $null
$a.Count
$a.Length
0
0

Un oggetto

$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4

Vedi anche