将可变子字符串与可变跳过字符一起使用

时间:2018-07-06 19:52:02

标签: batch-file for-loop delayedvariableexpansion

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

答案 0 :(得分: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!

注意:通配符替换仅可删除/替换 first 部分,直到(包括)给定的字符串为止。通配符(*)不能删除或替换其他部分