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

Prüfen ob Variablen inhalt Buchstaben enthält

Frage Entwicklung Batch & Shell

Mitglied: IForever

IForever (Level 1) - Jetzt verbinden

19.12.2014, aktualisiert 20.12.2014, 1479 Aufrufe, 7 Kommentare

Hallo administrator.de!

Ich habe ein kleines Logikproblem, welches ich gerne lösen, bzw. erklärt haben möchte, sollte es so gar nicht funktionieren können :p

Ich habe eine Batch in der man verschiedene Uhrzeiten eintragen kann.
Und da man mit einem durchschnitts IQ von 10 bei den meisten Anwendern rechnen muss, möchte ich auch die Benutzereingaben überprüfen.

Die Eingabe erfolgt im Format SS:MM (07:12), einige Fehler habe ich schon abgefangen, der der mich ins grübeln bringt, ist folgender:
Ich möchte prüfen, ob Buchstaben verwendet worden sin. Sprich: "ab:cd"

Mein Coding sieht folgendermaßen aus:
- Variable "come" ist die eingetragene Zeit
- In ":come" wird diese eingetragen, daher das goto zurück

:: 03 Keine Buchstaben
01.
for %%a in ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i" "J=j" "K=k" "L=l" "M=m" 
02.
	  "N=n" "O=o" "P=p" "Q=q" "R=r" "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z") DO (SET "come=!come:%%~a!") 
03.
		 
