datobsn
Goto Top

Wetter mit Batch verwenden??? Wie???

Hallo Comunity, ich bin´s mal wieder :D
Ich arbeite zur Zeit an einem Batch-Programm, was mir beim Start verschiedene Sachen anzeigt, unteranderem auch das Wetter, also wie viel grad es hat und so. Jedoch komme ich da nicht weiter...vielleicht kann mir ja Jemanden von euch helfen :D
Vielen Dank im voraus :D

Content-ID: 300110

Url: https://administrator.de/contentid/300110

Ausgedruckt am: 08.11.2024 um 07:11 Uhr

rubberman
rubberman 25.03.2016 um 22:36:02 Uhr
Goto Top
Hallo DaTobsn.

Ich arbeite zur Zeit an einem Batch-Programm, was mir beim Start verschiedene Sachen anzeigt, unteranderem auch das Wetter
... Will ich sehen. Woher kommen denn die Wetterdaten bei dir?

Grüße
rubberman
127944
127944 26.03.2016 um 00:46:31 Uhr
Goto Top
Welche Plattform: FreeDOS?
agowa338
agowa338 26.03.2016 aktualisiert um 02:26:54 Uhr
Goto Top
Mittels PowerShell klingt das für mich noch realisierbar, aber nur mit Batch ist es definitiv nicht möglich.

Und hier das cmdlet für Powershell: Get-Weather
Endoro
Endoro 26.03.2016 um 09:17:52 Uhr
Goto Top
Hey,

Zitat von @agowa338:

aber nur mit Batch ist es definitiv nicht möglich.


sagt wer?

Gruß, Endoro
colinardo
colinardo 26.03.2016 aktualisiert um 10:30:49 Uhr
Goto Top
@echo off
powershell -Executionpolicy ByPass -Command "((iwr -uri 'http://www.wetter.de/deutschland/wetter-berlin-18228265.html').AllElements | ?{$_.class -eq 'row-weather-report'}).innerText"  
(PS 3.0)
Nur ein Beispiel von 1Mio. Möglichkeiten face-smile

Mit Batch geht das auch, z.B. mit Hilfe von curl oder wget und dann entweder aufwändiges ausfiltern mit findstr for Schleifen etc. aber wer macht das heute noch so ? Mit etwas VBS-Würze ebenfalls komplett in Batch einbettbar. Also alles machbar.

Grüße Uwe
agowa338
agowa338 26.03.2016 um 11:58:39 Uhr
Goto Top
Naja, mir ging es eher darum, dass es nicht nur mit Batch möglich ist.
DaTobsn
DaTobsn 26.03.2016 aktualisiert um 13:23:47 Uhr
Goto Top
Und wie funktioniert des? Ich bin etz in dem Gebiet ned gerade ein Genie, also ich hab keinen Plan, was zum Beispiel "cmdlet" oder PowerShell ist :D
Ich habe aber von jemand anderen eine Datei bekommen, die das Wetter anzeigen kann. Und da heißen auch ein paar Dateien : "location.txt", "parseforecast.vbs", "parsetoday.vbs", und "WGET.GID".
Naja, vielleicht hilft des :D
@agowa338
DaTobsn
DaTobsn 26.03.2016 aktualisiert um 13:23:07 Uhr
Goto Top
Woher wäre egal. Von einem Freund verwenden die Dateien bbc.uk und da die Wettervorhersage für die nächsten drei Tage. Mir würde es schon reichen wenn ich das Wetter für heute sehen könnte :D
Naja, wie, du willst es sehen? Bei verschiedenen Sachen habs ich ja schon, zum Beispiel den Username, das Datum oder die Uhrzeit :D
@rubberman
DaTobsn
DaTobsn 26.03.2016 aktualisiert um 13:22:31 Uhr
Goto Top
Also muss ich den Code oben einfach nur copy und paste machen und das Wetter als eine Variable nutzen? Sry ich bin in dem Gebiet ned gerade ein Profi ^^ @colinardo
colinardo
colinardo 26.03.2016 aktualisiert um 14:28:49 Uhr
Goto Top
Zitat von @DaTobsn:

Also muss ich den Code oben einfach nur copy und paste machen und das Wetter als eine Variable nutzen? Sry ich bin in dem Gebiet ned gerade ein Profi ^^ @colinardo
Ja, mindestens eine installierte PS 3.0 ist für den Schnippsel erforderlich (wenn nur PS2.0 vorhanden ist muss man es anders umschreiben).

