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 Powershell - Webseite auslesen und Abspeichern ein paar Probleme

Mitglied: kime203

kime203 (Level 1) - Jetzt verbinden

22.08.2019 um 15:03 Uhr, 451 Aufrufe, 18 Kommentare, 3 Danke

Hallo alle miteinander,


ich hab die Aufgabe eine Webseite auszulesen um Einsatzdaten der Feuerwehr daraus zu gewinnen. Das habe ich soweit auch schon am laufen. Dazu ist es notwendig mit Cookies zu arbeiten. So schaut das aus.

01.
[System.Uri]$uri="https://demo.demo/"
02.

03.
$Cookie= New-Object System.Net.Cookie
04.
$Cookie.Name = "demo"
05.
$Cookie.Value = "demo"
06.
$Cookie.Domain = $uri.DnsSafeHost
07.

08.
$WebSession = New-Object Microsoft.PowerShell.Commands.WebRequestSession
09.
$WebSession.Cookies.Add($Cookie)
10.
$props= @{ Uri=$uri.AbsoluteUri
11.
WebSession=$Websession}
12.

13.
$data = Invoke-RestMethod @props
14.

15.
$data.Einsatzdata | Format-List -Property EinsatzID,Alarmstufe,Meldebild,Lat,Lng,Nummer1,Plz,Strasse,Ort,Bemerkung,EinsatzErzeugt,Melder,MelderTelefon  > "c:\temp\einsatz.txt"
das kommt dabei so raus

01.
EinsatzID      : XXX
02.
Alarmstufe     : B2
03.
Meldebild      : Wohnungsbrand
04.
Lat            : 99,999999
05.
Lng            : 99,999999
06.
Nummer1        : 99
07.
Plz            : 9999
08.
Strasse        : XXX
09.
Ort            : XXX
10.
Bemerkung      : XXX
11.
EinsatzErzeugt : 2019-08-21T11:36:56.6284335+02:00
12.
Melder         : Max Mustermann
13.
MelderTelefon  : 000
Soweit so gut jetzt habe ich noch 2 Problem

1. Lat und bei Lng muss ist anstelle des , einen . setzten da die verarbeitende Software das nur so versteht. Das habe ich so versucht
01.
$data.Einsatzdata.Lat -Replace ',', '.'
das funktioniert auch aber nicht ganz so wie ich das möchte. So wir eine neue Zeile gemacht und nicht die vorhanden geändert.

Bei dem Punkt EinsatzErzeugt müsste das Datum und die Uhrzeit so angezeigt werden 01.01.2019 23:00:00
01.
$zeit = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
Wie ich das so bekomme habe ich geschafft aber wie ich es ersetze leider auch wieder nicht.

2. Dieser Script sollt immer laufen und die Webseite überprüfen ob eine Veränderung stattgefunden hat. Zu dem Punkt habe ich noch nicht wirklich etwas gefunden. Wenn kein Einsatz ist und ich den Script ausführe wir eine 0 Bit Größe Datei gemacht da die Webseite dann keinen Inhalt hat. Toll wäre es wenn das so ist das keine Datei angelegt wird und dann nach 30 sek erneut angefragt wird ob jetzt eine Änderung ist.

Ich hoffe ich konnte mein Anliegen verdeutlichen und bin über jede Hilfe sehr dankbar. Sollte jemand eine andere Lösung für die Aufgabe haben dann bitte her damit