04.
for %%a in ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" 
05.
	  "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z") DO ( 
06.
	if "%come:~0,1%"=="%%a" ( 
07.
	                  echo Die Zeitangabe ist nicht korrekt! 
08.
		echo Fehler 03: Keine Buchstaben verwenden! 
09.
		goto :come 
10.
11.
	if "%come:~1,1%"=="%%a" ( 
12.
		echo Die Zeitangabe ist nicht korrekt! 
13.
		echo Fehler 03: Keine Buchstaben verwenden! 
14.
		goto :come 
15.
16.
	if "%come:~3,1%"=="%%a" ( 
17.
		echo Die Zeitangabe ist nicht korrekt! 
18.
		echo Fehler 03: Keine Buchstaben verwenden! 
19.
		goto :come 
20.
21.
	if "%come:~4,1%"=="%%a" ( 
22.
		echo Die Zeitangabe ist nicht korrekt! 
23.
		echo Fehler 03: Keine Buchstaben verwenden! 
24.
		goto :come 
25.
26.
	)
Mein Gedanke war es, alle Großbuchstaben in kleine zu konvertieren und dann zu prüfen, ob sich diese in meiner Variable befinden.
In den 4 FOR Prüfungen werden die jeweils 4 Stellen der Zeit (der : ausgenommen) geprüft, ob ein Buchstabe verwendet wurde.

Kann diese Konstellation aus FOR und IF überhaupt funktionieren?
Wenn ja, wo liegt mein Fehler?

Gruß und Danke im Vorraus
Chris
Mitglied: 114757
19.12.2014, aktualisiert um 19:21 Uhr
Hallo Chris,
machs doch so:
echo %come%|findstr /ir "^[0-2][0-9]:[0-5][0-9]$" && echo Uhrzeit OK || echo Uhrzeit nicht OK
Dann schlägst du mehrere Fliegen mit einer Klappe. Nun gut wenn eine Uhrzeitangabe größer als 23 in den Stunden ist das musst du noch prüfen, denke aber das solltest du dann auch selber schaffen

Gruß jodel32


p.s. Zur Info: If kennt auch den Schalter /i (steht für "insensitive") dann ist Groß- oder Kleinschreibung beim Vergleich kein Thema mehr

p.s. stell auf Powershell um, damit ist das ebenfalls ein Klacks ...
01.
$result = Read-Host "Geben sie die Uhrzeit ein" 
02.
if ($result -match '^([0-1][0-9]|2[0-3]):[0-5][0-9]$'){ 
03.
  Write-Host "Uhrzeit OK!" 
04.
}Else{ 
05.
  Write-Host "Uhrzeit FALSCH!" 
06.
}
Bitte warten ..
Mitglied: rubberman
19.12.2014 um 23:28 Uhr
Hallo Chris,

jodel32 hat grundsätzlich Recht. Eigentlich suchst du nach einer Lösung um zu prüfen, ob die Eingabe ein vorgegebenes Format hat. Dass dort keine Buchstaben enthalten sein dürfen, ist nur die halbe Miete. Ebenso wenig dürfen irgendwelche anderen Zeichen, als Nummern und ein Doppelpunkt vorhanden sein oder die numerischen Teile einen bestimmten Wert über- oder unterschreiten.

Wenn man wirklich die unmöglichsten Eingaben des DAUs abfangen will, wird das in Batch tatsächlich eine Herausforderung. Dabei rede ich bspw. von Zeichen wie <>|& oder unpaarigen Anführungszeichen.

Du kannst ja mal mit folgendem Codeschnipsel gegen derartige Eingaben testen:
01.
@echo off &setlocal 
02.
set /a "inp=0, err=0, SS=0, MM=0" 
03.
 
04.
set /p "inp=SS:MM> " 
05.
 
06.
setlocal EnableDelayedExpansion 
07.
for /f "tokens=1* delims=:" %%i in ("!inp!") do ( 
08.
  if "%%i:%%j" neq "!inp!" (endlocal &set /a "err |= 1") else endlocal 
09.
  set "SS=1%%i" 
10.
  set "MM=1%%j"  
11.
12.
 
13.
call :checkUnsigned SS 100 123 
14.
set /a "err |= %errorlevel%" 
15.
 
16.
call :checkUnsigned MM 100 159 
17.
set /a "err |= %errorlevel%" 
18.
 
19.
if %err%==1 (echo Fehler) else echo OK 
20.
pause 
21.
exit /b 
22.
 
23.
 
24.
:checkUnsigned VarName Min Max 
25.
setlocal EnableDelayedExpansion 
26.
:: Test auf Ziffern (keine anderen Zeichen erlaubt). 
27.
for /f "delims=1234567890" %%i in ("!%~1!") do (endlocal &exit /b 1) 
28.
:: Test auf gültige Zahl (alles was SET /A fehlerfrei verarbeiten kann). 
29.
2>nul set /a "dummy=!%~1!" || (endlocal &exit /b 1) 
30.
:: Test auf Dezimalzahl (keine Oktalzahl durch vorangestellte 0). 
31.
if "!%~1!" neq "%dummy%" (endlocal &exit /b 1) 
32.
:: Test auf Minimum 
33.
if %dummy% lss %~2 (endlocal &exit /b 1) 
34.
:: Test auf Maximum 
35.
if %dummy% gtr %~3 (endlocal &exit /b 1) 
36.
 
37.
endlocal &exit /b 0
Grüße
rubberman
Bitte warten ..
Mitglied: miniversum
20.12.2014 um 10:28 Uhr
Hallo,

hier mal mein kurzer Vorschlag wie es auch zu lösen wäre:
01.
@echo off 
02.
set /p come=Zeit: 
03.
 
04.
set hh=%come:~0,2% 
05.
set dp=%come:~2,1% 
06.
set mm=%come:~3,2% 
07.
 
08.
set hhout=%hh% 
09.
set /a hhout=%hh% 
10.
if [%hh%] neq [%hhout%] echo %hh% ist keine Zahl 
11.
 
12.
set mmout=%mm% 
13.
set /a mmout=%mm% 
14.
if [%mm%] neq [%mmout%] echo %mm% ist keine Zahl 
15.
 
16.
if [%dp%] neq [:] echo %dp% ist kein ":" 
17.
 
18.
echo [%hhout%][%dp%][%mmout%]
Gruß
...
Bitte warten ..
Mitglied: rubberman
20.12.2014, aktualisiert um 12:31 Uhr
Hallo miniversum.

Joa, geht schon, aber Chris traut seinen Usern nur einen IQ von 10 zu
Dein Script wertet Eingaben, wie
^1:22
1&:22
11:222
11:73
als perfekt in Ordnung. Dafür
01:22
als fehlerhaft, was in Ordnung sein sollte.
Fehler wie
&1:22
werden nicht abgefangen und
"1:22
stirbt einfach wegen Syntaxfehler Batch ist schon etwas speziell ...

Grüße
rubberman
Bitte warten ..
Mitglied: miniversum
20.12.2014 um 12:47 Uhr
Hallo,

Das ist halt ne schnelle Lösung.
Ich weiß ja nicht wofür es gut sein soll aber das sind dann anwendungsfällt indenen ich sowieso auf temporäre vbs scripte zurückgreigen würde. Die kannman ja in der Batch selbst erzeugen.

Gruß
...
Bitte warten ..
Mitglied: rubberman
20.12.2014, aktualisiert um 15:05 Uhr
Auch 'ne Möglichkeit.
Hier mal als Batch-JScript-Hybrid:

*.bat
01.
@if (@a)==(@b) @end /* JScript Kommentar einleiten. 
02.
 
03.
@echo off &setlocal 
04.
set /p "inp=SS:MM> " 
05.
cscript //nologo //e:jscript "%~fs0" inp 
06.
if errorlevel 1 (echo Fehler) else echo OK 
07.
pause 
08.
exit /b 
09.
 
10.
:: Ende JScript Kommentar. */ 
11.
var str = WScript.CreateObject("WScript.Shell").Environment("PROCESS")(WScript.Arguments.Item(0)); 
12.
var regex = new RegExp("^[0-2]\\d:[0-5]\\d$"); 
13.
var d = new Date("01/01/1970, " + str); 
14.
if ( 
15.
  !regex.test(str) 
16.
  || Object.prototype.toString.call(d) != "[object Date]" 
17.
  || isNaN(d.getTime()) 
18.
) { 
19.
  WScript.Quit(1); 
20.
21.
WScript.Quit(0);
Batch pur läuft natürlich trotzdem schneller als solche Konstrukte

Grüße
rubberman
Bitte warten ..
Mitglied: colinardo
20.12.2014, aktualisiert um 21:23 Uhr
und noch als Ergänzung zu @114757's Powershell-Code, hier noch die Integrierung dessen in eine Batch:
01.
@echo off 
02.
set /p come=Uhrzeit eingeben: 
03.
for /f "delims=" %%a in ('powershell -ExecutionPolicy ByPass -NoLogo -command "& {if('%come%' -match '^([0-1]\d|2[0-3]):[0-5]\d$'){echo OK}else{echo FEHLER}}"') DO @( 
04.
  if "%%a" == "OK" ( 
05.
     echo Uhrzeit OK 
06.
  ) else ( 
07.
     echo Uhrzeit FALSCH 
08.
09.
)
Dann haben wir jetzt bald alles durch, und der TO hat die Qual der Wahl

Frohes Fest *<(:--)
Grüße Uwe
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

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

Ähnliche Inhalte
Batch & Shell
gelöst EDI Dateien auf Inhalt prüfen und verschieben (6)

Frage von ThomasKern zum Thema Batch & Shell ...

Batch & Shell
gelöst Variable auf Inhalt prüfen (1)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Exchange Server
Inhalt von Postfächern in Exchange löschen (9)

Frage von m.reeger zum Thema Exchange Server ...

C und C++
gelöst Anzahl der Buchstaben in einem String Element Array C++ (3)

Frage von Protected zum Thema C und C ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

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

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...