PowerShell Element [0] aus einem Array entfernen

9

Ich habe Schwierigkeiten, die erste Zeile (Element-ID) eines Arrays zu entfernen.

%Vor%

Um alle Optionen aufzulisten, habe ich ,$test | gm ausprobiert und es steht eindeutig:

%Vor%

Wenn ich $test.RemoveAt(0) versuche, bekomme ich den Fehler:

%Vor%

Also habe ich hier gefunden dass mein Array vom Typ System.Object sein muss, um $test.RemoveAt(0) verwenden zu können. Ist es am besten, alle Arrays am Anfang des Skripts als Liste zu deklarieren? Oder ist es besser, die Arrays mit $collection = ({$test}.Invoke()) später in eine Liste zu konvertieren, wenn diese Funktionalität benötigt wird?

Was sind die Vor- und Nachteile beider Typen? Danke für Ihre Hilfe.

    
DarkLite1 15.07.2014, 09:41
quelle

6 Antworten

15

Arrays haben eine feste Größe, wie der Fehler sagt. RemoveAt() ist eine geerbte Methode, die nicht auf normale Arrays angewendet wird. Um den ersten Eintrag im Array zu entfernen, könnten Sie das Array mit einer Kopie überschreiben, die alle Elemente außer dem ersten enthält:

%Vor%

Wenn Sie Werte in verschiedenen Indizes entfernen müssen, sollten Sie einen List verwenden. Es unterstützt Add() , Remove() und RemoveAt() :

%Vor%

Siehe meine früheren SO-Antwort und about_Arrays für weitere Details zur Funktionsweise von Arrays.

    
Frode F. 15.07.2014, 10:00
quelle
8

Damit können Sie jedes Vorkommen eines beliebigen Elements aus einem Array entfernen, ohne auf ein anspruchsvolleres .NET-Objekt zurückgreifen zu müssen.

%Vor%

Dies wird dasselbe tun, aber nur eines der Elemente entfernen. Wenn Dubletten vorhanden sind, bleiben sie erhalten.

%Vor%     
quelle
2

Nur zu aktualisieren - es gibt ein Problem mit @Frode F Antwort

  

Wenn die Anzahl der Elemente im Array mehr als 1 ist

%Vor%
  

Wenn die Anzahl der Elemente 1 ist, wird dadurch das Element

nicht entfernt
%Vor%     
Reddy 19.08.2016 11:45
quelle
1

Ich denke, es hängt von den Umständen ab. Wenn Sie das erste Element nur einmal entfernen müssen, können Sie das Array-Slicing verwenden:

%Vor%

Wenn Sie es wiederholt tun, sollten Sie mit einer Arraylist oder generischen Sammlung beginnen. Wenn es sich um ein großes Array handelt, möchten Sie vielleicht den Ausdruck, der es erstellt, in einen Skriptblock einfügen und dafür eine .invoke () -Option ausführen, anstatt die Pipeline ein Array erstellen zu lassen und dieses dann in eine Sammlung umzuwandeln.

    
mjolinor 15.07.2014 10:24
quelle
0

Entschuldige die späte Antwort, aber ich hatte auch damit zu kämpfen. Für meine Absichten und Zwecke (Schreiben in eine Textdatei) erkannte ich, dass das Array eine feste Größe hatte - anstatt es zu entfernen, konnte ich einfach den Wert auf string.empty setzen.

%Vor%

Für mich wurde das der Header gelöscht, den ich nicht in meiner flachen Datei haben wollte. Hoffe, das hilft jemand anderem da draußen.

    
plntxt 05.11.2015 16:44
quelle
0

Sie können Select-Object -Skip <count> um die ersten Elemente wegzulassen:

%Vor%     
Ron MacNeil 25.03.2018 03:37
quelle

Tags und Links