LG Alex
Mitglied: 140777
22.08.2019, aktualisiert um 16:19 Uhr
Daten im Format-List Format zu bearbeiten macht man nicht, das ist Humbug! Also direkt die Objekte bearbeiten.
01.
$result = $data.Einsatzdata | select EinsatzID,Alarmstufe,Meldebild,Lat,Lng,Nummer1,Plz,Strasse,Ort,Bemerkung,EinsatzErzeugt,Melder,MelderTelefon
02.
$result.Lat = $result.Lat.toString().replace(',','.')
03.
$result.Lng = $result.Lng.toString().replace(',','.')
04.
$result.EinsatzErzeugt = Get-Date $result.EinsatzErzeugt.toString() -F "dd/MM/yyyy HH:mm:ss"
05.
# export als CSV
06.
$result | export-csv "c:\temp\einsatz.csv" -NoType -Delimiter ";" -Encoding UTF8
07.
# oder als Text
08.
$result | fl * | sc "c:\temp\einsatz.txt"
Dieser Script sollt immer laufen und die Webseite überprüfen ob eine Veränderung stattgefunden hat
Aufgabenplanung.
Wenn kein Einsatz ist und ich den Script ausführe wir eine 0 Bit Größe Datei gemacht da die Webseite dann keinen Inhalt hat.
Prüfe halt einfach die Variable in Zeile 13 des Invoke-Restmethod auf Inhalt mit nem simplen if(){ } ...
Was die an Inhalt hat können wir hier ja nicht testen mangels URL. Lass dir mit Get-Member die zurückgegebenen Werte anzeigen dann kannst du entsprechend mit if Abfrage verzweigen.
Bitte warten ..
Mitglied: kime203
22.08.2019 um 16:15 Uhr
Ok also das funktioniert so leider mal nicht es kommt dieser Fehler
01.
Fehler beim Aufrufen der Methode, da [System.Decimal] keine Methode mit dem Namen "replace" enthält.
02.
In C:\Users\global\Einsatz_Monitor\einsatz1.ps1:23 Zeichen:1
03.
+ $result.Lat.replace(',','.')
04.
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
05.
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
06.
    + FullyQualifiedErrorId : MethodNotFound
und auch sonst wird nichts ausgegeben.

Aufgabenplanung das er alle 30 sek den Script laufen lassen soll? Ok dachte vielleicht gibt es da direkt etwas.

Ok if(){ } ... leider bin ich nicht sehr vertraut mit PowerShell und kann jetzt nicht ganz verstehen wie das helfen soll kann.

Danke für deine Antwort vielleicht finden wir ja noch eine Lösung.
Bitte warten ..
Mitglied: 140777
LÖSUNG 22.08.2019, aktualisiert um 16:45 Uhr
Oben korrigiert, habe hier ja die deine Originaldaten nicht sorry! Wenn du die URL posten würdest könnte man es direkt fertig machen.

Aufgabenplanung das er alle 30 sek den Script laufen lassen soll? Ok dachte vielleicht gibt es da direkt etwas.
Kannst auch eine while(){} DauerSchleife laufen lassen. Jacke wie Hose.


Ok if(){ } ... leider bin ich nicht sehr vertraut mit PowerShell und kann jetzt nicht ganz verstehen wie das helfen soll kann.
Naja, nachschlagen wäre mal die erste Methode ... https://www.windowspro.de/script/if-else-switch-bedingte-anweisungen-pow ...

z.B.
01.
if ($data){
02.
    $result = $data.Einsatzdata | select EinsatzID,Alarmstufe,Meldebild,Lat,Lng,Nummer1,Plz,Strasse,Ort,Bemerkung,EinsatzErzeugt,Melder,MelderTelefon
03.
    $result.Lat = $result.Lat.toString().replace(',','.')
04.
    $result.Lng = $result.Lng.toString().replace(',','.')
05.
    $result.EinsatzErzeugt = Get-Date $result.EinsatzErzeugt.toString() -F "dd/MM/yyyy HH:mm:ss"
06.
    # export als CSV
07.
    $result | export-csv "c:\temp\einsatz.csv" -NoType -Delimiter ";" -Encoding UTF8
08.
    # oder als Text
09.
    $result | fl * | out-string | sc "c:\temp\einsatz.txt"
10.
}
Aber ich weiß ja nicht welchen Inhalt dein $data hat wenn die Webseite nichts liefert deswegen kann ich hier nur mutmaßen. Deswegen der Hinweis lass dir den Inhalt bzw. die Member von $data ausgeben
01.
$data | Get-Member
Wenn dann die Fehlermeldung kommt das es keine Member von einem null Objekt gibt dann funktioniert obige Abfrage, ansonsten ist die Bedingung anzupassen, je nachdem was Invoke-RestMethod liefert wenn die Webseite keinen Inhalt zurückgibt.
Bitte warten ..
Mitglied: kime203
22.08.2019 um 16:39 Uhr
Danke für deine Hilfe selbst wenn ich dir die URL gebe funktioniert das nicht da es über einen Token gesichert ist daher habe ich das raus genommen.

