viper-berlin
Goto Top

Powershell Arrays deklarieren füllen abfragen ???

Hallo Leute,

bin Anfänger in PS und obwohl ich wieder viele Seiten PS gelesen hab ist mir
immer noch schleierhaft wie das mit den Array in PS ist ??? ;-(

Also... so sieht für mich ein Array aus... klar, verständlich, logisch !!!

Dim arr(2,3) ' Which has 3 rows and 4 columns
arr(0,0) = "Apple"
arr(0,1) = "Orange"
arr(0,2) = "Grapes"
arr(0,3) = "pineapple"
arr(1,0) = "cucumber"
arr(1,1) = "beans"
arr(1,2) = "carrot"
arr(1,3) = "tomato"
arr(2,0) = "potato"
arr(2,1) = "sandwitch"
arr(2,2) = "coffee"

bei PS wiederum such ich mir einen Wolf wie man
ein ganz normales Array anlegt währe nett wenn Ihr mir ein paar
Antworten geben könntet auf folgende Fragen face-wink

1. Wie erzeuge ich ein normales Stringarray ohne Inhalt in PS ?
z.B Dim Arr01() String_;
ich habs so versucht [string] $Arr01=""

2. Wie erzeuge ich ein mehrdimensionales Int oder Stringarray ohne Inhalt in PS ?
z.B Dim Arr01(X,Y) String

3. Wie lese ich Arrays aus in PS ?
z.B
a=Arr01(1,2)
echo a


Thanks
der Vipy

Content-ID: 235025

Url: https://administrator.de/contentid/235025

Ausgedruckt am: 08.11.2024 um 21:11 Uhr

LordXearo
LordXearo 09.04.2014 um 16:27:41 Uhr
Goto Top
Hi,

$strArray = @("Text1","Text2","Text3")  
$strArray[1]
Text2

findest du eigentlich auch alles über google?!
$MultiArray = @((1,2,3),(40,50,60) )

Gruß

Xearo
Viper-Berlin
Viper-Berlin 09.04.2014 um 16:42:28 Uhr
Goto Top
Danke hab jetzt auch was gefunden:
face-wink Vipy


$array = New-Object "object[,]" 10,20

Sie können nun die Arrayelemente über die beiden Indizes ansprechen. Das erste Element trägt zum Beispiel den Index 0,0:
PS > $array[0,0]="Erstes Array"

Das letzte Array trägt den Index 9,19:
PS > $array[9,19]="Letztes Array"
colinardo
colinardo 09.04.2014 aktualisiert um 17:33:58 Uhr
Goto Top
Hi,
wie ein Array erstellt wird hat Xaero ja schon geschrieben, du musst aber bei Multidimensionalen Arrays in Powershell so darauf zugreifen:
$MultiArray = @((1,2,3),(40,50,60))
# gibt '2' aus 
$MultiArray[1]

wie schon mehrfach geschrieben, schau dir die NET Klassen an: http://msdn.microsoft.com/en-us/library/ms229335%28v=vs.90%29.aspx
Die kannst du alle auch in Powershell verwenden...


Schöne Beispiele dazu mal hier, damit du mal siehst was dir entgeht, wenn du kein NET sprechen kannst :

#---------- Hashtables Key = > Wert Paare
$ht = @{Key1="Wert";Key2="Wert2"}  

# gibt den wert von 'Key1' aus 
$ht.Key1

# Einen Wert zur Hashtable hinzufügen:
$ht.NeuerKey = "Neuer Wert"  
$ht


#-------- immer Sortierte Liste erstellen
$sortedList = New-Object System.Collections.SortedList
$sortedList.Add("C","Wert1")  
$sortedList.Add("G","Wert2")  
$sortedList.Add("A","Wert2")  
# gibt immer eine nach Name sortierte Liste aus, egal wann man ein Objekt hinzufügt
$sortedList


# ---------- Stack 'LIFO'  (Last In First Out) 
$stack = New-Object System.Collections.Stack
$stack.Push("Erster Wert")  
$stack.Push("Zweiter Wert")  
$stack.Push("Dritter Wert")  

# liefert 'Dritter Wert' 
$stack.Pop()
# liefert 'Zweiter Wert' 
$stack.Pop()


# ------------ Qeue 'FIFO' (First in First Out) 
$queue = New-Object System.Collections.Queue
$queue.Enqueue("Wert1")  
$queue.Enqueue("Wert2")  

# liefert 'Wert1' 
$queue.Dequeue()

# liefert 'Wert2' 
$queue.Dequeue()

Grüße Uwe
Viper-Berlin
Viper-Berlin 09.04.2014 um 17:33:07 Uhr
Goto Top
Hallo Xearo,

danke erst mal für dein Vorschlag face-wink
aber das ist nicht genau was ich suche !!!
hier mal der Sourcecode + Fehlermeldung vielleicht weisst du eine Lösung???

Ich will das Array erst im Kopf deklarieren wie man es in jeder anderen programmiersprache
auch macht und später die Werte zuweisen und genau das geht nicht.

Sourcecode ##################################

#--- Variablen-Deklaration---#
[string] $g_str_Arr_MSG[3] #--- String Array ---#
[string] $g_str_MSG = "Leer" #--- String ---#
[Int] $l_Int_Count = "0" #--- Integer Counter ---#
Clear-Host #--- Bildschirm löschen ---#

#-- Array füllen -----------------------------------------------------#
for ($l_Int_Count=0; $l_Int_Count –lt 3; $l_Int_Count++)
{
$g_str_Arr_MSG[$l_Int_Count] = "EinWert"
Write-Host "Array:$g_str_Arr_MSG[$l_Int_Count]"
}

#-- Array abfragen -----------------------------------------------------#
for ($l_Int_Count=0; $l_Int_Count –lt 3; $l_Int_Count++)
{
$g_str_MSG="$g_str_Arr_MSG[$l_Int_Count]"
Write-Host "Array:$g_str_MSG"
}
pause


#---> unfassbar woher bekommt er jetzt noch die Werte unten ARRAY

FEHLERMELDUNG ##################
Es ist nicht möglich, einen Index auf ein Objekt vom Typ "System.String" anzuwenden.In Zeile:12 Zeichen:8

back-to-top$g_str_Arr_MSG[$l_Int_Count] = "EinWert"

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile , RuntimeException
+ FullyQualifiedErrorId : CannotIndex

Array:ARRAY
Es ist nicht möglich, einen Index auf ein Objekt vom Typ "System.String" anzuwenden.In Zeile:12 Zeichen:8

back-to-top$g_str_Arr_MSG[$l_Int_Count] = "EinWert"

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile , RuntimeException
+ FullyQualifiedErrorId : CannotIndex

Array:ARRAY[1]
Es ist nicht möglich, einen Index auf ein Objekt vom Typ "System.String" anzuwenden.In Zeile:12 Zeichen:8

back-to-top$g_str_Arr_MSG[$l_Int_Count] = "EinWert"

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile , RuntimeException
+ FullyQualifiedErrorId : CannotIndex

Array:ARRAY[2]
Array:ARRAY
Array:ARRAY[1]
Array:ARRAY[2]
Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:
colinardo
Lösung colinardo 09.04.2014 aktualisiert um 18:23:21 Uhr
Goto Top
Das kann ja auch so nicht funktionieren...machs so:
# leeres Array of Strings erstellen
[string[]]$g_str_Arr_MSG = @()

#Array füllen ...
for ($i=0; $i -lt 3; $i++){
    # Wert zum Array hinzufügen
    $g_str_Arr_MSG += "Ein Wert"  
}

#Array auslesen ...
for ($i=0; $i -lt $g_str_Arr_MSG.Length; $i++){
    write-host $g_str_Arr_MSG[$i]
}
weitere Varianten zum initialisieren von Arrays: http://stackoverflow.com/questions/226596/powershell-array-initializati ...

z.B.
[string[]]$g_str_Arr_MSG = @("")*3
oder
[string[]]$g_str_Arr_MSG = new-object string 3
wenn das Array bereits mit einer festen Anzahl initialisiert ist füllst du es wie gehabt:
[string[]]$g_str_Arr_MSG = new-object string 3

#Array füllen ...
for ($i=0; $i -lt 3; $i++){
    $g_str_Arr_MSG[$i] = "Ein Wert"  
}

#Array auslesen ...
for ($i=0; $i -lt $g_str_Arr_MSG.Length; $i++){
    write-host $g_str_Arr_MSG[$i]
}

dynamische Arrays sind auch kein Problem:
$arrayList = New-Object System.Collections.ArrayList
$arrayList.Add("Test")  
$arrayList.Add("Test2")  
echo $arrayList
du siehst die Möglichkeiten sind fast unbegrenzt ...

p.s. hast du hier noch immer nicht gelernt wie man Code mit Tags auszeichnet ???!!!
Viper-Berlin
Viper-Berlin 09.04.2014 um 18:23:14 Uhr
Goto Top
Hej super Colinardo,

das war die Lösung danke......

nur noch eine kurze Frage warum schreibt man..

[string[]]$g_str_Arr_MSG = new-object string 3

und nicht

[string] $g_str_Arr_MSG = new-object string 3 ????

ist das bei einer normalen Variablen auch so oder so ?
[string] g_str_Var001 ???

muss leider solche Anfängerfragen stellen weil die Syntax ist die Hölle von PS

Thanks
der Vipy
colinardo
Lösung colinardo 09.04.2014 aktualisiert um 18:43:20 Uhr
Goto Top
Zitat von @Viper-Berlin:
nur noch eine kurze Frage warum schreibt man..
[string[]]$g_str_Arr_MSG = new-object string 3
weil du ein Array aus Strings deklarierst und keine einzelne [string]-Variable
aber das das explizite deklarieren mache ich in Powershell ziemlich selten da .NET die Typen selber zuweist und wenn du einem Index im Array einen String zuweist weiß .NET das schon und bekommt dementsprechend den Typ String.

Hier hilft dir die Funktion getType() beim bestimmen des Typs eines Objektes
[string[]]$array = @()
# Array aus Strings
$array.GetType()

# Einzelner String
"Test".getType()  

muss leider solche Anfängerfragen stellen weil die Syntax ist die Hölle von PS
es gibt in Powershell halt eine Menge von Abkürzungen und mehrere Wege die zum Ziel führen, wie in Batch halt auch. Man kann sie nutzen muss es aber nicht. Aller Anfang ist schwer ...

Grüße Uwe
Viper-Berlin
Viper-Berlin 09.04.2014 um 18:43:42 Uhr
Goto Top
face-wink face-wink face-wink

Vipy
LordXearo
LordXearo 10.04.2014 um 09:03:17 Uhr
Goto Top
Sorry habs gestern nicht mehr geschafft zu antworten.

colinardo hat es aber ohnehin drauf ;)
Viper-Berlin
Viper-Berlin 10.04.2014 aktualisiert um 11:50:30 Uhr
Goto Top
Jo Danke LordXearo,
hab trotzdem noch ne Frage ich werde Irre mit PS

