Использование переменной подстроки с переменными пропущенными символами
У меня есть этот фрагмент кода, где строка, которую я хочу это прочитать 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!
)
Примечание. Замена подстановочных знаков работает только для удаления / замены первой части до (включая) заданной строки. Удаление или замена другой детали невозможна с подстановочными знаками (*
)