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

Frage Entwicklung Batch & Shell

Mitglied: Tobiased

Tobiased (Level 1) - Jetzt verbinden

12.02.2015, aktualisiert 13.02.2015, 717 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 ..
Ä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
Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 10 StundenBatch & Shell8 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 12 StundenHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 1 TagSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Heiß diskutierte Inhalte
Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server17 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...

Windows 10
Bitlocker nach Verschlüsselung nicht mehr aufrufbar!
gelöst Frage von alexlazaWindows 1013 Kommentare

Hallo, ich besitze ein HP ZBook 17 G4 mit einem Windows 10 Pro Betriebssystem. Bei diesem Problem handelt sich, ...

Batch & Shell
Neuste Datei via PowerShell kopieren
gelöst Frage von kaiuwe28Batch & Shell11 Kommentare

Hallo zusammen, ich hatte mir mit Hilfe der Suche im Forum einen kleinen Code von colinardo rausgesucht und versucht ...