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

Anzahl Zeichen einer Variable zählen

Frage Entwicklung Batch & Shell

Mitglied: mycroftone

mycroftone (Level 1) - Jetzt verbinden

30.04.2009, aktualisiert 10.06.2009, 11932 Aufrufe, 13 Kommentare

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.
Mitglied: LotPings
30.04.2009 um 17:38 Uhr
Hallo,

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

01.
::Befehl.cmd 
02.
@echo off&setlocal 
03.
set "Datum=%1" 
04.
for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do set /A "Jahr=%%A,Monat=%%B,Tag=%%C" 
05.
If Defined Jahr  if %Jahr%  GEQ 1980 if %Jahr%  LEQ 2100^ 
06.
if Defined Monat if %Monat% GEQ 1    if %Monat% LEQ 12^ 
07.
if Defined Tag   if %Tag%   GEQ 1    if %Tag%   LEQ 31 goto :weiter 
08.
echo Ungültiges Datum: %Datum% 
09.
goto :eof 
10.
: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
Bitte warten ..
Mitglied: mycroftone
30.04.2009 um 17:49 Uhr
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
Bitte warten ..
Mitglied: Biber
30.04.2009 um 17:56 Uhr
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:
01.
>set testdate=-~-2,2- 
02.
>if "%testdate:~7,3%"=="" echo leer 
03.
leer 
04.
>if "%testdate:~6,3%"=="" echo leer
Wenn Du also vorrangig diese fehlerhaften 7stelligen Datums-Werte abfangen willst--> prüfe es so.

Grüße
Biber
Bitte warten ..
Mitglied: Biber
30.04.2009 um 18:11 Uhr
... 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
01.
@echo off & setlocal EnableDelayedExpansion 
02.
 
03.
:: Pessimistisch: der String könnte ja 100 Zeichen lang sein 
04.
set "WorstCaseLen=100" 
05.
set "DerTestString=irgendein Text" 
06.
 
