Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Mit Powershell nur bestimmte Arrayfelder durchsuchen (Performance)

Frage Entwicklung

Mitglied: Feuerstein08

Feuerstein08 (Level 1) - Jetzt verbinden

29.04.2010 um 11:50 Uhr, 10503 Aufrufe, 7 Kommentare

Hallo zusammen,

ich möchte größere Arrays durchsuchen.
Dafür reicht es mir eus, nur ein bestimmtes Feld zu vergleichen. Das sollte die Performance doch in die Höhe treiben, oder?

Es scheint so, als ob die
01.
foreach ($element in $array) ($element}
Variante, die schnellste ist, mit der man Arrays (und in meinem Fall sind das Multinensionlae Arrays) durchsuchen kann.

Hier ein Beispielcode:

01.
cls 
02.
 
03.
$myMultiArray = @()  
04.
$myMultiArray += @{ 
05.
"Start" = "10";  
06.
"End" = "24";  
07.
"Finish" = "29"}  
08.
 
09.
$myMultiArray += @{ 
10.
"Start" = "15";  
11.
"End" = "26";  
12.
"Finish" = "34"}  
13.
 
14.
$myMultiArray += @{ 
15.
"Start" = "5";  
16.
"End" = "11";  
17.
"Finish" = "16"}  
18.
 
19.
Write-Host 
20.
 
21.
foreach ($element in $myMultiArray) { 
22.
	if ($($element).Start.length -gt 0) {$element} 
23.
}
Wie kann ich nun NUR das Feld "Start" des gesamten Arrays anzeigen lassen bzw. mit einem anderen Wert vergleichen?
Wie bereits gesagt - das "foreach" ist scheinbar die schnellste Methode durch ein Array zu gehen, oder?

Danke für jeden Hinweis bzw. Code.
Feuerstein08
Mitglied: LotPings
29.04.2010 um 13:33 Uhr
Hallo Feuerstein08,

deine Syntax erzeugt kein Mutliarray sonder eine HashTable.

Am günstigsten wäre wohl eine Object-Variable, dann könntest du einfach mit where-object [$_.Start -gt 0} selektieren
(BTW: soll die Abfrage oben wirklich die Länge von Start abfragen?)

Ich habe aber selber noch Schwierigkeiten an eine selbst erzeugte Object-Variable Zeilen anzuhängen.

Das Erzeugen ginge so:
01.
$oVar= New-Object psobject 
02.
$oVar| Add-Member -MemberType noteProperty -Name Start  -Value 10 
03.
$oVar| Add-Member -MemberType noteProperty -Name End    -Value 24 
04.
$oVar| Add-Member -MemberType noteProperty -Name Finish -Value 29 
05.
$oof
Ich weiss ja nicht wo deine Daten herkommen, wenn du sie in eine csv verpacken kannst,
nimm einfach import-csv, dann kannst du mit select where foreach etc arbeiten.

Gruß
LotPings

Edit: where verbessert
Bitte warten ..
Mitglied: 5t8d1e
29.04.2010 um 15:30 Uhr
Hallo

$myMultiArray = @()

erzeugt ein Array, die weiteren Zeilen erzeugen Hash-tables als einzelne Arrayelemente. Ob das jetzt ein Multidimensionales Array ist, darüber kann man sich streiten.

Wie kann ich nun NUR das Feld "Start" des gesamten Arrays anzeigen lassen bzw. mit einem anderen Wert vergleichen?
so würde erstmal das anzeigen aussehen
01.
for ($x = 0 ; $x -le $myMultiArray.count - 1 ; $x++) { Write-host 'Start:' $myMultiArray[$x] }

grüße Torsten

edit:
hier noch zwei links zu array in PS ss64.com und powershell.com
Bitte warten ..
Mitglied: Feuerstein08
01.05.2010 um 10:58 Uhr
Hallo LotPings,

