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

Internet Bandbreite per Skript ermitteln

Frage Entwicklung Batch & Shell

Mitglied: Iwan

Iwan (Level 2) - Jetzt verbinden

27.09.2011, aktualisiert 28.09.2011, 6247 Aufrufe, 18 Kommentare

Systeme: aktuell Win XP, später Win7, Verbindung per UMTS

Hallo zusammen,

für unseren Außendienst benötigen wir einfache Möglichkeit, die aktuelle Internet Bandbreite (spez. Downloadrate) zu ermitteln.
Ca. 90% der User verwenden UMTS und haben halt leider nicht immer 3G zur Verfügung.
Leider achten sie auch nicht immer drauf, was sie aktuell zur Verfügung haben.
Da hagelt es dann leider häufiger "böse" Anrufe, das ein Datenabgleich oder Suftwareupdate mal wieder länger dauert.
Daher ist gewünscht, das der User eine Art Hinweisfenster erhält, bevor er eine VPN-Verbindung aufbaut.
Nicht gewünscht ist, das der Mitarbeiter auf irgendeine Webseite geht und einen "Speedtest" durchführt oder irgendwelche zusätzlichen Programme aufrufen muss.

IST-Zustand: aktuell wird eine Verknüpfung auf dem Desktop (.CMD) aufgerufen, die die VPN-Verbindung öffnet, seine Netzlaufwerke mappt, nach Updates guckt und andere Dinge.

SOLL-Zustand: das Ergebnis soll ein Skript sein, das z.Bsp. von unserem eigenen Webserver eine Datei lädt und die Downloadrate ermittelt.
Der Mitarbeiter erhält dann eine Meldung, das z.Bsp. die aktuelle Verbindung zu langsam ist, um einen Datentransfer zu machen o.ä.

ANSATZ: mit WGet habe ich schon ein paar Tests gemacht und ich sehe auch brauchbare Ergebnisse.
Das diese keine 100%ige Aussagekraft haben, ist uns durchaus bwusst.
Erstaunlicherweise kommen die Ergebnisse recht nah an die Realität ran.
Ich habe das Ergebnis in eine Log.txt geschrieben und die Zeile auch mit findstr ausgelesen.
Nur komm ich da nicht weiter....

Vielleicht kennt ja jemand eine Möglichkeit (.cmd, .vbs, o.ä.), wie man sowas realisieren könnte.
Mitglied: Skyemugen
27.09.2011 um 13:51 Uhr
Aloha,

du hast also schon eine passende Möglichkeit und kommst nicht weiter, nun dann poste doch mal dein bisheriges Skript (bitte mit <code></code>-Tags) und beschreibe dazu, was nicht läuft oder was noch zusätzlich geschehen sollte.

Das wäre m.M.n. momentan die sinnvollste Variante ... ausgenommen, bastla & Co. KG zaubern wieder unbekannte tools herbei, die das auf der cmd-Ebene ebenso erledigen ^_^

greetz André

P.S.: Ich persönlich mag ja keine crossposter ...
Bitte warten ..
Mitglied: Iwan
27.09.2011 um 15:04 Uhr
Hallo,

was hat das mit Crossposter zu tun, wenn man einfach auf mehrere Resourcen zurückgreifen kann?
Das ist für mich so, als wenn ich nur bei einem einzigen Händler ein Angebot einhole statt bei mehreren.

Zum Thema:

Aufruf von WGET:
01.
WGET -t 1 ftp://ftp.avm.de/public/1000KBYT -o speed.txt
Dadurch wird der komplette Downloadvorgang in die speed.txt geschrieben.
Ich habe das Ergebnis mal auf entscheidenden Zeilen gekürzt:
01.
   850K .......... .......... .......... .......... .......... 92%  681K 0s 
02.
   900K .......... .......... .......... .......... .......... 97%  647K 0s 
03.
   950K .......... .......... ......                          100%  764K=2.1s 
04.
 
