mycroftone
Goto Top

Anzahl Zeichen einer Variable zählen

Hallo Zusammen

Ich habe eine Einfach Frage aber leider in den ganzen Beiträgen keine Lösung gefunden.

Ich höchte die Anzahl von Zeichen in eine Variable Zählen.

Ich habe eine Variable die das Datum darstellt ( bekomme ich aus logdateien)
Sie sieht Standardmäßig so aus -> 2009-04-29
Jetzt bekommen Ich aber auch Logdateien in denen das Datum falsch geliefert wird -> -~-2,2-

Also möchte ich jetzt durch Zählen der Zeichen rausfinden ob ich ein gültiges Dateum bekomme.

Befehl 2009-04-29
10

Befehl -~-2,2-
7

Wie ich in eine Beitrag schon gelesen habe mach es eine Unterschied die Anzahl Zeichen einer Zeile zu lese.
Oder die Anzahl Zeiten einer Datei zu Zählen. Das kann ich dank dieses Forums schon.

Content-ID: 115075

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

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

77559
77559 30.04.2009 um 17:38:50 Uhr
Goto Top
Hallo,

ich halte den Ansatz für nicht so sinnvoll, parse auf die Elemente und überprüfe ob ein gültiges Datum dabei rauskommt.

::Befehl.cmd
@echo off&setlocal
set "Datum=%1"  
for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do set /A "Jahr=%%A,Monat=%%B,Tag=%%C"  
If Defined Jahr  if %Jahr%  GEQ 1980 if %Jahr%  LEQ 2100^
if Defined Monat if %Monat% GEQ 1    if %Monat% LEQ 12^
if Defined Tag   if %Tag%   GEQ 1    if %Tag%   LEQ 31 goto :weiter
echo Ungültiges Datum: %Datum%
goto :eof
:weiter

Only braintested

Klar ist das noch auf unmögliche Daten zu prüfen ist 29.2. ohne Schaltjahr etc.

Gruß
LotPings

Edit: Übersichtlicher formatiert
mycroftone
mycroftone 30.04.2009 um 17:49:56 Uhr
Goto Top
Ja danke das ist natürlich die Luxusversion des Datumprüfens.
Werde ich ausprobieren

Kann mir Trotzdem jemand sagen wie ich die Zeichen in einer Zeile Zähle
Biber
Biber 30.04.2009 um 17:56:49 Uhr
Goto Top
Moin mycroftone,

willkommen im Forum.
Wie Lotpings schon schrieb - eine Prüfung auf Gültigkeit/Richtigkeit ist sinnvoller als eine Prüfung auf Ungültigkeit.
Und mit einer Prüfung "Ist eine Variable 10 Zeichen lang, dann wird es wohl ein brauchbares Datum sein" überlebst Du im IT-Welt circa 12,7 sec.

Aber wenn es Dir ausreichend erscheint:
-> Wenn eine Variable nur 7 Zeichen lang ist und
-> Du fragst eine Substring-Funktion nach dem Teilstring von Zeichen 8 an in der Länge 3
-> dann wirst Du bei allen mir bekannten SubStr()-varianten dieser Galaxie einen Leerstring zurückbekommen.
Auch von der CMD.exe
Demo am CMD-Prompt:
>set testdate=-~-2,2-
>if "%testdate:~7,3%"=="" echo leer  
leer
>if "%testdate:~6,3%"=="" echo leer  

Wenn Du also vorrangig diese fehlerhaften 7stelligen Datums-Werte abfangen willst--> prüfe es so.

Grüße
Biber
Biber
Biber 30.04.2009 um 18:11:31 Uhr
Goto Top
... und wenn es unbedingt sein soll...
Zitat von @mycroftone:
Kann mir Trotzdem jemand sagen wie ich die Zeichen in einer Zeile Zähle

In der Theorie könntest Du in einer Zählschleife (FOR /L-Anweisung) das Ende des Strings finden
@echo off & setlocal EnableDelayedExpansion

