Batch Buchstaben in einer Variable zählen?
Hallo liebe Community,
mein Problem ist, dass das Programm statt %frage% die Anzahl an Zeichen in der Variable text ausgeben soll. bsp :text=Hallo Welt nun wäre %frage%=10 (9buchstaben,1Leerzeichen)
set /p text=?
echo %frage%
2 Antworten
Hier als kleiner loop, der dir die Länge in der Variable len ausrechnet:
@echo off & setlocal enableDelayedExpansion
set /p "text=Text: >"
:Loop
if "!text:~%len%!" neq "" set /a len+=1 & goto Loop
echo %len%
pause >nul
Und hier als wiederverwendbare Funktion:
@echo off & setlocal enableDelayedExpansion
set /p "text=Text: >"
call :length text
echo %text.length%
pause
exit
:length (variable<string> %1)
set /a tmp=0
:while_length
if "!%~1:~%tmp%!" neq "" set /a tmp+=1 & goto while_length
set /a "%~1.length=tmp"
exit /b !%~1.length!
Die Spielerei mit Variablenname.length hat dann doch mehr Zeilen gekostet als gedacht, da man diese nicht direkt in der if-Abfrage benutzen kann (batch müsste die Zeile dazu 3 mal auswerten), darum auch die temporäre Variable.
~Tim
man kann die Stringlänge aber auch ganz klassisch ermitteln:
...den String in eine Datei umleiten und deren Größe abfragen.
Die Datei ist unter Windows/Dos immer 3 Byte größer als der String!
Also Subtrahiert man 3 von der Dateigröße.
setlocal enabledelayedexpansion
set /p "text=Text: >"
rem variante on the fly :)
echo %text% >"%temp%\count.txt"
for %%a in ("%temp%\count.txt") do (
set /a "lenght=%%~za-3"
echo !lenght!
)
rem oder...
rem ...lass andere die Arbeit tun :p ,
rem mshta ist auf jedem Windowssystem vorhanden und beherrscht inline Commandozeile:
mshta "javascript:str='%text%';close(new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(str.length));" |more
der For loop ist lediglich ein Dummy um an die Filesize-Variable "%%~za" heranzukommen.
Heute in Zeiten von Festplatte mit großem Catch /und SSD dürfte diese Datei-Methode schneller sein als den variableninhalt Zeichen für Zeichen durchzuhächeln.
eine gute alterative ist auch instant-javascript mit mshta....
alle Wege führen nach Rom...
Das wirst du mit der eingeschränkten Auswahl an DOS Kommandos nicht hinkriegen.
Warum sollte man das nicht hinbekommen? Um Buchstaben zu zählen braucht man nur ne while Schleife (in Batch muss man diese halt in Schleife und separate if Abfrage aufteilen.)
Respekt!
Ich hab schon viel mit batch gemacht - richtig viel - auch so was in die Richtung. Das es doch geht, hätt ich nun nicht gedacht.
Ist aber ziemlicher "von hinten durch die Brust ins Auge"-Code.
;-)