danke für dein Post.
Der Code ist nur ein Beispielcode. Ich möchte aus einem größeren Array einfach immer nur ein und dasselbe Feld (weil das in allen zu vergleichenden Dateien vorkommt) bearbeiten und nicht das gesamte Array, das aus über 20 Feldern mit mehreren tausend Einträgen besteht. Ich möchte damit mehr Performance in das suchen und ersetzen bringen.

Wenn also der Wert von Start identisch mit meinem Vergleichswert ist, dann soll das Script irgendwas machen,
wenn nicht identisch, dann ignoriere alle anderen Felder dieses Satzes und nimm den nächsten Satz etc.

Die Daten liegen in den unterschiedlichsten Formaten vor. Die zu vergleichende Datei ist eine XLSM Datei. Die vorher in eine CSV umzuwandeln bringt nichts, da ich ja den Inhalt mehrerer Dateien mit diesem Inhalt vergeleichen und ggf. etwas verändern, oder anhängen möchte - daher der Weg über das Array.

Gruß
Feuerstein08
Bitte warten ..
Mitglied: Feuerstein08
01.05.2010 um 10:59 Uhr
Hallo Torsten,

danke für deinen Tipp.
Leider bekomme ich bei meinem Beispiel dann nur :

Start: System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry
Start: System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry
Start: System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry

heraus ...

Gruß
Feuerstein08
Bitte warten ..
Mitglied: LotPings
01.05.2010 um 12:44 Uhr
Zitat von Feuerstein08:
Die Daten liegen in den unterschiedlichsten Formaten vor. Die zu vergleichende Datei ist eine XLSM Datei. Die vorher in eine CSV
umzuwandeln bringt nichts, da ich ja den Inhalt mehrerer Dateien mit diesem Inhalt vergeleichen und ggf. etwas verändern,
oder anhängen möchte - daher der Weg über das Array.

Nun ja, IMO das hat dann aber auch gar nichts mit deinem obigen Beispiel zu tun.

Für die Excel Datei kannst du den csv export von Powershell aus automatisieren,
wenn du die csv eingelesen hast liegen die Daten als sortier- und selektierbare Spalten vor.

Angenommen deine Exceltabelle sieht so aus:
Start End Finish
10 24 29
15 26 34
5 11 16
Dann erzeugt dir dieses Powershell Script :
01.
# PS xls -> csv 
02.
$xls="D:\test\Posh\test.xlt" 
03.
$csv="D:\test\Posh\mytest.csv" 
04.
 
05.
$xl=New-Object -com "Excel.Application" 
06.
$wb=$xl.workbooks.open($xls) 
07.
$wb.SaveAs($csv,6) 
08.
$xl.displayalerts=$False 
09.
$xl.quit()  
10.
 
11.
$Daten = import-csv -Delimiter ";" $csv 
12.
 
13.
$Daten|ft -auto 
14.
 
15.
$Daten | where {[int]$_.Start -gt 5} |ft -Auto 
16.
 
17.
$Daten | ?{[int]$_.Start -gt 5} | Select Start | ft -Auto
diese Ausgabe:
Start End Finish 
----- --- ------ 
10    24  29 
15    26  34 
5     11  16 
 
Start End Finish 
----- --- ------ 
10    24  29 
15    26  34 
 
Start 
----- 
10 
15
Ob meine Interpretation deiner Daten und Vorstellungen dem entspricht mußt du beantworten.

Gruß
LotPings

Edit: In Zeile 17 ist ist das "< ft -auto" natürlich witzlos war vom kopieren übrig geblieben
Bitte warten ..
Mitglied: Feuerstein08
01.05.2010 um 18:06 Uhr
Hallo LotPings,

bei mir kommen da Fehler raus. Liegt wahrscheinlich an der 2007'er Excel Version, oder?