05.
2011-09-27 14:03:46 (475 KB/s) - `1000KBYT.1' saved [1000000]
Interessant für die weitere Verarbeitung wäre ein Auslesen der 450 KB/s.
Diese müsste dann in 450 und KB/s aufgesplittet werden.
Theoretisch könnte ja auch MB/s da stehen, die ich mit der aktuellen Leitung hier aber nicht erreichen werde.
Bitte warten ..
Mitglied: Skyemugen
27.09.2011 um 15:37 Uhr
Aloha,

was hat das mit Crossposter zu tun, wenn man einfach auf mehrere Resourcen zurückgreifen kann?
Das ist für mich so, als wenn ich nur bei einem einzigen Händler ein Angebot einhole statt bei mehreren.
Crossposting aber egal ...

Nun, eine Möglichkeit wäre z.B. etwa so:
01.
@echo off & setlocal 
02.
set "Datei=E:\Skripte\speed.txt" 
03.
set "M=%temp%\message.vbs" 
04.
if not exist M >%M% echo MsgBox "Ihre Verbindung ist zu langsam!", vbExclamation,"Bandbreite ungenügend" 
05.
set "Datum=%date:~-4%-%date:~3,2%-%date:~0,2%" 
06.
for /f "tokens=2 delims=()" %%s in ('findstr /c:"%Datum% %time:~0,5%" "%Datei%"') do set "speed=%%s" 
07.
set "wert=%speed: KB/s=%" 
08.
if %wert% lss 500 cscript //nologo %M% 
09.
pause 
10.
goto :eof
Momentan wird nach Datum und Uhrzeit (nur Stunden und Minuten) gesucht, da die Sekunden beim Ausführen des Batches sich unterscheiden können / werden zu dem Wert in der speed.txt, ich denke eine Minutenüberschreitung dürfte relativ ausgeschlossen sein, wenn beides in einem Zug abläuft.

Ich habe die Meldung einfach mal als VBS gemacht, damit der User eine Popupmeldung hat, es ginge auch per
01.
if %wert% lss 500 ( 
02.
NET SEND %computername% Ihre Verbindung ist zu langsam,^ 
03.
die Bandbreite betraegt momentan nur %speed% 
04.
)
Sofern net send aktiviert ist, gut oben müsste Windows Scripting Host auch aktiv sein (default) oder du lässt es nur als echo im cmd laufen aber wer beachtet das schon ...

greetz André
Bitte warten ..
Mitglied: Terence-Chill
27.09.2011 um 16:26 Uhr
Hallo Iwan, André

ich persönlich würde folgenderweise vorgehen um Speed und Einheit zu ermitteln: (getestet, hat funktioniert)

01.
for /f "tokens=2 delims=() skip=4" %%a IN ('type kb.txt') DO CALL :WEITER "%%a" 
02.
:WEITER 
03.
for /f "tokens=1* delims= " %%a IN (%1) DO (SET rate=%%a & SET einh=%%b) 
04.
 
05.
ECHO Rate: %rate% - %einh%
- oder -
01.
for /f "tokens=2 delims=() skip=4" %%a IN ('type kb.txt') DO ( 
02.
	for /f "tokens=1* delims= " %%b IN ("%%a") DO (SET rate=%%b & SET einh=%%c) 
03.
)
Wie du dann weiter vorgehen willst, wenn du diese beiden Daten hast, bleibt dir überlassen. Von VBS hab' ich keine Ahnung und net send halte ich für nicht die beste Lösung.

Gruß

Edit: Ich hab' die Datei einfach mal kb.txt benannt - hier kannst du natürlich noch eleganter mit Variablen o.ä. vorgehen. Insgesamt geht das ganze bestimmt eleganter und schlanker; leider nicht mit meiner Erfahrung (;
Edit2: Etwas schlankere Alternative
Bitte warten ..
Mitglied: Skyemugen
27.09.2011 um 16:46 Uhr
Aloha,

aha, lieber zwei Schleifen hatte ich auch erst im Sinn aber hier ... meh zu viel des Guten, statt ein kurzes Ersetzen *gg* niedriger als KB/s wird's wohl nicht und höher hat der TE ja bereits ausgeschlossen und was machst du, wenn die Textdatei nicht überschrieben wird, sondern immer hinten ran? skip=4, hm, das muss er dann auch anpassen und erst einmal abzählen.

Also ich weiß ja nicht

greetz André
Bitte warten ..
Mitglied: Terence-Chill
27.09.2011 um 17:21 Uhr
Hey André,

mir ging's nicht darum, deine Version zu ersetzen, lediglich wollte ich einen zweiten Vorschlag, der auch auf die Einheit eingeht, darstellen.
Klar, falls die Datei nicht überschrieben, sondern die aktuellen Werte angehängt werden, würde man mit meiner Variante dumm da stehen (das Skip ist übrigens, zumindest kann ich das in Hinblick auf die gelieferten Daten sagen, nicht notwendig. Es sollte das ganze nur etwas schneller machen).

Wie würdest du den String auseinanderziehen ohne zweite Schleife, bzw., ist das überhaupt möglich?

Gruß
Bitte warten ..
Mitglied: Iwan
27.09.2011 um 18:10 Uhr
Vielen dank schon mal für die 2 Lösungsansätze.

NETSEND fällt aber raus, da es nicht aktiviert ist.
Den Umweg mit der Ausgabe über .VBS finde ich persönlich auch nicht so prickelnd.

Wichtig ist mir, das die Werte im .CMD landen und ich sie von da aus weiterverarbeiten kann.
Dies bieten beide Lösungsansätze, die ich spätestens morgen testen werde.


PS: Crossposting ist sehr effektiv, solange man die Lösung auch überall bekannt gibt.
Somit sehe ich da nichts negatives drin, aber jedem seine Meinung...
Bitte warten ..
Mitglied: bastla
27.09.2011 um 18:13 Uhr
Hallo Terence-Chill und willkommen im Forum!
Wie würdest du den String auseinanderziehen ohne zweite Schleife
Etwa so:
for /f "skip=4 tokens=3-4 delims=() " %%a IN ('type kb.txt') DO SET /a rate=%%a & SET "einh=%%b"
- wobei ich mich allerdings, wie Skye, nicht auf die Zeilenanzahl verlassen würde - daher eher:
for /f "tokens=3-4 delims=() " %%a IN ('findstr "%date:~-4%-%date:~-7,2%-%date:~-10,2%" kb.txt') DO SET /a rate=%%a & SET "einh=%%b"
Grüße
bastla
Bitte warten ..
Mitglied: Terence-Chill
27.09.2011 um 19:02 Uhr
Schön, Danke Wie immer - eigentlich garnicht so kompliziert!
Bitte warten ..
Mitglied: Skyemugen
27.09.2011 um 19:23 Uhr
Aloha bastla,

"delims=() " ... hm, ich hatte mich zwar so oder so am Anfang auf die Klammer eingeschossen, weil sie mein Blickfang war, wollte allerdings dann doch tokens=3-4 verwenden aber glaubst du, heute lief irgendwas? Ich hatte natürlich den Fehler gemacht und "delims= ()" gesetzt *pfeif* und mich dann doch wieder meiner Arbeit gewidmet, statt das Leerzeichen im Delimiter ans Ende zu setzen *tärä* - so ist das mit dem Licht, manchmal brennt es ...

Aber auch in deiner Variante: Wenn die Datei nur vergrößert wird, statt neu beschrieben, läuft das nicht ganz so wie gewollt, daher hatte ich noch die Stunde-Minute-Suche mit eingebaut aber ich schätze, die Datei wird wahrscheinlich eh jedes Mal neu überschrieben, keine Ahnung wie wget das handhabt
Den Umweg mit der Ausgabe über .VBS finde ich persönlich auch nicht so prickelnd.
Frag' mal den Enduser, der keine Lust hat, in der Konsole Plaintext zu lesen Ohne Popup mit Klick-Mich kriegen die meisten doch gar nix wirklich mit.
mir ging's nicht darum, deine Version zu ersetzen, lediglich wollte ich einen zweiten Vorschlag, der auch auf die Einheit eingeht, darstellen.
Aye, war mir schon klar aber den Vorschlag hatte ich extra ausgelassen

greetz André
Bitte warten ..
Mitglied: bastla
27.09.2011 um 19:33 Uhr
Hallo Skye!
Wenn die Datei nur vergrößert wird, statt neu beschrieben
... steht der aktuellste Eintrag vermutlich am Ende ...

Grüße
bastla
Bitte warten ..
Mitglied: Iwan
27.09.2011 um 19:46 Uhr
Richtig, er steht am Ende der Datei
Ich habe eigentlich nicht vor, die Datei fortzuschreiben, sondern sie beim nächsten Aufruf zu überschreiben.
Nur die ermittelten Werte werde ich mir evtl. in einer separaten Datei wegschreiben.

@bastla
01.
for /f "tokens=3-4 delims=() " %%a IN ('findstr "%date:~-4%-%date:~-7,2%-%date:~-10,2%" kb.txt') DO SET /a rate=%%a & SET "einh=%%b"
Damit sucht er nach jedem Eintrag in der Datei, richtig?
Bitte warten ..
Mitglied: bastla
27.09.2011 um 22:25 Uhr
Hallo Iwan!
Damit sucht er nach jedem Eintrag in der Datei, richtig?
Nach jedem Eintrag mit dem heutigen Datum (Du kannst ja testweise
findstr "%date:~-4%-%date:~-7,2%-%date:~-10,2%" kb.txt
ohne das Drumherum ausführen) - sollte es mehrere Zeilen der Art
2011-09-27 14:03:46 (475 KB/s) - `1000KBYT.1' saved [1000000]
geben, werden nach der Schleife die Werte der letzten passenden Zeile in den Variablen stehen ...
Nur die ermittelten Werte werde ich mir evtl. in einer separaten Datei wegschreiben.
Dann kannst Du mit "tokens=1-4" auch Datum und Uhrzeit (als %%a und %%b; Wert und Einheit wären dann %%c und %%d) "mitnehmen" ...