screenshot

Das war ja nur ein simples Beispiel von der Seite wetter.de. Die URL für deinen Standardort kannst du dir von deren Seite holen. Mit Anpassungen lässt sich das auch für jede andere Wetter-Seite verwenden, aber wie gesagt jede Seite ist anders aufgebaut, also muss auch der Code entsprechend angepasst werden.
rubberman
rubberman 26.03.2016 um 14:20:55 Uhr
Goto Top
Woher wäre egal.
Naja, eine API muss es schon sein, sonst sind die Daten nicht vernünftig scriptbar.
Beispiel mit der Yahoo! Wetter-API und einem Batch mit JScript (als *.bat speichern).
@if (@a)==(@b) @end /*
@echo off &setlocal

set "city=Berlin"  
call :assignConditions
for /f "tokens=1-4 delims=$" %%i in ('cscript //nologo //e:jscript "%~fs0" "%city%"') do (  
  echo %%i
  echo %%j
  echo %%k Grad C
  call echo %%cond%%l%%
)

pause
exit /b

:assignConditions
set "cond0=Tornado"  
set "cond1=tropischer Sturm"  
set "cond2=Hurrikan"  
set "cond3=schwere Gewitter"  
set "cond4=Gewitter"  
set "cond5=Schneeregen"  
set "cond6=Graupelschauer"  
set "cond7=Schneegraupel"  
set "cond8=gefrierender Spruehregen"  
set "cond9=Spruehregen"  
set "cond10=gefrierender Regen"  
set "cond11=Schauer"  
set "cond12=Schauer"  
set "cond13=Schneegestoeber"  
set "cond14=leichte Schneeschauer "  
set "cond15=wehender Schnee"  
set "cond16=Schnee"  
set "cond17=Hagel"  
set "cond18=Schneeregen "  
set "cond19=Staub"  
set "cond20=dunstig"  
set "cond21=Dunst"  
set "cond22=neblig"  
set "cond23=stuermisch"  
set "cond24=windig"  
set "cond25=kalt"  
set "cond26=bewoelkt"  
set "cond27=meist bewoelkt (Nacht)"  
set "cond28=ueberwiegend bewoelkt (Tag)"  
set "cond29=teilweise bewoelkt (Nacht)"  
set "cond30=teilweise bewoelkt (Tag)"  
set "cond31=klar (Nacht)"  
set "cond32=sonnig"  
set "cond33=schoen (Nacht)"  
set "cond34=schoen (Tag)"  
set "cond35=Hagelregen"  
set "cond36=heiss"  
set "cond37=einzelne Gewitter"  
set "cond38=vereinzelte Gewitter"  
set "cond39=vereinzelte Gewitter"  
set "cond40=vereinzelte Schauer"  
set "cond41=schwere Schneefaelle"  
set "cond42=vereinzelte Schneeschauer "  
set "cond43=schwere Schneefaelle"  
set "cond44=wechselnd bewoelkt"  
set "cond45=Gewitterschauer "  
set "cond46=Schneeschauer "  
set "cond47=einzelne Gewitterschauer"  
set "cond3200=nicht verfuegbar"  
exit /b

*/
var objXMLHTTP = new ActiveXObject('Microsoft.XMLHTTP');  
objXMLHTTP.Open('GET', 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22' + WScript.Arguments.Item(0) + '%22)%20and%20u%3D%22c%22&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys', false);  
objXMLHTTP.Send();
if (objXMLHTTP.readyState == 4 && objXMLHTTP.status == 200) {
  var oXmlDoc = objXMLHTTP.responseXML;
  var s = oXmlDoc.documentElement.selectSingleNode('//results/channel/title').text + '$';  
  s += oXmlDoc.documentElement.selectSingleNode('//results/channel/item/pubDate').text + '$';  
  s += oXmlDoc.documentElement.selectSingleNode('//results/channel/item/yweather:condition').getAttribute('temp') + '$';  
  s += oXmlDoc.documentElement.selectSingleNode('//results/channel/item/yweather:condition').getAttribute('code');  
  WScript.Echo(s);
}
Grüße
rubberman
colinardo
colinardo 26.03.2016 aktualisiert um 14:40:01 Uhr
Goto Top
Mit API hab ich da auch noch was ...
@echo off
set "ort=Berlin"  
powershell -ExecutionPolicy ByPass -Command "$r=(new-Object System.Net.WebClient).DownloadString('http://api.openweathermap.org/data/2.5/weather?q=%ort%&APPID=1ccdcf4ab69dcf58ceb56740c8c00e75&units=metric') | ConvertFrom-Json;write-host \"Ort: $($r.name)`nTemperatur: $($r.main.temp) C`nDruck: $($r.main.pressure) hPa`nWind: $($r.wind.speed) m/s / Richtung: $($r.wind.deg) Grad`nWolken: $($r.clouds.all) %%\""  
DaTobsn
DaTobsn 26.03.2016 aktualisiert um 17:41:35 Uhr
Goto Top
Ok mal eine gaaaanz große Frage, damit ich hier irgendwas verstehe :D
Was ist ein(e) API ??????
@colinardo
@rubberman
@agowa338
Pjordorf
Pjordorf 26.03.2016 um 18:20:09 Uhr
Goto Top
Hallo,

