Condividi tramite


Informazioni sulle matrici

Descrizione breve

Descrive le matrici, ovvero 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 dello stesso tipo o di 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, 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 di intervallo (..). Ad esempio, per creare e inizializzare una matrice denominata "$B" che contiene 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 (). Per determinare, ad esempio, il tipo di dati della matrice di $a, digitare:

$a.GetType()

Per creare una matrice fortemente tipizzata, ovvero una matrice che può contenere solo valori di un determinato tipo, eseguire il cast della variabile come tipo di matrice, ad esempio String [], Long [] o Int32 []. Per eseguire il cast di una matrice, anteporre il nome della variabile a un tipo di matrice racchiuso tra parentesi quadre. Ad esempio, per creare una matrice di interi a 32 bit denominata $ia contenente quattro numeri interi (1500, 2230, 3350 e 4000), digitare:

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

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

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

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

Operatore di sottoespressione di matrice

L'operatore di sottoespressione di matrice crea una matrice, anche se contiene zero o un oggetto.

La sintassi dell'operatore di matrice è la seguente:

@( ... )

È possibile usare l'operatore di 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 ulteriori informazioni sull'operatore di sottoespressione di matrice, vedere about_Operators.

Accesso e utilizzo di elementi di matrice

Lettura di una matrice

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

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

È possibile fare riferimento agli elementi di una matrice usando un indice, a partire dalla posizione 0. Racchiudere il numero di indice tra parentesi quadre. Per visualizzare, ad esempio, 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 utilizzando un operatore di intervallo per l'indice. Ad esempio, per recuperare il secondo e il quinto elemento della matrice, digitare:

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

I numeri negativi vengono conteggiati dalla fine della matrice. Ad esempio, "-1" si riferisce all'ultimo elemento della matrice. Per visualizzare gli ultimi tre elementi della matrice, in ordine crescente dell'indice, digitare:

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

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

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

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

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

Inoltre, un errore comune è quello di presupporre $a[0..-2] che si riferisca a tutti gli elementi della matrice, ad eccezione dell'ultima. Si riferisce al primo, ultimo e al penultimo elemento della matrice.

È possibile usare l'operatore di addizione (+) per combinare un intervallo con un elenco di elementi in una matrice. Ad esempio, per visualizzare gli elementi in corrispondenza delle posizioni di indice 0, 2 e da 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 di addizione. Ad esempio, per elencare gli elementi da zero a due, da quattro a sei e l'elemento a 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, for 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 scorre la matrice e restituisce ogni valore nella matrice fino a raggiungere la fine della matrice.

Il ciclo for è utile quando si esegue l'incremento dei contatori quando si esaminano gli elementi di una matrice. Ad esempio, per usare un ciclo for per restituire tutti gli altri valori 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 utilizzare un ciclo while per visualizzare gli elementi di una matrice fino a quando una condizione definita non è più vera. Ad esempio, per visualizzare gli elementi nella $a matrice mentre l'indice 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

Count o length o LongLength

Per determinare il numero di elementi in una matrice, utilizzare la Length proprietà o il 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 dispone solo di una dimensione. Anche quando si pensa di compilare 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 multidimensionale in PowerShell richiede l'assistenza di .NET Framework. Come nell'esempio seguente:

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

Metodi delle matrici

Clear

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

Nell'esempio seguente viene mostrata $a una matrice di oggetti.

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

In questo esempio, $intA è tipizzato in modo esplicito per contenere numeri interi.

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

ForEach

Consente a di eseguire l'iterazione su tutti gli elementi della matrice ed eseguire una determinata operazione per ogni elemento della matrice.

Il metodo ForEach presenta 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 (scriptblock espressione, oggetto [] argomenti)

Nota

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

Nell'esempio seguente viene illustrato come utilizzare il metodo ForEach. In questo caso, lo scopo è quello di 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 -ArgumentList parametro di ForEach-Object , il arguments parametro consente il passaggio di una matrice di argomenti a un blocco di script configurato per accettarle.