Grüße
bastla
Bitte warten ..
Mitglied: Skyemugen
27.09.2011 um 22:42 Uhr
Aloha bastla,

ich sag's ja: Wir arbeiten schon zu viel mit Unterprogrammen, sodass mir schon glatt entfällt, dass der letzte Wert gespeichert wird :D

greetz André
Bitte warten ..
Mitglied: Iwan
28.09.2011 um 10:04 Uhr
Guten morgen zusammen,

ich habe nun die Code-Schnipsel zusammengeworfen und folgendes Skript herausbekommen:
01.
del 1000KBYT 
02.
wget.exe -t 1 ftp://ftp.avm.de/public/1000KBYT -o speed.txt 
03.
for /f "tokens=1-4 delims=() " %%a IN ('findstr "%date:~-4%-%date:~-7,2%-%date:~-10,2%" speed.txt') DO SET Dat=%%a & SET Uhr=%%b & SET /a rate=%%c & SET "einh=%%d" 
04.
echo %Dat% %Uhr%: %rate% %einh% 
05.
If %rate% LSS 500 echo Zu langsam (weniger als 500kb) 
06.
If %rate% GTR 500 echo Alles ok (mehr als 500kb)
Das funktioniert soweit schon mal einwandfrei. Nun muss ich es halt noch mit div. Inet-Verbindungen testen.