schau mal bitte...

#--- Array füllen ---#
for ($i=0; $i -lt 3; $i++)
{
$g_str_Arr_MSG[$i]="Gefüllt mit:$i";
}

#--- Array auslesen ---#
for ($i=0; $i -lt $g_str_Arr_MSG.Length; $i++)
{
write-host "Wert="$g_str_Arr_MSG[$i];
}


Das Ergebnis ist falsch, bekomme ein Blank in String der gar nicht definiert wurde
ich habe auch hinten an jeder Anweisung ein ; drangehängt das wohl das ende des Befehls
bedeutet ? so das keine nachstehenden Blank an den String angehängt werden.

Wert= Gefüllt mit:0
Wert= Gefüllt mit:1
Wert= Gefüllt mit:2
Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:

Merkwürdig ist auch das die Zeile

write-host "Wert="$g_str_Arr_MSG[$i]; funktioniert (mehr oder weniger hat einen Blank drin ???? warum ?)

und die Zeile

write-host "Wert=$g_str_Arr_MSG[$i]"; ein Ergebnis raus bring was ich nicht nachvollziehen kann ?? ;-(
          1. schon ein bisschen der schreibt den gesammten Inhalt vom Array raus und hängt hinten das $i ran aber warum ?

          ERGEBNIS:
          Wert=Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2
          Wert=Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2[1]
          Wert=Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2[2]
          Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:

          wie kann man den im String zwischen write-host "blabal hir soll ein Arraywert stehen z.B. so $g_str_Arr_MSG[$i] " aber dat geht nicht ;-/

          Vielleicht hast du eine Lösung dafür face-wink
          also ich geh bei Powershell immer ein Schritt vorwärtz und 3 zurück.
          Ich weis nicht ob Powershell wirklich gut ist oder nur ein Modeerscheinung also ein VB VBS WSH Code kann man sofort lesen alles klar
          hier googelt man Stunden, forstet 100 von Foren durch damit man ein Script schreiben kann ???
          also das ist doch genau das Gegenteil von dem was eine Scriptsprache soll ???
          leicht verständlich, klar in der Syntax, einfach zu lernen, schnell umzusetzen.

          Also besten Dank !!!
          der Vipy
colinardo
colinardo 10.04.2014 aktualisiert um 14:37:38 Uhr
Goto Top
Zitat von @Viper-Berlin:
Das Ergebnis ist falsch, bekomme ein Blank in String der gar nicht definiert wurde
ich habe auch hinten an jeder Anweisung ein ; drangehängt das wohl das ende des Befehls
bedeutet ? so das keine nachstehenden Blank an den String angehängt werden.

Wert= Gefüllt mit:0
Wert= Gefüllt mit:1
Wert= Gefüllt mit:2
Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:
entweder so:
write-host "Wert=$($g_str_Arr_MSG[$i])"
oder so:
$var = "Wert=" + $g_str_Arr_MSG[$i]
write-host $var
also ich geh bei Powershell immer ein Schritt vorwärtz und 3 zurück.
Ich weis nicht ob Powershell wirklich gut ist oder nur ein Modeerscheinung also ein VB VBS WSH Code kann man sofort lesen alles
klar
hier googelt man Stunden, forstet 100 von Foren durch damit man ein Script schreiben kann ???
also das ist doch genau das Gegenteil von dem was eine Scriptsprache soll ???
leicht verständlich, klar in der Syntax, einfach zu lernen, schnell umzusetzen.
Wenn du einfach so drauf los legst ohne dich mal in die Details eingelesen zu haben kein Wunder ... Wenn du es nicht so schaffst besorg dir halt ein Buch, oder lass es. Ich habe mit der Sprache keine Probleme... Ich denke dein Problem liegt daran das du zu eingefahren bist. Neues lernen tut dem Gehirn gut ...

Ich sag nochmal, lesen, lesen lesen...: http://www.powershellpraxis.de/

Grüße Uwe
AnkhMorpork
AnkhMorpork 10.04.2014 um 12:28:18 Uhr
Goto Top
Ich sag nochmal, lesen, lesen lesen...: http://www.powershellpraxis.de/

Grüße Uwe


Das kann ich nur bestätigen, und ich bin auch Anfänger in der PS. Du wetterst hier seit Tagen über Powershell - irgendwie alles sch... - aber allem Anschein nach fehlen dir die elementarsten Grundlagen. Wenn dir die vorgeschlagenen Links nicht zusagen, probier diese hier (wird doch wohl was für dich dabei sein, oder?):

http://www.admin-source.de/BlogDeu/links

Technet-Forum:
http://social.technet.microsoft.com/Forums/de-DE/powershell_de/threads? ...

Hey scripting guy:
http://blogs.technet.com/b/heyscriptingguy/?Redirected=true

Script-Center:
http://gallery.technet.microsoft.com/ScriptCenter/

Technet, What Can I Do With Windows PowerShell?
http://technet.microsoft.com/en-us/library/ee332526.aspx

Technet, Windows PowerShell Management Cmdlets:
http://technet.microsoft.com/de-de/library/hh849827.aspx

Technet, Windows PowerShell Tip of the Week:
http://technet.microsoft.com/en-us/library/ff730948.aspx

Technet, Windows PowerShell Tips:
http://technet.microsoft.com/en-us/library/ee692948.aspx

System.Windows.Forms Namespace:
http://msdn.microsoft.com/en-us/library/system.windows.forms%28VS.80%29 ...

Dictionary-Object
http://technet.microsoft.com/en-us/library/ee198718.aspx

Tutorial:
http://www.computerperformance.co.uk/powershell/

Cmtlets:
http://www.colorconsole.de/PS_Windows/en/

WMI:
http://social.msdn.microsoft.com/Search/de-DE?query=wmi&emptyWaterm ...

Win32 Classes:
http://msdn.microsoft.com/en-us/library/aa394084%28v=vs.85%29.aspx

Tutorials:
http://www.powershellpro.com/powershell-tutorial-introduction/powershel ...


GUI-Programmierung:
http://www.martinlehmann.de/wp/download/powershell-gui-programmierung-f ...

http://powershell.com/cs/


String-Manipulation:
http://www.amandhally.net/tag/string-manipulation-in-powershell/
http://www.amandhally.net/tag/text-manipulation-in-powershell/
https://blogs.technet.com/b/heyscriptingguy/archive/2011/09/21/two-simpl ...
http://newdelhipowershellusergroup.blogspot.de/p/tutorial-series.html


Remote:
http://technet.microsoft.com/en-us/library/dd819505.aspx
http://www.computerperformance.co.uk/powershell/powershell_remote.htm

Und den auch noch:
Neues in PS 3.0 und 4.0:
http://technet.microsoft.com/en-us/library/hh857339


Gruß

ANKH
Viper-Berlin
Viper-Berlin 10.04.2014 um 12:47:26 Uhr
Goto Top
Jo stimmt schon,
lesen lesen lesen .....
zeit zeit zeit... face-wink
ich wollte eine Skriptsprache lernen die leicht verständlich ist und leicht zu erlernen ist
bei Powershell muss man wirklich viel lesenkomm wohl nicht drum rum face-wink .

hab das Skript getestet das eizige Ergebnis was richtig war ......

$var = "Wert=" + $g_str_Arr_MSG[$i] ;
write-host $var;

was mich doch sehr wundert und für mich nicht unbedingt logisch ist

das Skript hat nicht funktioniert (nur 3 " Zeichen??? )

write-host "Wert="$g_str_Arr_MSG[$i]";

so hats im übrigen auch nicht gegeht

write-host "Wert=""$g_str_Arr_MSG[$i]";


ich werde mich jetzt darauf versteigfen alles in eine Hilfsvariable zu schreiben wenn das geht, warum auch immer ?
nehm ich den Tip dankend an face-wink


Also noch mal schönen Dank für die Hilfe!
Vipy
Viper-Berlin
Viper-Berlin 10.04.2014 aktualisiert um 12:49:27 Uhr
Goto Top
Super danke !
jetzt setze ich mich nur noch für 2 Jahre in den Keller und dann klappts auch face-wink
Thanks Vipy
colinardo
colinardo 10.04.2014 aktualisiert um 14:37:17 Uhr
Goto Top
Zitat von @Viper-Berlin:
das Skript hat nicht funktioniert (nur 3 " Zeichen??? )

write-host "Wert="$g_str_Arr_MSG[$i]";
hatte das oben kurz nach dem Post noch korrigiert, sorry, muss natürlich so lauten:
write-host "Wert=$(g_str_Arr_MSG[$i])"
innerhalb von doppelten Anführungszeichen werden Variablen auch aufgelöst !
AnkhMorpork
AnkhMorpork 10.04.2014 um 12:59:29 Uhr
Goto Top
Zitat von @Viper-Berlin:

Super danke !
jetzt setze ich mich nur noch für 2 Jahre in den Keller und dann klappts auch face-wink
Thanks Vipy

Du sollst ja nicht alles lesen, sondern das raussuchen, was dir am meisten bringt.
1 Jahr und 11 Monate genügen da völlig, glaub mir.

Gruß

ANKH
Viper-Berlin
Viper-Berlin 10.04.2014 um 14:20:49 Uhr
Goto Top
Die Links sind Super...
Viper-Berlin
Viper-Berlin 10.04.2014 aktualisiert um 14:34:57 Uhr
Goto Top
Jo danke colinardo,
den hatte ich schon ! kommt nur ein falsches Ergebnis raus ?
Aber es geht ja mir der Hilfsvariable face-wink


#--- Array auslesen ---#
for ($i=0; $i -lt $g_str_Arr_MSG.Length; $i++)
{
#--- Hier kommt Müll bei raus ---#
write-host "Wert=""$g_str_Arr_MSG[$i]";

#--- Hier kommt Müll bei raus ---#
write-host "Wert=$g_str_Arr_MSG[$i]";

#--- Hier kommt Müll bei raus ---#
write-host "Wert="+$g_str_Arr_MSG[$i];


#---IMMER HILFSVARIABLE BENUTZEN SONST DATENMÜLL ---#
$var = "Wert=" +$g_str_Arr_MSG[$i] +" RICHTIG";
write-host $var
}

ERGEBNIS..
Wert="Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2
Wert=Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2
Wert= +Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2
Wert=Gefüllt mit:0 RICHTIG
Wert="Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2[1]
Wert=Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2[1]
Wert= +Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2[1]
Wert=Gefüllt mit:1 RICHTIG
Wert="Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2[2]
Wert=Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2[2]
Wert= +Gefüllt mit:0 Gefüllt mit:1 Gefüllt mit:2[2]
Wert=Gefüllt mit:2 RICHTIG
Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:
colinardo
Lösung colinardo 10.04.2014, aktualisiert am 24.04.2014 um 09:55:39 Uhr
Goto Top
Zitat von @Viper-Berlin:

Jo danke colinardo,
den hatte ich schon ! kommt nur ein falsches Ergebnis raus ?
write-host "Wert=$g_str_Arr_MSG[$i]"
öhm ich hatte das so geschrieben s. oben:
write-host "Wert=$($g_str_Arr_MSG[$i])"
wenn du Variablen innerhalb doppelten Anführungszeichen verwendest und dabei Eigenschaften oder Indexe von dieser abrufst musst du sie mit $() einschließen. Alles innerhalv von $() wird dann ausgewertet und entsprechend an der Stelle ausgegeben. Du kannst damit z.B. so was machen:
echo "Heute ist der $((get-date).ToShortDateString())"
Viper-Berlin
Viper-Berlin 10.04.2014 um 14:56:22 Uhr
Goto Top
Super das is es! genau das !! Wow !!!
face-wink face-wink face-wink

Thanks
Vipy