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

gelöst Verbindung von mehreren Hash-Tabellen

Mitglied: Tobiased

Tobiased (Level 1) - Jetzt verbinden

12.02.2015, aktualisiert 13.02.2015, 735 Aufrufe, 4 Kommentare

Hallo community,

ich habe ein Problem mit meinem Powershell Skript. Dieses soll es möglich machen Daten aus einer Internetseite herraus zu lesen und als CSV Datei abzuspeichern. Dies funktioniert auch soweit, aber da das Script so dynamisch wie möglich sein soll, frage ich in einer Schleife ab, welche Spaltennahmen den später die CSV Datei haben soll.
(Kurz zur erklärung die Abfrage geschied über eine URL in dem man mit ?columns=name,address,... die ausgabe filtern kann. Diese Ausgabe erfolg in JSON.)
Jetzt ist nicht das Problem die richtige URL zu erzeugen, sondern das die Spalten auch manchmal ein Array sein können (z.b. services). Um dieses Problem zu beheben, wandle ich das Array mit hilfer dieses Befehls in einen String um:

@{Name='$services';Expression={[string]::join(",",($_.$services))}}.

Auch das klapt noch ohne Probleme, nur wie gesagt das Skript soll Dynamsich sein und am Ende meiner Ausgabe soll es nicht so wie es jetzt ist stehen

$ausgabe | select name, address,@{Name='services';Expression={[string]::join(",",($_.services))}} | export-csv $path

sondern in einer Art wie dies:

$ausgabe | select $anordnung | export-csv $pfad

So, versucht zu lösen hab ich es momentag in einer schleife die den User immer wieder fragt ob er weitere "Spaltennahmen" eingeben will. Diese eingabe wird in der Variablen $temp gespeichert und zusammen mit den folgenden 2 Befehlen inder der Schleife laufen gelassen.

$anordnungtemp = @{Name='$temp';Expression={[string]::join(",",($_.$temp))}}
$anordnung = $anordnung + "," + $anordnungtemp

(das "," benötige ich um die eingaben beim select Befehl zu trennen)

Und da ist das Problem, solange ich nur ein "Spaltennamen" eingebe funktioniert alles einwandfrei aber wenn ich einen zweiten eingebe kommt immer die Fehlermeldung:
"Das Element wurde bereits hinzugefügt. Schlüssel im Wörterbuch: "Expression". Hinzuzufügender Schlüssel: "Expression""

Ich habe auch schon versucht, die Werte in den Variablen in Anführungszeichen zu setzten, dass die Typumwandlungsbefehele nicht sofort ausgeführt werden, sonder erst in der letzten Zeile, also in der ausgabe. Dann bekomme ich zwar keine Fehlermeldung mehr, aber meine CSV Datei enthält keine Werte.

Ich hoffe ich habe mir halbwegs verständlich ausgedrück im Grunde geht es mir darum in der Zeile:

$ausgabe | select $anordnung | export-csv $pfad

anstelle von $anordnung so etwas zu bekommen

@{Name='name';Expression={[string]::join(",",($_.name))}}, @{Name='address';Expression={[string]::join(",",($_.address))}}, @{Name='services';Expression={[string]::join(",",($_.services))}}

wie, spielt dabei keine rolle, nur es muss halt dynamisch sein.

Mit freundlichen Grüßen

Tobias


Mitglied: colinardo
LÖSUNG 12.02.2015, aktualisiert 13.02.2015
Hallo Tobias, Willlkommen auf Administrator.de!
Ich würde das anders angehen und die Daten vorher schon korrekt in die Spalten des Objects $ausgabe schreiben oder korrigieren, dann musst du nicht mit einer Expression in einem Select "nachkorrigieren".
Also alle Spalten von $ausgabe durchlaufen und die Arrays in Strings umwandeln.
Zum Schluss lässt du den Anwender dann die gewünschten Spalten eingeben und machst mit dieser Variable einen select auf dein Ausgabe-Objekt.

Hier ein einfaches Beispiel:
01.
# Nur für einen Test Demodaten erzeugen 
02.
$ausgabe = new-object PSObject -Property @{"Name"="Testzeile";"Wert1"=@("Test1","Test2","Test3");"Wert2"=@("BlaA","BlaB","BlaC")} 
03.
 
04.
# Alle Spaltenname des Objekts extrahieren 
05.
$spalten = $ausgabe | gm -MemberType NoteProperty | select -ExpandProperty Name 
06.
 