while(){} hört sich gut an (ich lese durch aus vorher was das ist aber mir fehlt da leider noch der Durchblick dafür sorry)

Dein Script hat mir das jetzt ausgeben
01.
Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
02.
Microsoft.PowerShell.Commands.Internal.Format.GroupStartData
03.
Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData
04.
Microsoft.PowerShell.Commands.Internal.Format.GroupEndData
05.
Microsoft.PowerShell.Commands.Internal.Format.FormatEndData
$data ist ein json Datei mit diesem Inhalt der bei einem Aktiven Einsatz dort zu finden ist. Wenn keine Einsatz Aktiv ist ist dort nichts.
01.
EinsatzID      : XXX
02.
Alarmstufe     : B2
03.
Meldebild      : Wohnungsbrand
04.
Lat            : 99,999999
05.
Lng            : 99,999999
06.
Nummer1        : 99
07.
Plz            : 9999
08.
Strasse        : XXX
09.
Ort            : XXX
10.
Bemerkung      : XXX
11.
EinsatzErzeugt : 2019-08-21T11:36:56.6284335+02:00
12.
Melder         : Max Mustermann
13.
MelderTelefon  : 000
Kannst du mir das mit dem Get-Member genauer erklären das hab ich auch schon versucht aber da ist nix dabei raus gekommen so recht.
Bitte warten ..
Mitglied: 140777
22.08.2019, aktualisiert um 16:50 Uhr
Was gibt ein
01.
$data.GetType()
zurück? Es gibt hier nämlich einige Varianten wie Daten zurückgegeben werden können, Der JSON String wird normalerweise von Invoke-Restmethod direkt zu einem Object oder einem Array konvertiert und je nachdem wie das JSON formatiert ist ist dies eben unterschiedlich aufgebaut und muss unterschiedlich behandelt werden! Wenn das nämlich ein Array ist muss das Ansprechen z.B. so geschehen $data[0].EinsatzID
Bitte warten ..
Mitglied: kime203
22.08.2019 um 16:49 Uhr
01.
IsPublic IsSerial Name                                     BaseType                                                                                                                           
02.
-------- -------- ----                                     --------                                                                                                                           
03.
True     False    PSCustomObject                           System.Object                                                                                                                      
Bitte warten ..
Mitglied: 140777
LÖSUNG 22.08.2019, aktualisiert um 16:53 Uhr
Ok in dem Fall sollte ein zwischengeschaltetes Out-string helfen
01.
$result | fl * | out-string | sc "c:\temp\einsatz.txt"
Bitte warten ..
Mitglied: kime203
22.08.2019 um 17:08 Uhr
Ok das funktioniert jetzt genau so wie gewünscht danke.

Kannst du mir mit dem while(){} noch helfen ;)
Bitte warten ..
Mitglied: 140777
LÖSUNG 22.08.2019, aktualisiert um 18:31 Uhr
Kannst ja noch ein Detail vorher noch auf Unterschied zum letzten Request checken und nur dann in die Datei ausgeben (ergänzt).
01.
# rest ... von vor Zeile 13
02.
$lastID = 0
03.
while($true){
04.
    $data = Invoke-RestMethod @props
05.
    if ($data){
06.
        $result = $data.Einsatzdata | select EinsatzID,Alarmstufe,Meldebild,Lat,Lng,Nummer1,Plz,Strasse,Ort,Bemerkung,EinsatzErzeugt,Melder,MelderTelefon
07.
        if ($result.EinsatzID -ne $lastID){
08.
            $result.Lat = $result.Lat.toString().replace(',','.')
09.
            $result.Lng = $result.Lng.toString().replace(',','.')
10.
            $result.EinsatzErzeugt = Get-Date $result.EinsatzErzeugt.toString() -F "dd/MM/yyyy HH:mm:ss"
11.
            $result | fl * | out-file "c:\temp\einsatz.txt"
12.
            $lastID = $result.EinsatzID
13.
        }
14.
    }
15.
    sleep -Seconds 5
16.
}
Bitte warten ..
Mitglied: kime203
22.08.2019 um 17:16 Uhr
Danke Danke Danke genau so jetzt verstehe ich auch besser wie das zusammenspiele lauft.
Bitte warten ..
Mitglied: kime203
22.08.2019 um 17:37 Uhr
Ok doch nicht ganz ich hab das mit while verstanden und mit true ist das ein loob der endlos läuft nur eine abfrage ob hier sich etwas geändert hat. Du hast das vorher schon angesprochen mit

