Batch Buchstaben in einer Variable zählen?

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


Huhngut 
Beitragsersteller
 06.04.2018, 18:26

Danke

Huhngut 
Beitragsersteller
 06.04.2018, 18:25

Danke

Erzesel  10.04.2018, 21:18

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...


Roderic  06.04.2018, 18:20

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.

;-)

timlg07  06.04.2018, 18:29
@Roderic

Danke ;) aber was meinst du mit "von hinten durch die Brust ins Auge-Code"?

Das wirst du mit der eingeschränkten Auswahl an DOS Kommandos nicht hinkriegen.


timlg07  06.04.2018, 18:05

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.)

Huhngut 
Beitragsersteller
 05.04.2018, 11:11

Schade aber trotzdem danke