:: Pessimistisch: der String könnte ja 100 Zeichen lang sein
set "WorstCaseLen=100"  
set "DerTestString=irgendein Text"  

For /L %%i in (%WorstCaseLen%,-1,1) do (
      if not defined myStrLen if "!DerTestString:~%%i,1!" NEQ "" Set /a myStrLen=1+%%i  
)
echo Stringlen [%DerTestString%]: %myStrLen%

--Auch nicht getestet--

Grüße
Biber
77559
77559 30.04.2009 um 18:21:14 Uhr
Goto Top
Zitat von @mycroftone:
Kann mir Trotzdem jemand sagen wie ich die Zeichen in einer Zeile Zähle
::CharCount.cmd
@echo off
set "Zeile=was auch immer du willst"  
call :len CharCount "%Zeile%"  
echo %CharCount% Zeichn in "%Zeile%"  
echo (ohne Anführungszeichen)
goto :eof
:len RetVal(byRef) Value(Byval)
setlocal
set cnt=0
set "chk=%~2"  
:len_loop
if not "%chk%"=="" Set /A cnt+=1 & set "chk=%chk:~1%" & goto :len_loop  
endlocal&set /A "%1=%cnt%"&goto :eof  

HTH
mycroftone
mycroftone 06.05.2009 um 19:12:43 Uhr
Goto Top
Hi Lotpings

Sorry das ich mich erste jetzt melde aber irgendwie funktioniert dein Script noch nicht so richtig.
Nur was mach ich falsch? Habe jetzt folgende Batch Datei erstellt.

  1. @echo off & setlocal EnableDelayedExpansion
  2. set Datum=2009-04-07
  3. for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do set /A "Jahr=%%A,Monat=%%B,Tag=%%C"
  4. if Defined Jahr if %Jahr% GEQ 1980 if %Jahr% LEQ 2100^
  5. if Defined Monat if %Monat% GEQ 1 if %Monat% LEQ 12^
  6. if Defined Tag if %Tag% GEQ 1 if %Tag% LEQ 31
  7. goto :weiter
  8. echo Ungültiges Datum: %Datum%
  9. pause
  10. exit
  11. :weiter
  12. echo gültiges Datum: %Datum%
  13. pause
  14. exit

  • Wenn ich ein gültiges Datum angebe

kommt bei dem if Defined ein Syntaktfehler

  • Wenn ich ein ungültige Datum eingebe.

Kommt bei ~009_04_07

Ungültige Zahl. Numerische Konstanten sind entweder dezimale (17),
hexadezimale (0x11) oder oktale (021) Zahlen.
und dann Syntaktfehler

Und bei -~-2,2
Fehlender Operand
und dann Syntaktfehler


Kannst du oder jemand anders mir sagen was da Falsch läuft.
77559
77559 06.05.2009 um 19:38:19 Uhr
Goto Top
Hallo,

du musst das ja auch korrekt übertragen am Besten Über dem Codeteil auf Quelltext klicken und alles markieren/kopieren.

Die Zeile 7 goto :weiter gehört ans Ende deiner Zeile 6 so wie es auch von mir gepostet wurde.
Die Zeilen 4, 5 und 6 (+7) sind eigentlich eine einzige Zeile, der Übersicht halber habe ich die mit Hilfe des ^ am Emde umgebrochen ohne das sie logisch getrennt sind.
Nur wenn wirklich alle if Bedingungen erfüllt sind geht es Weiter, Durch dein Trennen geht es in jedem Fall weiter und da dem letzten IF der Then Teil fehlt gibt es einen Fehler.

Und wenn du im Editorfenster bist sieh dir bitte den roten Link Formatierungshilfe an.
Dann kann man deinen Text auch besser lesen wenn code eben mit
< code> und
< /code> markiert wird (dann ohne Leerzeichen hinter dem < )

Gruß
LotPings
mycroftone
mycroftone 08.05.2009 um 00:22:26 Uhr
Goto Top
Hallo LotPings