Prüfe halt einfach die Variable in Zeile 13 des Invoke-Restmethod auf Inhalt mit nem simplen if(){ } ...
Was die an Inhalt hat können wir hier ja nicht testen mangels URL. Lass dir mit Get-Member die zurückgegebenen Werte anzeigen dann kannst du entsprechend mit if Abfrage verzweigen.

Wo baut man das jetzt noch dazu ein? Wenn ich zB schauen will ob sich EinsatzID geändert hat und wenn die nicht vorhanden ist schreibe auch keine Datei.
Bitte warten ..
Mitglied: 140777
22.08.2019, aktualisiert um 17:53 Uhr
Wenn ich zB schauen will ob sich EinsatzID geändert hat und wenn die nicht vorhanden ist schreibe auch keine Datei.
Ist oben eingesetzt. Das ganze speichert die letzte EinsatzID beim schreiben der Textdatei in der Variablen $lastID. Wenn bei einem erneuten Abruf der Seite sich die aktuelle EinsatzID von der letzten unterscheidet dann wird die Textdatei neu geschrieben ansonsten nicht. Wäre ja Blödsinn alle 5 Sekunden die Datei neu zu schreiben obwohl sich nichts auf der Seite geändert hat .
Ich gehen hier natürlich davon aus das die EinsatzID bei jedem neuen Einsatz anders ist als der vorherige. Ansonsten ändere die Eigenschaft einfach auf die die du dazu benutzen willst.
Bitte warten ..
Mitglied: kime203
22.08.2019 um 17:58 Uhr
Ja das ist richtig jeder Einsatz hat eine neue ID. Das klapp. Er schreibt zwar einmal noch eine leere Datei aber das wir wohl so sein. $lastID = "" was bewirkt der da jetzt nur damit ich es auch verstehe.
Bitte warten ..
Mitglied: 140777
22.08.2019, aktualisiert um 18:02 Uhr
Zitat von kime203:
$lastID = "" was bewirkt der da jetzt nur damit ich es auch verstehe.
Das ist einfach nur das initiales Deklarieren der Variablen ohne Inhalt, hinterher enthält die ja jeweils immer die letzte ID.
Auch hier hilft wieder nachschlagen: Variablen in PowerShell: Namen, Werte, Datentypen
Bitte warten ..
Mitglied: kime203
22.08.2019 um 18:02 Uhr
Ja alle deine Links habe ich die letzten Tage schon mal gelesen nur das merken ist noch so eine Sache
Bitte warten ..
Mitglied: 140777
22.08.2019, aktualisiert um 18:04 Uhr
Zitat von kime203:
nur das merken ist noch so eine Sache
Da hilft nur üben üben und nochmal üben, wie überall . Selbst Übungsaufgaben stellen und so lange dran bleiben bis es klappt auch mal ohne Forum, nur so bleibt es wirklich hängen.

Viel Erfolg weiterhin.

Ciao.
Bitte warten ..
Mitglied: kime203
22.08.2019 um 18:14 Uhr
Danke noch mal ich hab jetzt noch das geändert
01.
if ($result.EinsatzID -gt $lastID)
mit -gt anstelle von -ne wird nur eine Datei erstellt wenn auch etwas drin steht.

Auf jedenfalls noch mal ein Größe Dankeschön.
Bitte warten ..
Mitglied: 140777
22.08.2019, aktualisiert um 18:55 Uhr
In dem Fall ist die EinsatzID vom Typ Integer bzw. eine Zahl, da reicht es wenn du in die Deklaration von $lastID statt einem String eine 0 schreibst, dann geht es ebenfalls problemlos mit -ne, aber wenn die ID sowieso immer größer wird geht das natürlich auch mit -gt .
Aber auch wenn der Inhalt von $lastID ein String wäre wäre der Vergleich einer Zahl mit einem leerem String $true muss also auch gehen, kannst du ganz einfach selbst testen
01.
10 -ne ""
Ergibt
$true
If Bedingung wird also ausgeführt.