ForEach (tipo convertToType)

Il ForEach metodo può essere usato per eseguire rapidamente il cast degli elementi a un tipo diverso. nell'esempio seguente viene illustrato come convertire un elenco di date di stringa nel [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, oggetto [] newValue)

Il ForEach metodo può essere utilizzato anche per recuperare rapidamente o impostare i valori delle proprietà per ogni elemento nella 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 [] argomenti)

Infine, ForEach è possibile usare i metodi per eseguire un metodo su ogni elemento della raccolta.

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

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

Nota

A partire da Windows PowerShell 3,0 il recupero di proprietà ed esecuzione di metodi per ogni elemento di una raccolta può essere eseguito anche usando "metodi di oggetti scalari e raccolte". per altre informazioni, vedere qui about_Methods

Dove

Consente di filtrare o selezionare gli elementi della matrice. Lo script deve restituire un valore diverso da: zero (0), una stringa vuota $false o $null per l'elemento da visualizzare dopo ilWhere

Esiste una definizione per il Where metodo.

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

ExpressionÈ scriptblock, che è necessario per l'applicazione di filtri, l' mode argomento facoltativo consente funzionalità di selezione aggiuntive e l' numberToReturn argomento 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.

Predefinito

La Default modalità filtra gli elementi usando Expression scriptblock.

Se numberToReturn viene specificato un oggetto, viene specificato 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 Default modalità che la First modalità restituiscono i primi numberToReturn elementi () 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 di una raccolta fino a quando un oggetto passa il filtro dell'espressione del blocco di script. Restituisce quindi tutti gli elementi della raccolta rimanenti senza testarli. Viene testato un solo elemento che passa

Ciò significa che la raccolta restituita conterrà sia elementi che passano che non passano che non sono stati testati.

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

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

Fino

La modalità Until inverte la SkipUntil modalità. Restituisce tutti gli elementi di una raccolta fino a quando un elemento non supera l'espressione del blocco di script. Una volta che un elemento passa l'espressione scriptblock, il Where metodo interrompe l'elaborazione degli elementi.

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

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

# 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

Sia Until che SkipUntil operano nel presupposto di non testare un batch di elementi.

UntilRestituisce gli elementi prima del primo passaggio.

SkipUntilRestituisce tutti gli elementi dopo il primo passaggio, incluso il primo elemento passato.

Split

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 sono.

Se numberToReturn viene specificato un valore, la prima raccolta conterrà gli elementi che passano , per non 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 invia tramite pipe una matrice a 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 inviato tramite pipe al cmdlet Get-Member. La virgola rende la matrice il secondo elemento in una matrice di matrici. Windows PowerShell convoglia 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 di 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 desidera modificare, quindi utilizzare l'operatore di assegnazione (=) per specificare un nuovo valore per l'elemento. Per modificare, ad esempio, 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 il secondo valore (posizione di indice 1) della matrice viene modificato $a in 500:

$a.SetValue(500,1)

Per aggiungere un elemento a una matrice, è possibile usare l'operatore + =. 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. Questo 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 gli elementi selezionati di una matrice esistente. Ad esempio, per creare la $t matrice con tutti gli elementi nella $a matrice, ad eccezione del valore in corrispondenza della posizione di indice 2, digitare:

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

Per combinare due matrici in un'unica matrice, usare l'operatore di addizione (+). Nell'esempio seguente vengono create due matrici, vengono combinate, quindi viene visualizzata 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 che segue elimina la matrice nella $a variabile.

$a = $null

È anche possibile usare il Remove-Item cmdlet, ma l'assegnazione di un valore $null è più veloce, soprattutto per 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. È inoltre possibile indicizzare in una matrice di un oggetto. Questa funzionalità consente di evitare gli errori di script che si verificano quando un comando che prevede una raccolta ottiene meno di due elementi.

Gli esempi seguenti illustrano questa funzionalità.

Zero oggetti

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

Un oggetto

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

Vedere anche