【发布时间】:2019-12-06 13:27:27
【问题描述】:
我有一个包含文件名规范的文本文件,格式如下,filename-yyyymmdd
source.txt
IMG-20190601
IMG-20190602
IMG-20190603
...
我想阅读此文件,以便将日期与参考日期进行比较,并根据结果执行一些操作。 IMG 总是一样的,只是日期在变。
为此,我试图在我正在阅读的每一行中找到文件名日期,以便与今天进行比较。
我没有成功找到正确的语法,我发现提取子字符串可以用
set SUBSTRING=%VAR:~POSITION,SIZE%
但它不适用于%%variable 类型。
欢迎任何帮助。
我的代码:
set comparedate=20190702
set /A i=0
for /F "usebackq delims=" %%a in (source.txt) do (
set /A i+=1
rem call echo %%i%%
rem call echo %%a
set datefile=%%a:~4,8 # the line that is not working
if %datefile% geq %comparedate% (goto here) else (goto there)
:here
echo do something
:there
echo do something else
)
【问题讨论】:
-
but it is not working with %% variable type.。是的,这是正确的(按设计)。您需要先将%%x变量转换为“正常”%var%变量,然后才能进行子字符串处理。当然,您需要delayed expansion (!var:~4,8!) 才能使其在代码块中工作。 -
您能看出
%VAR:~POSITION,SIZE%和%%a:~4,8之间的区别吗?它们都是不同类型的变量,但只能扩展和修改其中的一个。您需要先将后者变为前者,即Set "VAR=%%a"。我还强烈建议您在尝试修改和使用代码块中的变量内容之前启用延迟扩展。 -
请告诉我们
source.txt的实际格式。按照现在的情况,:~4,8将提取字符串filename -
循环中的任何
goto都会中断循环(例如,它只会处理第一行)。使用call而不是goto避免这种情况。并将您的标签(子程序)放在循环之外。 -
感谢两位的回答。它通过使用带有双引号的 set "VAR=%%a" 来工作。没有它是行不通的。最好的:)
标签: string windows batch-file compare