Dannke für den Hinweis auch im Umgange mit dem Forum hier

Habe jetzt folgende Batchdatei

 
@echo off & setlocal EnableDelayedExpansion

Call :Check_Datum 2009-04-29
Call :Check_Datum -~-2,2-

exit

:Check_Datum

set "Datum=%1"  
echo.
echo Teste
echo.
for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do set /A "Jahr=%%A,Monat=%%B,Tag=%%C"  
If Defined Jahr if %Jahr% GEQ 1980 if %Jahr% LEQ 2100 if Defined Monat if %Monat% GEQ 1 if %Monat% LEQ 12 if Defined Tag if %Tag% GEQ 1 if %Tag% LEQ 31 goto :weiter 

echo.
echo Ungueltiges Datum: %Datum% 
echo.
echo.
pause

:EOF

:weiter
echo.
echo gueltige Datum: %Datum%
echo.
echo.
pause
:EOF


Also Ausgabe habe ich dann


Teste


gueltige Datum: 2009-04-29


Drücken Sie eine beliebige Taste . . .

Teste

Fehlender Operand

gueltige Datum: -~-2


Drücken Sie eine beliebige Taste . . .


Was ja so auch nicht ganz richtig sein kann.
Es kommt eine Fehlermedlung und dann wird natürlich auch noch Falsch bewertet.

Also kannst du mir nochmal helfen . Ich hoffe ich habe es jetzt Besser Formatiert.
Biber
Biber 08.05.2009 um 09:37:07 Uhr
Goto Top
Moin mycroftone,

falls Lotpings noch beim Frühstücken ist:
@echo off & setlocal EnableDelayedExpansion

Call :Check_Datum 2009-04-29
Call :Check_Datum -~-2,2-
goto :eof
:: ~~~ hier ist Ende Vom Batch

:Check_Datum

set "Datum=%1"  
echo.
echo Teste
echo.
for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do (  
   if "%%C" NEQ "" IF "%%B" NEQ "" (  
   if %%A GEQ 1980 if %%A LEQ 2100 (
     if %%B GEQ 1 if %%B LEQ 12 (
       if %%C GEQ 1 if %%C LEQ 31 (
           set /A "Jahr=%%A,Monat=%%B,Tag=%%C"  
           goto :weiter 
)))))
echo.
echo Ungueltiges Datum: %Datum% 
echo.
echo.
pause

goto :EOF
:: ~~~ hier ist Ende von Sub :CheckDatum --GOBACK

:weiter
echo.
echo gueltige Datum: %Datum%
echo.
echo.
pause
:: ~~~ hier ist Ende der BatchDATEI..hier ist Feierabend

Die Zeile [ set /A "Jahr=%%A,Monat=%%B,Tag=%%C" ] ist natürlich in DIESEM Testschnipsel obsolet und wäre nur sinnvoll in einem Batch, der nach Datumsüberprüfung mit %Jahr%, %Monat%, %Tag% irgendetwas weiterarbeiten soll.

Grüße
Biber
mycroftone
mycroftone 08.05.2009 um 16:24:33 Uhr
Goto Top
Hallo Biber

Besten Dank.

Die Genaue Datumsprüfung von Lostping die du etwas getuned hast funktioniert jetzt wunderbar.
Also danke Lostping und Biber


Jetzt habe ich aber auch noch wie der Titel verrät die Prüfung der Anzahl Zeichen mit eingebaut .

Die funktioniert auch aber leider nur das erste mal und dann wird der Wert immer wieder übernommen.
Also meine Versuche den Wert an anfang auf 0 zu setzten damit der Varaiblenwert dann neu befühlt wird wahren erfolglos
da dann z.b. der Wert gar nicht mehr ermittelt wird.

 
@echo off & setlocal EnableDelayedExpansion 
Call :Check_Datum 2009-04-29 
Call :Check_Datum -+2-
Call :Check_Datum +edr-5i-## 

echo.
echo.
echo.
echo ende aller Pruefugen
echo.
pause

