批量提取部分变量
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 var
。 See this function tutorial page 例如。
然而,在这种情况下,使用另一个 for
循环将 !len!
转换为 %%n
符号可能更容易。
for %%N in (!len!) do set "var=!var:~%%N,6!"
@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 var
。 See this function tutorial page 例如。
然而,在这种情况下,使用另一个 for
循环将 !len!
转换为 %%n
符号可能更容易。
for %%N in (!len!) do set "var=!var:~%%N,6!"