mit -gt anstelle von -ne wird nur eine Datei erstellt wenn auch etwas drin steht.
Achso so die Website gibt also in jedem Fall immer ein Object zurück, nur eben alle Properties ohne Werte? In dem Fall ist die eine IF-Bedingung die $data checkt nicht passend.
In dem Fall musst du die Zeile
if ($data){
so schreiben
01.
if ($data.EinsatzData.EinsatzID -gt 0){
Dann ist das damit schon abgefackelt. Ich war davon ausgegangen das die Webseite überhaupt nichts zurückgibt ...
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
PowerShell Transkript Problem
Frage von MarabuntaBatch & Shell5 Kommentare

Hi, ich will in einem Transkript Log(Start-Transcript) die Ordnerinhalte auflisten Das funktioniert: Das hier allerdings nicht: Der entsprechende Eintrag ...

Batch & Shell
PowerShell Object problem
gelöst Frage von CloudyBatch & Shell3 Kommentare

Hallo, ich habe aktuell ein kleines Problem. Ich erhalte eine CSV Datei mit den Spalten Standort und IP-Adresse zu ...

Batch & Shell
Powershell Problem IF Statement
gelöst Frage von copybyteBatch & Shell3 Kommentare

Hallo liebe Admins, ich bin neu in Powershell eingertiegen und habe mit Hilfe und Beispielen schon Einiges gebaut. Jetzt ...

Batch & Shell

PowerShell Sendmailmessage attachement Problem

gelöst Frage von BalgorBatch & Shell15 Kommentare

Hallo, nach einigen Tagen des Versuchens und Googelns versuche ich hier eine Lösung für unser Problem zu finden. Kurzer ...

Neue Wissensbeiträge
Windows Server

Active Directory ESE Version Store Changes in Server 2019

Information von Dani vor 3 TagenWindows Server

Moin, Last month at Microsoft Ignite, many exciting new features rolling out in Server 2019 were talked about. But ...

Exchange Server

Microsoft Extending End of Support for Exchange Server 2010

Information von Dani vor 3 TagenExchange Server4 Kommentare

Moin, After investigating and analyzing the deployment state of an extensive number of Exchange customers we have decided to ...

Schulung & Training

Humble Book Bundle: Network and Security Certification 2.0

Tipp von NetzwerkDude vor 3 TagenSchulung & Training

Abend, bei HumbleBundle gibts mal wider ein schönes Paket e-books: sind verschiedene Zertifizierungen wie MCSA, CCNA, CompTIA etc., für ...

Voice over IP

Telekom Umstellung von ISDN Anlagenanschluss auf IP-Telefonie

Erfahrungsbericht von NixVerstehen vor 6 TagenVoice over IP11 Kommentare

Hallo zusammen, nachdem nun vor ein paar Tagen die zwangsweise Umstellung von ISDN auf IP-Telefonie problemlos über die Bühne ...

Heiß diskutierte Inhalte
VB for Applications
Euro-Zeichen in jedem neu erstellten Brief mit Word automatisch entfernen
gelöst Frage von imebroVB for Applications23 Kommentare

Hallo, ich habe ein Problem mit Word, bzw. mit dem €-Zeichen, welches bei Erstellung eines Word-Briefes automatisch eingesetzt wird. ...

Batch & Shell
Regedit eintrad ändern als Admin
Frage von cyberworm83Batch & Shell19 Kommentare

Hallo zusammen, ich bin derzeit als Rollout Techniker unterwegs und muss täglich bei zig Rechnern einen Registry Einträg ändern ...

Visual Studio
Prüfen, ob Programm schon disposed wurde
Frage von MarcoBornVisual Studio17 Kommentare

Hallo Forum, ich habe in VB.NET ein Programm geschrieben, welches Word startet und dort Daten ausliest. Obwohl ich die ...

Router & Routing
Mikrotik Config PTP
Frage von Marcel94Router & Routing17 Kommentare

Hallo, kennt sich jemand mit Mikrotik aus? Möchte gerne eine PTP Verbindung mit zwei SYTsq 5ac Antennen erstellen. So ...