批量提取变量的一部分

时间:2015-02-25 20:51:42

标签: variables batch-file extract

@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命令使用以下语法:

 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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

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

一种解决方案是将call set var=!var:~!len!,6!移动到子程序以按摩并返回varSee this function tutorial page例如。

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

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