07.
For /L %%i in (%WorstCaseLen%,-1,1) do ( 
08.
      if not defined myStrLen if "!DerTestString:~%%i,1!" NEQ "" Set /a myStrLen=1+%%i 
09.
10.
echo Stringlen [%DerTestString%]: %myStrLen%
--Auch nicht getestet--

Grüße
Biber
Bitte warten ..
Mitglied: LotPings
30.04.2009 um 18:21 Uhr
Zitat von mycroftone:
Kann mir Trotzdem jemand sagen wie ich die Zeichen in einer Zeile Zähle
01.
::CharCount.cmd 
02.
@echo off 
03.
set "Zeile=was auch immer du willst" 
04.
call :len CharCount "%Zeile%" 
05.
echo %CharCount% Zeichn in "%Zeile%" 
06.
echo (ohne Anführungszeichen) 
07.
goto :eof 
08.
:len RetVal(byRef) Value(Byval) 
09.
setlocal 
10.
set cnt=0 
11.
set "chk=%~2" 
12.
:len_loop 
13.
if not "%chk%"=="" Set /A cnt+=1 & set "chk=%chk:~1%" & goto :len_loop 
14.
endlocal&set /A "%1=%cnt%"&goto :eof
HTH
Bitte warten ..
Mitglied: mycroftone
06.05.2009 um 19:12 Uhr
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.
Bitte warten ..
Mitglied: LotPings
06.05.2009 um 19:38 Uhr
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
Bitte warten ..
Mitglied: mycroftone
08.05.2009 um 00:22 Uhr
Hallo LotPings

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

Habe jetzt folgende Batchdatei

01.
  
02.
@echo off & setlocal EnableDelayedExpansion 
03.
 
04.
Call :Check_Datum 2009-04-29 
05.
Call :Check_Datum -~-2,2- 
06.
 
07.
exit 
08.
 
09.
:Check_Datum 
10.
 
11.
set "Datum=%1" 
12.
echo. 
13.
echo Teste 
14.
echo. 
15.
for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do set /A "Jahr=%%A,Monat=%%B,Tag=%%C" 
16.
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  
17.
 
18.
echo. 
19.
echo Ungueltiges Datum: %Datum%  
20.
echo. 
21.
echo. 
22.
pause 
23.
 
24.
:EOF 
25.
 
26.
:weiter 
27.
echo. 
28.
echo gueltige Datum: %Datum% 
29.
echo. 
30.
echo. 
31.
pause 
32.
: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.
Bitte warten ..
Mitglied: Biber
08.05.2009 um 09:37 Uhr
Moin mycroftone,

falls Lotpings noch beim Frühstücken ist:
01.
@echo off & setlocal EnableDelayedExpansion 
02.
 
03.
Call :Check_Datum 2009-04-29 
04.
Call :Check_Datum -~-2,2- 
05.
goto :eof 
06.
:: ~~~ hier ist Ende Vom Batch 
07.
 
08.
:Check_Datum 
09.
 
10.
set "Datum=%1" 
11.
echo. 
12.
echo Teste 
13.
echo. 
14.
for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do ( 
15.
   if "%%C" NEQ "" IF "%%B" NEQ "" ( 
16.
   if %%A GEQ 1980 if %%A LEQ 2100 ( 
17.
     if %%B GEQ 1 if %%B LEQ 12 ( 
18.
       if %%C GEQ 1 if %%C LEQ 31 ( 
19.
           set /A "Jahr=%%A,Monat=%%B,Tag=%%C" 
20.
           goto :weiter  
21.
))))) 
22.
echo. 
23.
echo Ungueltiges Datum: %Datum%  
24.
echo. 
25.
echo. 
26.
pause 
27.
 
28.
goto :EOF 
29.
:: ~~~ hier ist Ende von Sub :CheckDatum --GOBACK 
30.
 
31.
:weiter 
32.
echo. 
33.
echo gueltige Datum: %Datum% 
34.
echo. 
35.
echo. 
36.
pause 
37.
:: ~~~ 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
Bitte warten ..
Mitglied: mycroftone
08.05.2009 um 16:24 Uhr
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.

01.
  
02.
@echo off & setlocal EnableDelayedExpansion  
03.
Call :Check_Datum 2009-04-29  
04.
Call :Check_Datum -+2- 
05.
Call :Check_Datum +edr-5i-##  
06.
 
07.
echo. 
08.
echo. 
09.
echo. 
10.
echo ende aller Pruefugen 
11.
echo. 
12.
pause 
13.
 
14.
:: ~~~ hier ist Ende der BatchDATEI..hier ist Feierabend 
15.
exit  
16.
 
17.
 
18.
:: ~~~ hier ist Ende Vom Batch  
19.
:Check_Datum  
20.
set "Datum=%1"  
21.
 
22.
 
23.
echo.  
24.
echo. 
25.
echo. 
26.
echo. 
27.
echo ============= 
28.
echo. 
29.
echo  einfache Pruefung auf Laenge 
30.
echo.  
31.
echo. 
32.
 
33.
set "WorstCaseLen=100"  
34.
For /L %%i in (%WorstCaseLen%,-1,1) do (  
35.
    if not defined myStrLen if "!Datum:~%%i,1!" NEQ "" Set /a myStrLen=1+%%i  
36.
)  
37.
 
38.
echo Stringlen [%Datum%]: %myStrLen% 
39.
 
40.
if %myStrLen% NEQ 10 goto datum-ungueltig 
41.
 
42.
echo. 
43.
echo. 
44.
echo ============= 
45.
echo. 
46.
echo  genaue Pruefung auf Korrektes Datum 
47.
echo.  
48.
echo. 
49.
 
50.
for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do (  
51.
   if "%%C" NEQ "" IF "%%B" NEQ "" (  
52.
   if %%A GEQ 1980 if %%A LEQ 2100 (  
53.
     if %%B GEQ 1 if %%B LEQ 12 (  
54.
       if %%C GEQ 1 if %%C LEQ 31 (  
55.
         goto :datum-gueltig   
56.
)))))  
57.
 
58.
:datum-ungueltig  
59.
 
60.
echo.  
61.
echo Ungueltiges Datum: %Datum%   
62.
echo.  
63.
echo.  
64.
 
65.
pause  
66.
goto :EOF  
67.
:: ~~~ hier ist Ende von Sub :CheckDatum --GOBACK  
68.
 
69.
:datum-gueltig  
70.
 
71.
echo.  
72.
echo gueltige Datum: %Datum%  
73.
echo.  
74.
echo.  
75.
 
76.
pause  
77.
goto :EOF  
78.
:: ~~~ 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
Bitte warten ..
Mitglied: bastla
08.05.2009 um 16:52 Uhr
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 , füge als Zeile 21 ein:
set "myStrLen="
Grüße
bastla
Bitte warten ..
Mitglied: LotPings
08.05.2009 um 16:53 Uhr
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.
Bitte warten ..
Mitglied: mycroftone
08.05.2009 um 17:06 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Microsoft Office
gelöst Excel Formeln - Zählen der Anzahl eindeutiger Zellwerte mit einer Nebenbedingung (4)

Frage von Booster07 zum Thema Microsoft Office ...

Batch & Shell
gelöst In Batch variable DOS-Funktion von "größer" und "kleiner" Zeichen unterdrücken (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Variable auf 5 Zeichen begrenzen (5)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (32)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...