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

Batch: Abbrechbarer Countdown, Timeout

Tipp Entwicklung Batch & Shell

Mitglied: rubberman

rubberman (Level 3) - Jetzt verbinden

18.07.2013, aktualisiert 20.07.2013, 5170 Aufrufe, 2 Kommentare, 2 Danke

Hallo Community,

wenn man sich das Topic so ansieht, könnte man sich die Frage stellen, wozu das Ganze? Es gibt doch bereits das TIMEOUT Befehlstool! Stimmt - wenn da nicht die von Biber ab und zu herangezogenen "Redmonder Praktikantinnen in Hängehöschen" wieder mal zu viele bunte Pillen eingeworfen hätten als sie den Code dafür zusammengeschrotet haben ...

Meine Anforderung: Gib einem User die Möglichkeit eine Aktion innerhalb einer bestimmten Zeitspanne abzubrechen.

Wer nun versucht TIMEOUT dafür zu verwenden, wird feststellen, dass das Ding prima einen Countdown ins Consolefenster zaubert. Das wars dann aber auch schon. Egal ob der Benutzer abbricht oder der Countdown abgelaufen ist, am Ende wird man weder in der Lage sein das Eine oder das Andere zu ermitteln. Errorlevel-Logik? Fehlanzeige! Der bleibt in jedem Fall 0.

Ich habe mal versucht eine Subroutine zu basteln, die aus der TIMEOUT-Ausgabe was Verwertbares macht. Dieser übergibt man 3 Parameter:
  • Die Wartezeit in Sekunden.
  • Die Message, die während des Countdowns angezeigt werden soll. Diese kann ein Wildcardzeichen enthalten, das gegen den Coutdown ausgetauscht wird.
  • Das Zeichen, das als Wildcard interpretiert werden soll.

Im Beispiel:
01.
@echo off &setlocal 
02.
set /a "wait=10" 
03.
 
04.
call :xtimeout %wait% "Timeout in # s, Abbruch mit beliebiger Taste." # 
05.
 
06.
echo ERRORLEVEL: %errorlevel% 
07.
if errorlevel 1000 (echo Fehler) else if errorlevel 1 (echo Abgebrochen.) else echo %wait% Sekunden abgelaufen. 
08.
 
