批量提取部分变量

Extract part of a variable in batch

@echo off

setlocal enabledelayedexpansion

for /f "tokens=* delims=" %%g in (list.txt) do (
    set var=%%g
    set var=!var: =*!
    dir /b "!var!*.txt" > log.txt
    echo !var! > tempfile.txt
    for %%? in (tempfile.txt) do ( 
        set /A len=%%~z? - 2 
    )

    for /f "tokens=* delims=" %%g in (log.txt) do (
        set var=%%g
        echo.!var!
        echo.!len!
        call set var=!var:~!len!,6!
        echo.!var!
        pause
    )   
)

此代码的第一个 for 循环从 "list.txt" 中读取一行文本 此文件包含许多行,这些行具有可变数量的字符,如下所示:

 Check This File
 Check That Doc

然后,对于每一行,它用通配符替换空格并搜索目录并创建一个临时文本文件,其中包含以该行开头的所有文件名。它还计算线的长度。他目录中的每个文件名将是这样的:

 Check.This.File.T01R45.foo.txt
 Check.This.File.T01R46.foo.txt

最后一个 for 循环逐行读取临时文本文件并尝试删除所有字符,以便仅存在以下字符:

 T01R45
 T01R45

我正在尝试对设置命令使用以下语法:

 set var=%var:~num_chars_to_skip,num_chars_to_keep%

 num_chars_to_skip=variable set by counting characters from "list.txt"

我的代码第 16 行出现问题:

 set var=!var:~!len!,6!

语法要求 num_chars_to_skip 的值不是变量,因此失败。我希望在倒数第二个陈述中看到以下内容:

 echo.!var! should show:     T01R45

 where it actually shows:    Check.This.File.T01R45.foo.txtlen

有什么建议吗?

您不能以这种方式将延迟扩展变量嵌套在另一个延迟扩展变量中。 cmd 解释器正在尝试检索名为 !var:~! 的变量的值,然后是文字字符串 len,然后是名为 !,6!.

的变量

要使用 len!var! 中提取子字符串,您必须以百分比样式调用 len。理想的解决方案是使用 !var:~%len%,6!。但是由于 len 是在同一个带括号的代码块中定义的,所以有点棘手。

一种解决方案是将call set var=!var:~!len!,6!移动到一个子程序中进行按摩和return varSee this function tutorial page 例如。

然而,在这种情况下,使用另一个 for 循环将 !len! 转换为 %%n 符号可能更容易。

for %%N in (!len!) do set "var=!var:~%%N,6!"