@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
有什么建议吗?
答案 0 :(得分:0)
你不能将延迟扩展变量嵌套在另一个延迟扩展变量中。 cmd解释器正在尝试检索名为!var:~!
的变量的值,然后检索文字字符串len
,然后检索名为!,6!
的变量。
要使用len
从!var!
中提取子字符串,您必须以百分比样式调用len
。理想的解决方案是使用!var:~%len%,6!
。但是,因为len
在相同的括号代码块中定义,所以有点棘手。
一种解决方案是将call set var=!var:~!len!,6!
移动到子程序以按摩并返回var
。 See this function tutorial page例如。
但是,在这种情况下,将!len!
转换为%%n
符号与另一个for
循环可能更容易。
for %%N in (!len!) do set "var=!var:~%%N,6!"