Zitat von @DaTobsn:
Was ist ein(e) API ??????
Eine Schnittstelle....und deine 5 zusätzlichen Fragezeichen waren eine kaputte Tastatur, oder?
https://de.wikipedia.org/wiki/Programmierschnittstelle

Gruß,
Peter
114757
114757 26.03.2016 aktualisiert um 18:30:48 Uhr
Goto Top
Wat geht denn hier ab face-smile
Zitat von @DaTobsn:
Ok mal eine gaaaanz große Frage, damit ich hier irgendwas verstehe :D
Was ist ein(e) API ??????
Bist du dir gaaaaanz sicher das du Entwickler bist?!

Application Programming Interface

Gruß jodel32
DaTobsn
DaTobsn 26.03.2016 aktualisiert um 19:13:57 Uhr
Goto Top
D.h. eine API ist sozusagen das, was das Programm raus gibt, oder ?
Weil bei einer Batch-Datei kann man ja eigentlich keine "richtigen" Grafiken oder gar Buttons erstellen.
Aber ein "Interface" ist doch eben genau das mit den Grafiken und Buttons!

Und zu der Frage, ob ich überhaupt ein Entwickler bin, das habe ich nie behauptet. Ich glaube, das passendere Wort, was mich beschreibt, wäre eher Hobbyinformatiker oder so....
Darum frage ich hier ja auch rum! Wäre ich ja ein guter Entwickler, müsste ich mich ja hier nicht erkundigen! @114757
rubberman
rubberman 26.03.2016 aktualisiert um 19:59:11 Uhr
Goto Top
D.h. eine API ist sozusagen das, was das Programm raus gibt, oder ?
Nein, das ist das, was einem Programm(ierer) als Schnittstelle zur Verfügung gestellt wird. In diesem Fall: Die Daten liegen irgendwo in einer Serverdatenbank, auf die du keinen direkten Zugriff hast. Aber es wird dir eine Programmierschnittstelle zur Verfügung gestellt, mit der du Daten abfragen kannst. Das Ergebnis diese Abfrage ist hier ein XML oder wahlweise ein JSON Code, mit festgelegtem, immer gleichem Aufbau. Das heißt, mit entsprechenden Mitteln, die dir eine Script- oder Programmiersprache bietet (oder im Fall von Batch nicht bietet, darum muss man eine andere Sprache bemühen), kann man diese Daten verarbeiten und kommt an die entsprechenden Werte.

Wikipedia zum Thema (wobei ... hatte Peter ja bereits verlinkt ... )

Aber ein "Interface" ist doch eben genau das mit den Grafiken und Buttons!
Nein.

Grüße
rubberman
DaTobsn
DaTobsn 26.03.2016 aktualisiert um 20:05:17 Uhr
Goto Top
Andere Sprache ist zum Beispiel C, C++, QBasic, VB, Java und so weiter? @rubberman
in den Daten von jmd anderen sind unter dem Verzeichnis "weather" schon VBScript-Dateien angelegt worden, jedoch funktionieren die nicht, bzw werde ich aus denen nicht schlau wenn ich die im Texteditor öffne, da sie in VBS wegen einem Fehler nicht geöffnet werden können...

Hier der Inhalt der Datei parseforecast.vbs im Texteditor:
Dim xmlDoc, objNodeList, plot

