1

我有这段代码,我希望它读取的字符串thisisaname:21841569874215468432是冒号之前的部分是可变的。它根据用户输入更改长度。所以我找到了一个获取字符串长度的函数和一个获取冒号前字符数的函数。我计划的下一步是跳过thisisaname:该序列中的第一个数字并记录它。应该执行此操作的代码位是,SET PH1=!PH:~%len%,1!它跳过名称的长度和冒号来记录第一个变量。这就是我的问题出现的地方。它总是获取字符串的第一个字母,而不是冒号后面的数字。当我进行子字符串搜索时,似乎没有正确读取跟踪字符长度的变量。我还想将长度用于其他子字符串搜索,这就是您看到len后面的 for 循环中的变量也是如此。这是我所指的代码:

@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 (

这使得原始代码中出现的很多问题甚至都不存在。我仍然很好奇为什么原始片段不起作用,所以我将保留那部分。

4

1 回答 1

0

如您所知,您可以使用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!

注意:通配符替换仅适用于删除/替换第一部分,直到(包括)给定字符串。无法使用通配符 ( *)移除或替换其他部件

于 2018-07-07T07:30:35.527 回答