我需要提取文件的日期,然后使用此字符串作为新文件名称的一部分。我尝试使用以下命令来解决这个问题:
首先,我获取文件的详细信息并将输出重定向到临时文件。
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