:: ~~~ hier ist Ende der BatchDATEI..hier ist Feierabend
exit 


:: ~~~ hier ist Ende Vom Batch 
:Check_Datum 
set "Datum=%1"   


echo. 
echo.
echo.
echo.
echo =============
echo.
echo  einfache Pruefung auf Laenge
echo. 
echo.

set "WorstCaseLen=100"   
For /L %%i in (%WorstCaseLen%,-1,1) do ( 
    if not defined myStrLen if "!Datum:~%%i,1!" NEQ "" Set /a myStrLen=1+%%i   
) 

echo Stringlen [%Datum%]: %myStrLen%

if %myStrLen% NEQ 10 goto datum-ungueltig

echo.
echo.
echo =============
echo.
echo  genaue Pruefung auf Korrektes Datum
echo. 
echo.

for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do (   
   if "%%C" NEQ "" IF "%%B" NEQ "" (   
   if %%A GEQ 1980 if %%A LEQ 2100 ( 
     if %%B GEQ 1 if %%B LEQ 12 ( 
       if %%C GEQ 1 if %%C LEQ 31 ( 
         goto :datum-gueltig  
))))) 

:datum-ungueltig 

echo. 
echo Ungueltiges Datum: %Datum%  
echo. 
echo. 

pause 
goto :EOF 
:: ~~~ hier ist Ende von Sub :CheckDatum --GOBACK 

:datum-gueltig 

echo. 
echo gueltige Datum: %Datum% 
echo. 
echo. 

pause 
goto :EOF 
:: ~~~ hier ist Ende von Sub :CheckDatum --GOBACK 

Also Output bekommen ich dann folgendes


=============

einfache Pruefung auf Laenge


Stringlen [2009-04-29]: 10



genaue Pruefung auf Korrektes Datum


gueltige Datum: 2009-04-29


Drücken Sie eine beliebige Taste . . .



einfache Pruefung auf Laenge


Stringlen [-+2-]: 10



genaue Pruefung auf Korrektes Datum


Ungueltiges Datum: -+2-


Drücken Sie eine beliebige Taste . . .



einfache Pruefung auf Laenge


Stringlen [+edr-5i-##]: 10



genaue Pruefung auf Korrektes Datum


Ungueltiges Datum: +edr-5i-##


Drücken Sie eine beliebige Taste . . .


ende aller Pruefugen

Drücken Sie eine beliebige Taste . . .



Also was läuft hier verquer. könntest du mir hier auch noch helfen.

Besten dank im voraus
bastla
bastla 08.05.2009 um 16:52:00 Uhr
Goto Top
Hallo mycroftone!
Also meine Versuche den Wert an anfang auf 0 zu setzten damit der Varaiblenwert dann neu befühlt wird wahren erfolglos
Damit Du vom Variablenwert wirklich nichts mehr spürst face-wink, füge als Zeile 21 ein:
set "myStrLen="
Grüße
bastla
77559
77559 08.05.2009 um 16:53:03 Uhr
Goto Top
Setz mal auf Zeile 21:
Set "myStrLen="

Wenn da noch ein alter Wert drin steht, prüft er in der For /L Schleife gar nicht mehr.
( Das ist übrigens ein guter Grund Sub Routinen mit einem setlocal auszustatten, was aber eine Initialisierung wichtiger Variablen auch nicht ersetzt.)

Gruß
LotPings

Edit: Hallo Bastla, bin nicht so früh aufgestanden und anscheinend immer noch im TRAN-modus.
mycroftone
mycroftone 08.05.2009 um 17:06:49 Uhr
Goto Top
Ja zusammen

Ja danke jetzt funktioniert es ;-(

Ich habe es mit Set myStrLen=0 versucht habe dann aber auch gemerkt das er wegen dem not defined gar nicht mehr in die Schleife geht. Auf die Ide mit dem "myStrLen=" bin ich in dem Moment gar nicht gekommen.


Also nochmal danke an alle beteiligten