Vielen dank !
Bitte warten ..
Mitglied: Berrnd
28.09.2011 um 19:58 Uhr
Hi,

ich werf mal noch 'nen Codeschnipsel dazu.
Ich hab für einen ähnlichen Zweck mal eine VBS-Function gebaut. Ob die 100% genau ist kann ich natürlich nicht sagen, kommt aber sicherlich auch an recht realistische Werte ran. ;)
01.
Public Function GetInetDownloadSpeed(ByRef URL) 'As Long 
02.
	Dim WebReq 'As Microsoft.XmlHttp 
03.
	Dim FSO 'As Scripting.FileSystemObject 
04.
	Dim Start, Ende 'As DateTime 
05.
	Dim TempObj 'As Object 
06.
	Dim ContentLength 'As Long 
07.
 	 
08.
	Set WebReq = CreateObject("Microsoft.XmlHttp") 
09.
	Set FSO = CreateObject("Scripting.FileSystemObject") 
10.
	 
11.
	Start = Now 
12.
	 
13.
	URL = URL + "?nocacherandomize=" + Replace(FSO.GetTempName, ".tmp", "") 
14.
	 
15.
	WebReq.Open "get", URL, False 
16.
	WebReq.Send 
17.
	TempObj = WebReq.ResponseBody 
18.
	 
19.
	ContentLength = WebReq.GetResponseHeader("Content-Length") 
20.
	 
21.
	Ende = Now 
22.
	 
23.
	GetInetDownloadSpeed = Round(ContentLength / 1024 / DateDiff("s", Start, Ende), 2) 
24.
	 
25.
	TempObj = Nothing 
26.
End Function
Der Rückgabewert ist die Geschwindigkeit in KB/s.

Viele Grüße - Bernd
Bitte warten ..
Mitglied: Iwan
28.09.2011 um 20:06 Uhr
Und der Aufruf erfolgt mit der runterzuladenen Datei als Paramater?
Bitte warten ..
Mitglied: Berrnd
28.09.2011 um 20:20 Uhr
Hi,

ja, der Parameter "URL" ist die URL zu einer beliebigen Web-Resource...
Also z. B.
Kbs = GetInetDownloadSpeed("http://speedtest.qsc.de/10MB.qsc")
Gruß - Bernd
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...