Использование переменной подстроки с переменными пропущенными символами

У меня есть этот фрагмент кода, где строка, которую я хочу это прочитать thisisaname:21841569874215468432 Дело в том, что часть перед двоеточием является переменной. Изменяет длину в зависимости от ввода пользователя. Итак, я нашел функцию для получения длины строки и функцию для получения количества символов перед двоеточием. Следующий шаг в моем плане - пропустить thisisaname: на первый номер в этой последовательности и запишите его. Часть кода, которая должна сделать это, SET PH1=!PH:~%len%,1! где он пропускает длину имени и двоеточия для записи первой переменной. Это где моя проблема возникает. Он всегда получает первую букву строки, а не число после двоеточия. Казалось бы, переменная, отслеживающая длину символа, не читается правильно, когда я выполняю поиск по подстроке. Я также хочу использовать длину для других поисков подстроки, поэтому вы видите len переменная в последующем для циклов, а также. Вот код, на который я ссылаюсь:

@ECHO off
SETLOCAL EnableDelayedExpansion
SET count=0
FOR /F %%a IN ('FINDSTR /C:":" saves.txt') DO (
    SET /a count=!count!+1
    SET PH=%%a
    ECHO !PH!
    FOR /f "delims=:" %%b IN ("!PH!") DO SET part=%%b
    ECHO !part!
    CALL :strLen len part
    ECHO !len!
    SET /A len=!len!+1
    ECHO !len!
    SET PH1=!PH:~%len%,1!
    ECHO !PH1!
    SET /A len=!len!+4
    ECHO !len!
    FOR /F "delims=" %%d IN ("!PH1!") do SET money=!PH:~%len%,%%d!
    SET PH2=!PH:~11,1!
    FOR /F "delims=" %%e IN ("!PH2!") do SET EXP=!PH:~12,%%e!
    ECHO ^|Save !count!: Money = !money! EXP = !EXP!
)
PAUSE
:strLen <resultVar> <stringVar>
(   
    SET "s=!%~2!#"
    SET "len=0"
    FOR %%P IN (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) DO (
        IF "!s:~%%P,1!" NEQ "" ( 
            SET /a "len+=%%P"
            SET "s=!s:~%%P!"
        )
    )
)
( 
    SET "%~1=%len%"
    EXIT /b
)

Я знаю, что это может показаться немного запутанным относительно того, почему я делаю это, поэтому я рад что-нибудь прояснить! Все помогает, и любые советы тоже! Спасибо!

РЕДАКТИРОВАТЬ Добавление токена и разделителя в первый цикл for значительно упрощает этот процесс, поскольку он разбивает строку на две части.

FOR /F "tokens=1* delims=:" %%a IN ('FINDSTR /C:":" saves.txt') DO (

Это делает так, что многие проблемы, которые возникают в исходном коде, даже не присутствуют. Мне все еще любопытно, почему оригинальный фрагмент не работает, поэтому я оставлю эту часть.

1 ответ

Как вы уже знаете, вы можете использовать for /f цикл, чтобы разделить вашу строку:

set "var=thisisaname:21841569874215468432"
for /f "tokens=1,2 delims=:" %%a in ("%var%") do 
  set "first=%%a"
  set "last=%%b"
)

или, если вам не нужна первая часть, вы можете использовать подстроку с подстановочным знаком:

set "var=thisisaname:21841569874215468432"
set "var=%var:*:=%
echo %var%

(Помните: внутри блока кода вы должны заменить %var% с !var!)

Примечание. Замена подстановочных знаков работает только для удаления / замены первой части до (включая) заданной строки. Удаление или замена другой детали невозможна с подстановочными знаками (*)

Другие вопросы по тегам