Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Frage Entwicklung Batch & Shell

Mitglied: Tobiased

Tobiased (Level 1) - Jetzt verbinden

12.02.2015, aktualisiert 13.02.2015, 633 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:
http://www.administrator.de/frage/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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows Server
RODC über VPN - Verbindung weg (10)

Frage von stefan2k1 zum Thema Windows Server ...

Router & Routing
OpenVpn Verbindung Synology NAS hinter Zywall USG 40 (2)

Frage von Tirgel zum Thema Router & Routing ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...