07.
# Alle Daten in den Spalten des Objects in Strings wandeln 
08.
foreach($line in $ausgabe){ 
09.
    $spalten | %{$line.$_ = $line.$_ -join ','} 
10.
11.
 
12.
# User die Spalten eingeben lassen (im Format Spalte1,Spalte2,Spalte3,SpalteN) 
13.
$auswahl = (Read-host "Geben sie die Spaltennamen an mit Komma getrennt an").Split(",") 
14.
 
15.
# CSV Ausgabe 
16.
$ausgabe | select $auswahl | export-csv "C:\temp\test.csv" -Delimiter ";" -NoType
Grüße Uwe
Bitte warten ..
Mitglied: Tobiased
12.02.2015 um 16:47 Uhr
Hallo Uwe,

erst einmal danke für deine schnelle Antwort, nur leider löst sie mein Problem nicht.
Wenn ich es so mache, wie du Vorgeschlagen hast, habe ich wieder das Problem, dass die Arrays nicht richtig umgewandelt werden, welches ich mit:

@{Name='services';Expression={[string]::join(",",($_.services))}}

behoben hatte. Die CSV Datei sah wieder so aus:

"name","address","services"
"AP-01","192.168.123.25","System.Object[]"

und nicht so

"name","address","services"
"AP-01","192.168.123.25","Service1,Service2,Service3,..."

Hier einmal mein komplettes Skript, vielleicht habe ich auch nur einen Fehler gemacht, bei der Implementierung deines Skriptes:

$ausgabe = new-object PSObject -Property @{"Name"="Testzeile";"Wert1"=@("Test1","Test2","Test3");"Wert2"=@("BlaA","BlaB","BlaC")}

#Abfrage der benötigten Informationen
$Username = Read-Host "Bitte geben Sie den Nutzernamen an"
$Password = Read-Host "Bitte geben Sie das Passwort an"
$url = read-host "Bitte geben Sie die gewüncht URL ein, ohne die Einträge '?columns=...'"
$spalten = $ausgabe | gm -MemberType NoteProperty | select -ExpandProperty Name
foreach($line in $ausgabe){
$spalten | %{$line.$_ = $line.$_ -join ','}
}
$auswahl = (Read-host "Geben sie die Spaltennamen an mit Komma getrennt an").Split(",")
$url = $url + "?columns=" + $auswahl

$path = Read-Host "Bitte geben Sie den Zeilpfad der Output Datei an"


#Umwandlung der Zugangsdaten für die Internetseite
$Zugangsdaten = $Username + ":" + $Password
$bytes = [System.Text.Encoding]::ASCII.GetBytes($zugangsdaten)
$base64 = [System.Convert]::ToBase64String($bytes)
$basicAuthValue = "Basic $base64"
$headers = @{ Authorization = $basicAuthValue }


#Funktion zum Ignorieren der Wahrnung des fehlenden Sicherheitszertifikat
add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy


#Einlesen der Daten sowie deren Ausgabe als CSV Datei
$Daten = Invoke-WebRequest -uri "$url" -Headers $headers
$ausgabe = $Daten | ConvertFrom-Json
$ausgabe | select $auswahl | export-csv $path

PS: Ich würde mich auch freuen, wenn mir jemand den Trick verraten würde, wie ich den Code als Tabelle ausgeben kann ;P

Grüße Tobias
Bitte warten ..
Mitglied: colinardo
LÖSUNG 12.02.2015, aktualisiert 13.02.2015
Hier einmal mein komplettes Skript, vielleicht habe ich auch nur einen Fehler gemacht, bei der Implementierung deines Skriptes:
Das hast du leider nicht richtig in dein Script implementiert, alles etwas an der falschen Stelle plaziert, deswegen auch keine Änderung deiner Ausgabe
Bitte nutze in Zukunft Code-Tags für deinen Quellcode: <code> Quellcode </code>. Merci.
01.
#Abfrage der benötigten Informationen 
02.
$Username = Read-Host "Bitte geben Sie den Nutzernamen an" 
03.
$Password = Read-Host "Bitte geben Sie das Passwort an" 
04.
$url = read-host "Bitte geben Sie die gewüncht URL ein, ohne die Einträge '?columns=...'" 
05.
$auswahl = Read-host "Geben sie die Spaltennamen an mit Komma getrennt an" 
06.
$url = $url + "?columns=" + $auswahl 
07.
 
08.
$path = Read-Host "Bitte geben Sie den Zeilpfad der Output Datei an" 
09.
 
10.
#Umwandlung der Zugangsdaten für die Internetseite 
11.
$Zugangsdaten = $Username + ":" + $Password 
12.
$bytes = [System.Text.Encoding]::ASCII.GetBytes($zugangsdaten) 
13.
$base64 = [System.Convert]::ToBase64String($bytes) 
14.
$basicAuthValue = "Basic $base64" 
15.
$headers = @{ Authorization = $basicAuthValue } 
16.
 
17.
 
18.
#Funktion zum Ignorieren der Wahrnung des fehlenden Sicherheitszertifikat 
19.
add-type @" 
20.
using System.Net; 
21.
using System.Security.Cryptography.X509Certificates; 
22.
public class TrustAllCertsPolicy : ICertificatePolicy { 
23.
public bool CheckValidationResult( 
24.
ServicePoint srvPoint, X509Certificate certificate, 
25.
WebRequest request, int certificateProblem) { 
26.
return true; 
27.
28.
29.
"@ 
30.
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy 
31.
 
32.
 
33.
#Einlesen der Daten sowie deren Ausgabe als CSV Datei 
34.
$Daten = Invoke-WebRequest -uri "$url" -Headers $headers 
35.
$ausgabe = $Daten | ConvertFrom-Json 
36.
 
37.
# Bearbeiten der extrahierten Daten (Umwandlung der Arrays) 
38.
$spalten = $ausgabe | gm -MemberType NoteProperty | select -ExpandProperty Name 
39.
foreach($line in $ausgabe){ 
40.
    $spalten | %{$line.$_ = $line.$_ -join ','} 
41.
42.
 
43.
$ausgabe | select $auswahl.Split(",") | export-csv $path -Delimiter ";" -NoType -Encoding UTF8
PS: Ich würde mich auch freuen, wenn mir jemand den Trick verraten würde, wie ich den Code als Tabelle ausgeben kann ;P
Was meinst du damit, meinst du format-table oder was meinst du sonst mit Tabelle ? Spezifiziere mal genau wie und in welchem Format was wohin soll.

Etwa sowas ?:
$ausgabe | select $auswahl.Split(",") | format-table -AutoSize -Wrap | out-file 'C:\test.txt'
oder als HTML-Tabelle so:
$ausgabe | select $auswahl.Split(",") | Convertto-HTML | out-file 'C:\test.html'
Wie man die Daten mit einer HTML-Tabelle individuell gestalten kann kannst du in diesem Thread nachlesen:
https://www.administrator.de/forum/bestimmte-werte-csv-datei-automatisch ...

Grüße Uwe
Bitte warten ..
Mitglied: Tobiased
13.02.2015 um 08:56 Uhr
Hallo Uwe,

vielen vielen dank es funktioniert Super!
Und ich meinte damit eigenlich das hier:
01.
 Quellcode 
;P
Bitte warten ..
Ähnliche Inhalte
Windows 7
Robocopy soll hashen
Frage von maxmaxWindows 72 Kommentare

Hallo, ich habe ein Script welches mir Playlists aus iTunes exportiert und automatisch auf mein Xperia Z2 via xcopy ...

Microsoft Office
Sverweis - mehrere Tabellen durchsuchen
gelöst Frage von Florian86Microsoft Office5 Kommentare

Hallo, kann man mit SVerweis mehrere Tabellen durchsuchen??? Ich habe das schon im Netz gefunden aber irgendwie werd ich ...

Datenbanken
SQL Abfrage aus mehreren Tabellen
gelöst Frage von el-torontoDatenbanken2 Kommentare

Hallo, auf dem Bild die vereinfachte Darstellung. Problematik: - Tabelle 1 enthält hunderte Kunden und wird mit Werten und ...

Datenbanken

Access 2010 - Abfrage über mehrere Tabellen

gelöst Frage von EisbrecherinDatenbanken12 Kommentare

Hallo zusammen! Ich bin gerade etwas am Verzweifeln mit Access 2010. Meine Datenbank besteht aus folgenden Tabellen / Beziehungen: ...

Neue Wissensbeiträge
Erkennung und -Abwehr

Ups: Einfaches Nullzeichen hebelte den Anti-Malware-Schutzt in Windows 10 aus

Information von kgborn vor 11 StundenErkennung und -Abwehr

Windows 10 ist das sicherste Windows aller Zeiten, wie Microsoft betont. Insidern ist aber klar, das es da Lücken, ...

Windows 10

Windows 10 on ARM: von Microsoft entfernte Info - Klartext, was nicht geht

Information von kgborn vor 13 StundenWindows 10

Windows 10 on ARM ist ja eine neue Variante, die Microsoft im Verbund mit Geräteherstellern am Markt etablieren will. ...

Microsoft
TV-Tipp: Das Microsoft-Dilemma
Information von kgborn vor 13 StundenMicrosoft7 Kommentare

Aktuell gibt es in Behörden und in Firmen eine fatale Abhängigkeit von Microsoft und dessen Produkten. Planlos agieren die ...

Windows 10
Zero-Day-Lücke in Microsoft Edge
Information von kgborn vor 2 TagenWindows 10

In Microsofts Edge-Browser klafft wohl eine nicht geschlossene (0-Day) Sicherheitslücke im Just In Time Compiler (JIT Compiler) für Javascript. ...

Heiß diskutierte Inhalte
Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1026 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Firewall
RB2011 Firewall Rule eine bestimmte Mac oder IP Adresse nicht zu blockieren
Frage von lightmanFirewall15 Kommentare

Hallo liebes Forum mit ihren Spezialisten. Ich habe meine Firewall so konfiguriert das kein Endgerät ohne meine Speziellen Erlaubnis ...

Humor (lol)
Was könnte man mit einem Server machen? Idee gesucht
Frage von 2SeitenHumor (lol)15 Kommentare

Hey Zusammen Ich habe einen alten HP G2 Rackserver zu Hause rumliegen. 28GB Ram, 1xAMD Prozi mit etwa 2GHz. ...

Webbrowser
Welcher Browser ist der Beste?
Frage von justtinWebbrowser13 Kommentare

Hallo Leute Ich habe eine interessante Frage. Mich wurde mal interessieren welcher Browser ist eure meinung nach der beste? ...