01.
Exception calling "Open" with "1" argument(s): "Altes Format oder ungültige Typbibliothek. (Ausnahme von HRE 
02.
SULT: 0x80028018 (TYPE_E_INVDATAREAD))" 
03.
At C:\1\Test_01.ps1:8 char:23 
04.
+ $wb=$xl.workbooks.open( <<<< $xls) 
05.
You cannot call a method on a null-valued expression. 
06.
At C:\1\Test_01.ps1:9 char:11 
07.
+ $wb.SaveAs( <<<< $csv,6) 
08.
Import-Csv : A parameter cannot be found that matches parameter name 'Delimiter'. 
09.
At C:\1\Test_01.ps1:13 char:31 
10.
+ $Daten = import-csv -Delimiter  <<<< ";" $csv
Muss ich später bei einer XLSM noch etwas ändern?

Gruß
Feuerstein08
Bitte warten ..
Mitglied: LotPings
01.05.2010 um 18:51 Uhr
Zitat von Feuerstein08:
bei mir kommen da Fehler raus. Liegt wahrscheinlich an der 2007'er Excel Version, oder?
Ich habs mit 2010 Beta probiert hab aber zum test aus Versehen als 2010er .xlt

Muss ich später bei einer XLSM noch etwas ändern?
Ich habs gerade noch einmal probiert mit xlsm im kompatiblen Format ohne Probleme

Gruß
LotPings
Bitte warten ..
Ähnliche Inhalte
VB for Applications
Bestimmtes Arrayfeld mit Variable aufrufen? - VBS
gelöst Frage von gabrixlVB for Applications10 Kommentare

Hallo zusammen! Ist es möglich ein Arrayfeld mit einer Variable aufzurufen, anstatt eine Zahl zu verwenden? Das war meine ...

Entwicklung
Powershell File durchsuchen
gelöst Frage von easy4breezyEntwicklung1 Kommentar

Hallo :) Ich habe ein txt-File und möchte nach einem bestimmten String suchen und dann einen Wert ausgeben. Das ...

Batch & Shell
Durchsuchen von Unterverzeichnissen nach bestimmten Ordnern!
gelöst Frage von DeadseraphimBatch & Shell4 Kommentare

Hallo in die Runde, ich habe folgendes Problem: Im Verzeichnis: D:\Schriftverkehr befinden sich mehrere Unterverzeichnisse mit den Bezeichnungen: \Dokumentenklassen1\ ...

Visual Studio
CSharp Festplatte nach bestimmtem Ordnernamen durchsuchen
gelöst Frage von 115122Visual Studio10 Kommentare

Guten Tag :) ich brauche als Bestandteil eines kleinen Programmes eine Funktion, welche meine Festplatte beispielsweise nach allen Ordnern ...

Neue Wissensbeiträge
Perl

Perl hat heute Geburtstag: 30 Jahre Perl: Lange Gesichter zum Geburtstag

Information von Penny.Cilin vor 3 StundenPerl2 Kommentare

Hallo, auch wenn es wenige wissen und noch weniger Leute es nutzen. Perl hat heute Geburtstag. 30 Jahre Perl ...

Sicherheit

Blackberry stirbt - Keine Updates für Priv mehr

Tipp von certifiedit.net vor 4 StundenSicherheit

Blackberry wird zu einer 08/15 Firma und geht wohl mehr und mehr den Weg, den HTC schon ging. Von ...

Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 2 TagenWindows 1010 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 2 TagenSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell21 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Netzwerkgrundlagen
Belibiges Teilnetz einer Subnetzmaske rausfinden?
gelöst Frage von CenuzeNetzwerkgrundlagen17 Kommentare

Wundervollen Gutentag, mittlerweile kann ich Subnetting so einigermaßen, aber ein Problem habe ich noch. Netzwerkadresse und Boradcast errechnen ist ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless12 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Windows Server
Logging von "gesendeten Nachrichten" auf Terminalservern
gelöst Frage von Z3R0C0MM4N0THiN6Windows Server10 Kommentare

Hallo zusammen, kann mir jemand auf kurzem Wege sagen ob 1) die per Task-Manager (oder damals tsadmin) an Benutzer ...