Set wshShell = CreateObject( "WScript.Shell" )
tfolder = wshShell.ExpandEnvironmentStrings("%TEMP%")
Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.load(tfolder & "\Next3DaysRSS.xml")
Set objNodeList = xmlDoc.getElementsByTagName("channel/item/title") 'Node to search for
Set objFSO = CreateObject("Scripting.FileSystemObject")

' Write all found results into forecast.txt
Const ForWriting = 2
Set objTextFile = objFSO.OpenTextFile _
(tfolder & "\forecast.txt", ForWriting, True)
If objNodeList.length > 0 then
For each x in objNodeList
plot=x.Text
objTextFile.WriteLine(plot)
Next
objTextFile.Close
End If

'Extract tomorrows data (second line) from 'forecast.txt' and write each data type to seperate line in tomorrow.txt
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
(tfolder & "\forecast.txt", ForReading)
objTextFile.Skipline
strNextLine = objTextFile.Readline
currentsplit = Split(strNextLine , ", ")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(tfolder & "\tomorrow.txt", ForWriting, True)
objTextFile.WriteLine(currentsplit(0))
For i = 1 to Ubound(currentsplit)
objTextFile.WriteLine(currentsplit(i))
Next

' Get individual data

' Condition
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
(tfolder & "\tomorrow.txt", ForReading)
strNextLine = objTextFile.Readline
conditionsplit = Split(strNextLine , ": ")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(tfolder & "\condition.txt", ForWriting, True)
objTextFile.WriteLine(conditionsplit(1)) 'Number value determines which line to write; 0 = 1st

' Maximum Temperature
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
(tfolder & "\tomorrow.txt", ForReading)
objTextFile.Skipline
strNextLine = objTextFile.Readline
maxtempsplit = Split(strNextLine , "°C")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(tfolder & "\maxtemp.txt", ForWriting, True)
objTextFile.WriteLine(maxtempsplit(0))

' Minimum Temperature
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
(tfolder & "\tomorrow.txt", ForReading)
objTextFile.Skipline
objTextFile.Skipline
strNextLine = objTextFile.Readline
mintempsplit = Split(strNextLine , "°C")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(tfolder & "\mintemp.txt", ForWriting, True)
objTextFile.WriteLine(mintempsplit(0))


