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

Prüfen ob Variablen inhalt Buchstaben enthält

Mitglied: IForever

IForever (Level 1) - Jetzt verbinden

19.12.2014, aktualisiert 20.12.2014, 1763 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 ..
Ähnliche Inhalte
Batch & Shell
Variable auf Inhalt prüfen
gelöst Frage von PinkFLuffyUnicornBatch & Shell1 Kommentar

Hi, ich sitze jetzt schon den halben tag daran eine if schleife zu erstellen die mir sagt ob Variable ...

Batch & Shell

Batch: Wenn Buchstaben im Wort enthalten dann......

gelöst Frage von Luckyman7471Batch & Shell7 Kommentare

Hallo Leute, Ich würde gerne folgendes realisieren: Wenn im lokalen Computernamen die Buchstaben "fa" enthalten sind dann soll ein ...

Batch & Shell

Wie kann ich in Batch überprüfen, ob ein Text einen Buchstaben enthält?

Frage von CYCGHGBatch & Shell3 Kommentare

Hallo, ich habe eine Frage zu Batch. Folgendes: set /p text= if %test% CONTAINS "/" Irgendein Befehl /\ Diesen ...

Batch & Shell

Variable enthält nur den letzten Wert

gelöst Frage von Phill93Batch & Shell4 Kommentare

Hallo, bin hier gerade am verzweifeln. Ich möchte einen Variable auf das vorkommen eines bestimmten Strings prüfen. Das klapp ...

Neue Wissensbeiträge
Microsoft
ARD-Doku - Das Microsoft Dilemma
Tipp von Knorkator vor 2 StundenMicrosoft2 Kommentare

Hallo zusammen, vor einigen Tagen lief in der ARD u.a. Reportage. Das Youtube Video dazu dürfte länger verfügbar sein. ...

Windows 10

Neue Sicherheitslücke in Windows 10 (Version 1709) durch Google öffentlich geworden

Information von kgborn vor 20 StundenWindows 10

Vor ein paar Tagen haben Googles Sicherheitsforscher vom Projekt Zero eine Sicherheitslücke im Edge-Browser publiziert. Jetzt wurde eine weitere ...

iOS
IOS 11.2.6 verfügbar
Information von sabines vor 1 TagiOS

Mit dem Update soll der Bug behoben werden, bei dem eine bestimmte Zeichenkette IOS zum Absturz gebracht hat.

Sicherheit
Sicherheitsrisiko: Die Krux mit 7-Zip
Information von kgborn vor 1 TagSicherheit8 Kommentare

Bei vielen Anwendern ist das Tool 7-Zip zum Entpacken von Archivdateien im Einsatz. Die Software ist kostenlos und steht ...

Heiß diskutierte Inhalte
Windows Server
AD DS findet Domäne nicht, behebbar?
Frage von schapitzWindows Server30 Kommentare

Guten Tag, ich habe bei einem Kunden ein Problem mit den AD DS. Umgebung ist folgende: Windows Server 2016 ...

Router & Routing
LANCOM VPN CLIENT einrichten
Frage von Finchen961988Router & Routing27 Kommentare

Hallo, ich habe ein Problem und hoffe ihr könnt mir helfen, wir haben einen Kunden der hat einen Speedport ...

LAN, WAN, Wireless
VPN Cisco ASA5505 PaloAlto PA-200
gelöst Frage von YannoschLAN, WAN, Wireless25 Kommentare

Hallo zusammen, ich würde gerne ein Site-to-Site VPN zwischen den beiden Standorten aufbauen. PaloAlto PA200 Internetanschluss Deutsche Telekom GK ...

SAN, NAS, DAS
Qnap TS-453S Pro - Anbindung Active Directory
Frage von JuckieSAN, NAS, DAS13 Kommentare

Hallo zusammen, ich habe hier eine Qnap TS-453S Pro die sich mal so absolut gar nicht in das Active ...