如何将表达式的结果设置为变量

如何将表达式的结果设置为变量

我需要提取文件的日期,然后使用此字符串作为新文件名称的一部分。我尝试使用以下命令来解决这个问题:

首先,我获取文件的详细信息并将输出重定向到临时文件。

DIR c:/myfolder/thefile.txt >> tmp.txt

然后我使用 FINDSTR 来获取包含日期的行,如果存在一种方法来仅获取我没有找到的日期:

FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

输出为:

10/04/2012 07:55 66,029 thefile.txt

现在我想将这个结果设置为一个变量:

SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

看来它起作用了,因为当我输入 %vartmp% 时返回结果:

10/04/2012 07:55 66,029 thefile.txt

但是当我尝试提取 vartmp 的一部分时,问题开始出现:

ECHO %vartmp:~0,2%

当我预期“10”时,它返回了字符串“FI”,似乎 vartmp 保存的是表达式而不是表达式的结果,我尝试将表达式的结果分配给另一个 tempvar,然后提取 tempvar 的子字符串,但什么都没有改变。

答案1

FOR 命令可用于将一行分割成多个标记,这样您就可以只抓取所需的部分。使用 /f,您可以在其他命令的输出上运行它,在本例中,DIR 的输出经过了 FIND 的过滤。

for /f "tokens=1" %%a in ('dir thefile.txt ^| Find "thefile.txt"') do (
set vartmp=%%a
)

答案2

这不是理想的,但可以SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt改为

FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt > tmp2.txt
SET /p vartmp =< tmp2.txt
DEL tmp2.txt

答案3

按照你的例子,我发现了相同的结果,但是如果我替换该行:

SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

for /f %i in ('FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt') do set vartmp=%i

然后 vartmp 会保存您要查找的内容。请注意,您需要使用单引号,双引号不起作用。此外,如果在批处理文件中使用,您需要使用 %%i 代替 %i

相关内容