09.
echo( 
10.
pause 
11.
goto :eof 
12.
 
13.
 
14.
::::::::::::::::::::::::::::::::::: 
15.
:xtimeout Zeit [Text] [Platzhalter] 
16.
call;&(if not defined __bs__ call)&&(if not defined __cr__ call)&&(if not defined __lf__ call)&if errorlevel 1 ( 
17.
  setlocal DisableDelayedExpansion 
18.
  2>nul set /a "countdown = %~1, before = %~1 + 1"&set "txt=%~2 "&set "wildcard=%~3" 
19.
  for /f %%i in ('"prompt;$h&for %%i in (1) do rem"') do set "__bs__=%%i" &REM ~BackSpace~ 
20.
  for /f %%a in ('copy /z "%~f0" nul') do set "__cr__=%%a" &REM ~CarriageReturn~ 
21.
  set __lf__=^ 
22.
 
23.
 
24.
  REM Zwei Leerzeilen sind erforderlich! ~LineFeed~ 
25.
  setlocal EnableDelayedExpansion 
26.
  call;&(if !countdown! lss 1 call)&&(if !countdown! gtr 300 call)&if errorlevel 1 (endlocal&endlocal&exit /b 2147483647) 
27.
  if not defined wildcard set "wildcard=!__bs__!" 
28.
  set "file=!temp!\!random!-!random!.timeout" 
29.
  start "" /b cmd /von /c ">"!file!" timeout /t !countdown!&>"!file!" echo 2147483647" 
30.
31.
if not exist "!file!" goto xtimeout 
32.
for /f "delims=" %%i in ('type "!file!"') do set "countdown=%%i" 
33.
for /f "delims=" %%i in ('"call echo %%countdown:!__bs__!=^!__lf__^!%%"') do set "countdown=%%i" 
34.
for /f %%i in ("!countdown!") do set "countdown=%%i" 
35.
if %before% gtr %countdown% ( 
36.
  if defined txt <nul set /p "=%__bs__%!__cr__!!txt:%wildcard%=%countdown%!%__bs__%" 
37.
  set /a "before = countdown" 
38.
  goto xtimeout 
39.
) else ( 
40.
  if %countdown% equ 2147483647 ( 
41.
    del "!file!" 
42.
    echo( 
43.
    endlocal&endlocal&exit /b %before% 
44.
  ) else ( 
45.
    goto xtimeout 
46.
47.
)
Risiken und Nebenwirkungen?
Ja klar, ist ja lediglich ein Workaround. Das Ding kommt nicht ohne temporäre Datei aus, in die die Ausgabe von TIMEOUT erst mal gepuffert wird. Was heißt das?:
  • Zwei Prozesse schreiben und lesen gleichzeitig asynchron und benutzen dabei die gleiche Datei. Das kann auch mal in die Hose gehen.
  • Die Ausgabe von TIMEOUT landet in einer einzigen Zeile, der Countdown wird dort mit Backspacezeichen immer wieder überschrieben. Irgendwann ist die Zeile zu lang um mit Batch einlesbar zu sein. Ich habe deshalb auf 300 Sekunden Maximum begrenzt. Das hat bei mir (Win7 x86 und x64) im Test immer funktioniert.

Grüße
rubberman
Mitglied: Invisan
18.07.2013 um 09:39 Uhr
Moin Rubberman,


wäre für dich auch ne VBS mit ner HTA in Ordnung?


Mfg Invi
Bitte warten ..
Mitglied: rubberman
18.07.2013 um 10:59 Uhr
Hallo Invisan.

Ich sag mal so, für mich ist es eine Kleinigkeit auch noch eine entsprechende HTA zu bauen, die ein SetInterval oder SetTimeout aufruft um das entsprechend darzustellen. Das läuft dann aber nicht im Consolefenster.
Genauso habe ich nicht erwähnt, dass ich bereits zu diesem Zweck mein eigenes Tool in C geschrieben habe (wer es sich ansehen will, xtimeout.zip, Quellcode ebenfalls dabei).
Mir ging es um ein Batchtool das mit Bordmitteln per Copy/Paste auf jeder neueren Windows Kiste laufen sollte. OK, ein bisschen Spieltrieb war auch dabei ...

Grüße
rubberman
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch Spiel
Tipp von kunert0345Batch & Shell4 Kommentare

Hallo, das passiert wenn man an einem Rechner ohne Internet und ohne Spiele sitzt: input.bat BatchGame.bat

Batch & Shell
Batch-Script für die Messung der Netzwerkgeschwindigkeit
Anleitung von KraemerBatch & Shell10 Kommentare

Moin zusammen, ich habe mich gerade eben hingesetzt, und eines meiner Scripte ein wenig zeigbar überarbeitet. Da die eine ...

Batch & Shell
Batch - ein paar Basics die man kennen sollte
Tipp von PedantBatch & Shell5 Kommentare

Hallo Batchfreunde, in den letzten Tagen habe ich ein paar Dinge über Batch gelernt, die eigentlich zu den Basics ...

Batch & Shell
Batch Übung zum Desktop Switchen
Anleitung von TechnoXBatch & Shell7 Kommentare

Guten Tag, für mich war es eine Trainingsübung. Da ich mich fragte - wie kann ich meine Icons auf ...

Neue Wissensbeiträge
Erkennung und -Abwehr

Necur-Botnet soll Erpressungstrojaner Scarab massenhaft verbreiten

Information von BassFishFox vor 2 StundenErkennung und -Abwehr

12,5 Millionen Spam-Mails aus einem Bot-Netz mit 6 Millionen Computern? Eigentlich eine schwache Leistung. Die Erpresser setzen dabei auf ...

Microsoft

Nadeldrucker-Problem unter Windows - Microsoft liefert Updates

Information von BassFishFox vor 3 StundenMicrosoft

Hat ja nicht lange gedauert. Nachdem die November-Updates für Windows 7, 8.1 und 10 zahlreiche Nadeldrucker lahmgelegt hatten, stellt ...

Linux

Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde

Information von Frank vor 10 StundenLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Batch & Shell

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

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

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

Heiß diskutierte Inhalte
Linux
Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde
Information von FrankLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Router & Routing
Zwei Netzwerke erstellen
Frage von bunteblumeRouter & Routing14 Kommentare

Hallo Zusammen, Ich möchte gerne ein backup von einem bestimmten Folder welcher auf dem Server regelmässig synchronisiert wird auf ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Windows Server
Kann man im KMS nachschauen , wieviele Clients den Key in Anspruch genommen haben
gelöst Frage von rainergugusWindows Server12 Kommentare

Hallo, wir haben einen KMS Windows 10 Key. Dieser ist ja W7 kompatibel. Aber unser Windows 7 Pool registriert ...