Wie kann man in Batch die Position eines bestimmten Zeichens in einer Variable auslesen?

1 Antwort

Batch kann nur sehr umständlich mit Strings umgehen. (dafür wurde es einfach nicht entwickelt.)

aber es ist möglich:

pureBatchDemo.cmd

@echo off
set "str=Ich bin    ein .String"


set "PointPos=0"
 rem string am ersten Punkt teilen und Länge des 1. Token  +1 ermitteln
for /f "tokens=1* delims=." %%a in ("%str%") do (
    if "%%~a" neq "%str%" (
        for /f "skip=1 delims=:" %%p in ('^(echo:"%%~a"^&echo:^)^|findstr /o "$"') do  set /a "PointPos=%%p-4"
    )    
)
if  %PointPos% gtr 0 (
    echo der erste Punkt in "%str%" ist das %PointPos%. Zeichen
) else (echo Kein Punkt in "%str%" enthalten)


pause

Ich gehe nicht weiter auf den Quatsch ein das ganze sollte für Deine Zwecke genügen.

Es gibt auch andere Tricksereien um das zu erledigen diese ist erfahrungsgemäß jedoch am sichersten und effizientesten (in Puem Batch). (Batch reagiert extrem Empfindlich auf bestimmte Zeichen.)

Wenn ich Dir einen einen Guten Rat geben kann, vergiss das Gefummel mit Batch. (Es sei denn, Du hast Spaß am Wahnsinn dieser Sprache)

Wir leben im Jahr 2023 und benutzen Powershell. da sieht die ganze Sache folgendermaßen aus:

demo.ps1

$str='Ich bin    ein. String'
$PointPos=$str.IndexOf('.')+1
Write-Host "Der Punkt ist das $PointPos. Zeichen in: ""$str"""

natürlich kann man Teile letzteren Scripts auch als Powershell Einzeiler in einer Batch verwenden:

demo.cmd

@echo off
set "str=Ich bin. ein String"
for /f %%p in ('powershell "'%str%'.IndexOf('.')+1"') do set /a "PointPos=%%p"
if %PointPos% gtr 0 (
  echo der erste Punkt in "%str%" ist das %PointPos%. Zeichen
) else (echo Kein Punkt in "%str%" enthalten)
pause

aber weshalb dann nicht gleich alles in Powershell erledigen?

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Simon18066 
Fragesteller
 16.04.2023, 18:44

Danke! Das Powershell Script hat Perfekt funktioniert für meine Zwecke. Ich denke es ist wirklich schlauer, das ganze in Powershell zu machen, vor allem da Powershell sowieso Batch Befehle annimmt.

0