'''''''''''''''''' THE DAY AFTER TOMORROW'''''''''''''''

'Extract the day after tomorrows data (third line) from 'forecast.txt' and write each data type to seperate line in aftertomorrow.txt
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
(tfolder & "\forecast.txt", ForReading)
objTextFile.Skipline
objTextFile.Skipline
strNextLine = objTextFile.Readline
currentsplit = Split(strNextLine , ", ")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(tfolder & "\aftertomorrow.txt", ForWriting, True)
objTextFile.WriteLine(currentsplit(0))
For i = 1 to Ubound(currentsplit)
objTextFile.WriteLine(currentsplit(i))
Next

' Get individual data

' Day
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
(tfolder & "\aftertomorrow.txt", ForReading)
strNextLine = objTextFile.Readline
conditionsplit = Split(strNextLine , ": ")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(tfolder & "\day.txt", ForWriting, True)
objTextFile.WriteLine(conditionsplit(0)) 'Number value determines which line to write; 0 = 1st

' Condition
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
(tfolder & "\aftertomorrow.txt", ForReading)
strNextLine = objTextFile.Readline
conditionsplit = Split(strNextLine , ": ")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(tfolder & "\condition2.txt", ForWriting, True)
objTextFile.WriteLine(conditionsplit(1)) 'Number value determines which line to write; 0 = 1st

' Maximum Temperature
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
(tfolder & "\aftertomorrow.txt", ForReading)
objTextFile.Skipline
strNextLine = objTextFile.Readline
maxtempsplit = Split(strNextLine , "°C")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(tfolder & "\maxtemp2.txt", ForWriting, True)
objTextFile.WriteLine(maxtempsplit(0))

' Minimum Temperature
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
(tfolder & "\aftertomorrow.txt", ForReading)
objTextFile.Skipline
objTextFile.Skipline
strNextLine = objTextFile.Readline
mintempsplit = Split(strNextLine , "°C")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(tfolder & "\mintemp2.txt", ForWriting, True)
objTextFile.WriteLine(mintempsplit(0))


@rubberman vlt(bzw. wahrscheinlich) checkst du es ja face-smile
rubberman
rubberman 26.03.2016 um 20:21:47 Uhr
Goto Top
Andere Sprache ist zum Beispiel C, C++, QBasic, VB, Java
... oder JScript oder VBScript oder Powershell ...

Hier der Inhalt der Datei parseforecast.vbs im Texteditor
Und hier, wie man im Forum Code postet:
FAQ

vlt(bzw. wahrscheinlich) checkst du es ja
Was ich checke ist, dass auf Dateien zugegriffen werden soll, die bereits auf deinem Rechner liegen müssten, damit da was passieren kann. Wie die Dateien erzeugt werden (vermutlich durch einen anderen Code, der auf das Internet zugreift) ist nicht ersichtlich und ohne zu wissen, wie die Dateien erzeugt werden und was deren genauer Inhalt ist - keine Ahnung ...

Grüße
rubberman
georg2204
georg2204 06.11.2017 aktualisiert um 19:11:59 Uhr
Goto Top
Hallo colinardo,

danke für dein Script!
Ich schreibe den Output in eine TXT und füge diese dann per Batch in eine andere Datei ein (dass das Wetter am Ende steht). Funktioniert soweit wunderbar nur werde ich bei jedem Aufruf gefragt, ob ich Cookies annehmen will.
Wenn keine Auswahl getroffen wird, steht das Script still.

Ist es in Poweshell möglich, Cookieanfragen für die Ausführung zu deaktivieren oder zuzulassen, ohne dass eine manuelle Auswahl jedes mal getroffen werden muss?

Oder soll ich dies einfach in den Interneteinstellungen von IE machen?

@echo off
chcp 1252 > nul
powershell -Executionpolicy ByPass -Command "((iwr -uri 'https://www.wetter.de/deutschland/wetter-steinbach-18227228.html').AllElements | ?{$_.class $webresponse.Headers.Add("Cookie", $CookieContainer.GetCookieHeader($url)) -eq 'row-weather- report'}).innerText" >wetter.txt  

Danke und Gruß,
Georg
colinardo
colinardo 07.11.2017 aktualisiert um 08:58:12 Uhr
Goto Top
Servus Georg
Ist es in Poweshell möglich, Cookieanfragen für die Ausführung zu deaktivieren oder zuzulassen, ohne dass eine manuelle Auswahl jedes mal getroffen werden muss?
Invoke-WebRequest (iwr) arbeitet intern mit dem IE, wenn du diesen nutzt muss also das Profil entsprechend angepasst sein das Cookies angenommen werden.
Wenn du stattdessen wie oben ebenfalls gezeigt den System.Net.WebClient nutzt oder es mit einem HttpWebRequest-Object machst lassen sich Cookies natürlich auch ignorieren, du musst dazu auch nichts im Code anpassen, denn der Client läd hier per Default nur die reine Datenseite runter.
Invoke-WebRequest hat da bei manchen Seiten die komische Angewohnheit Dialoge des IE anzuzeigen obwohl der Befehl ja eigentlich nur für die reine Kommandozeile gedacht ist, hier hat MS wohl nur einen Wrapper über das IE-COMObject gelegt und das unvollständig bzw. teilweise verbuggt, aber das kennt man ja inzwischen face-wink.

Grüße Uwe
georg2204
georg2204 07.11.2017 um 11:22:45 Uhr
Goto Top
Hallo Uwe und danke für deine Erklärung.
Ich komme mit bspw. dem System.Net.WebClient nicht weiter in Powershell, also mit der Umsetzung.
Kannst du mir helfen wie das richtig lauten müsste im Code?
Die Ausgabe von Wetter de ist für meine Zwecke super.

Danke und Gruß
Georg
colinardo
colinardo 07.11.2017 um 11:54:14 Uhr
Goto Top
@echo off
chcp 1252 > nul
powershell  -Executionpolicy ByPass -NoProfile -Command "$dom = New-Object -Com htmlfile;$client = New-Object System.Net.WebClient;$client.Encoding = [System.Text.Encoding]::UTF8;$dom.IHTMLDocument2_write([regex]::Match($client.DownloadString('https://www.wetter.de/deutschland/wetter-steinbach-18227228.html'),'(?is)<div class=\"row-weather-report\">(.*?)(?=</div>)').Groups[1].Value);$dom.documentElement.innerText" >Wetter.txt  
georg2204
georg2204 09.11.2017 um 18:22:24 Uhr
Goto Top
Perfekt, funktioniert face-smile

Danke Uwe